diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml new file mode 100644 index 000000000..029aa318e --- /dev/null +++ b/.github/labeler-config.yml @@ -0,0 +1,20 @@ +translation: + - changed-files: + - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' + +Front End: + - changed-files: + - any-glob-to-any-file: 'src/main/resources/templates/**' + +java: + - changed-files: + - any-glob-to-any-file: 'src/main/java/**/*.java' + +documentation: + - changed-files: + - any-glob-to-any-file: '**/*.md' + +docker: + - changed-files: + - any-glob-to-any-file: 'Dockerfile' + - any-glob-to-any-file: 'Dockerfile-*' \ No newline at end of file diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 000000000..6ade1de4f --- /dev/null +++ b/.github/workflows/labeler.yml @@ -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 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 000000000..485eefb3f --- /dev/null +++ b/.github/workflows/stale.yml @@ -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 diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index ac1556cda..c93654605 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -7,7 +7,7 @@ on: paths: - "build.gradle" - "src/main/resources/messages_*.properties" - - "scripts/translation_status.toml" + - "scripts/ignore_translation.toml" permissions: contents: write @@ -17,9 +17,9 @@ jobs: sync-versions: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.1 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v5.1.0 + uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies @@ -36,7 +36,7 @@ jobs: git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions > Made via sync_files.yml" || echo "no changes" - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.1 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: Update files @@ -54,9 +54,9 @@ jobs: sync-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.1 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v5.1.0 + uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies @@ -73,7 +73,7 @@ jobs: git diff --staged --quiet || git commit -m ":memo: Sync README > Made via sync_files.yml" || echo "no changes" - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.1 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: Update files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e397fc5d6..45ce3639e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,9 +6,11 @@ repos: args: - --fix - --line-length=127 - files: ^((.github/scripts)/.+)?[^/]+\.py$ + files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$ + exclude: (split_photos.py) - id: ruff-format - files: ^((.github/scripts)/.+)?[^/]+\.py$ + files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$ + exclude: (split_photos.py) - repo: https://github.com/codespell-project/codespell rev: v2.2.6 hooks: @@ -33,5 +35,5 @@ repos: # args: ["--replace_with= "] entry: python .github/scripts/check_tabulator.py language: python - exclude: ^src/main/resources/static/pdfjs/ + exclude: ^(src/main/resources/static/pdfjs|src/main/resources/static/pdfjs-legacy) files: ^.*(\.html|\.css|\.js)$ diff --git a/DATABASE.md b/DATABASE.md new file mode 100644 index 000000000..efc1e467e --- /dev/null +++ b/DATABASE.md @@ -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. diff --git a/README.md b/README.md index dbaab9822..bd299541d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![Github Sponsor](https://img.shields.io/badge/Github%20Sponsor-yellow?style=flat&logo=github)](https://github.com/sponsors/Frooodle) [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) +[Name](https://www.ssdnodes.com/manage/aff.php?aff=2216®ister=true) This is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements. @@ -21,10 +22,11 @@ All files and PDFs exist either exclusively on the client side, reside in server ## Features - 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 - 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) +- Database Backup and Import (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DATABASE.md) for documentation) ## **PDF Features** @@ -82,7 +84,8 @@ All files and PDFs exist either exclusively on the client side, reside in server - Get all information on a PDF to view or export as JSON. 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 @@ -168,36 +171,36 @@ Stirling PDF currently supports 32! | ------------------------------------------- | -------------------------------------- | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| Arabic (العربية) (ar_AR) | ![46%](https://geps.dev/progress/46) | -| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | -| French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | -| Spanish (Español) (es_ES) | ![93%](https://geps.dev/progress/93) | -| Simplified Chinese (简体中文) (zh_CN) | ![94%](https://geps.dev/progress/94) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | -| Catalan (Català) (ca_CA) | ![49%](https://geps.dev/progress/49) | +| Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | +| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | +| French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | +| Spanish (Español) (es_ES) | ![92%](https://geps.dev/progress/92) | +| Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | +| Traditional Chinese (繁體中文) (zh_TW) | ![96%](https://geps.dev/progress/96) | +| Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Swedish (Svenska) (sv_SE) | ![40%](https://geps.dev/progress/40) | -| Polish (Polski) (pl_PL) | ![42%](https://geps.dev/progress/42) | +| Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | +| Polish (Polski) (pl_PL) | ![90%](https://geps.dev/progress/90) | | Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | -| Korean (한국어) (ko_KR) | ![86%](https://geps.dev/progress/86) | -| Portuguese Brazilian (Português) (pt_BR) | ![61%](https://geps.dev/progress/61) | -| Portuguese (Português) (pt_PT) | ![80%](https://geps.dev/progress/80) | -| Russian (Русский) (ru_RU) | ![86%](https://geps.dev/progress/86) | -| Basque (Euskara) (eu_ES) | ![63%](https://geps.dev/progress/63) | -| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | -| Dutch (Nederlands) (nl_NL) | ![83%](https://geps.dev/progress/83) | -| Greek (Ελληνικά) (el_GR) | ![84%](https://geps.dev/progress/84) | -| Turkish (Türkçe) (tr_TR) | ![96%](https://geps.dev/progress/96) | -| Indonesia (Bahasa Indonesia) (id_ID) | ![78%](https://geps.dev/progress/78) | -| Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) | -| Hungarian (Magyar) (hu_HU) | ![77%](https://geps.dev/progress/77) | -| Bulgarian (Български) (bg_BG) | ![96%](https://geps.dev/progress/96) | -| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![80%](https://geps.dev/progress/80) | -| Ukrainian (Українська) (uk_UA) | ![92%](https://geps.dev/progress/92) | -| Slovakian (Slovensky) (sk_SK) | ![93%](https://geps.dev/progress/93) | -| Czech (Česky) (cs_CZ) | ![92%](https://geps.dev/progress/92) | -| Croatian (Hrvatski) (hr_HR) | ![97%](https://geps.dev/progress/97) | -| Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | +| Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | +| Portuguese Brazilian (Português) (pt_BR) | ![60%](https://geps.dev/progress/60) | +| Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | +| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | +| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | +| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | +| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | +| Turkish (Türkçe) (tr_TR) | ![94%](https://geps.dev/progress/94) | +| Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | +| Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | +| Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | +| Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | +| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | +| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | +| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | +| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | +| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | +| Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | ## Contributing (creating issues, translations, fixing bugs, etc.) @@ -218,11 +221,11 @@ Environment variables are also supported and would override the settings file For example in the settings.yml you have ```yaml -system: +security: 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 @@ -232,35 +235,36 @@ security: csrfDisabled: true # Set to 'true' to disable CSRF protection (not recommended for production) loginAttemptCount: 5 # lock user account after 5 tries loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts -# initialLogin: -# username: "admin" # Initial username for the first login -# password: "stirling" # Initial password for the first login -# oauth2: -# enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) -# issuer: "" # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point -# clientId: "" # Client ID from your provider -# clientSecret: "" # Client Secret from your provider -# autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users -# useAsUsername: "email" # Default is 'email'; custom fields can be used as the username -# scopes: "openid, profile, email" # Specify the scopes for which the application will request permissions -# provider: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' -# client: -# google: -# clientId: "" # Client ID for Google OAuth2 -# clientSecret: "" # Client Secret for Google OAuth2 -# scopes: "https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile" # Scopes for Google OAuth2 -# useAsUsername: "email" # Field to use as the username for Google OAuth2 -# github: -# clientId: "" # Client ID for GitHub OAuth2 -# clientSecret: "" # Client Secret for GitHub OAuth2 -# scopes: "read:user" # Scope for GitHub OAuth2 -# useAsUsername: "login" # Field to use as the username for GitHub OAuth2 -# keycloak: -# issuer: "http://192.168.0.123:8888/realms/stirling-pdf" # URL of the Keycloak realm's OpenID Connect Discovery endpoint -# clientId: "stirling-pdf" # Client ID for Keycloak OAuth2 -# clientSecret: "" # Client Secret for Keycloak OAuth2 -# scopes: "openid, profile, email" # Scopes for Keycloak OAuth2 -# useAsUsername: "email" # Field to use as the username for Keycloak OAuth2 + loginMethod: all # 'all' (Login Username/Password and OAuth2[must be enabled and configured]), 'normal'(only Login with Username/Password) or 'oauth2'(only Login with OAuth2) + initialLogin: + username: '' # Initial username for the first login + password: '' # Initial password for the first login + oauth2: + enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) + client: + keycloak: + issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint + clientId: '' # Client ID for Keycloak OAuth2 + clientSecret: '' # Client Secret for Keycloak OAuth2 + scopes: openid, profile, email # Scopes for Keycloak OAuth2 + useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2 + google: + clientId: '' # Client ID for Google OAuth2 + clientSecret: '' # Client Secret for Google OAuth2 + scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # Scopes for Google OAuth2 + useAsUsername: email # Field to use as the username for Google OAuth2 + github: + clientId: '' # Client ID for GitHub OAuth2 + clientSecret: '' # Client Secret for GitHub OAuth2 + scopes: read:user # Scope for GitHub OAuth2 + useAsUsername: login # Field to use as the username for GitHub OAuth2 + issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point + clientId: '' # Client ID from your provider + clientSecret: '' # Client Secret from your provider + autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + useAsUsername: email # Default is 'email'; custom fields can be used as the username + scopes: openid, profile, email # Specify the scopes for which the application will request permissions + provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) @@ -271,9 +275,9 @@ system: customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files ui: - appName: null # Application's visible name - homeDescription: null # Short description or tagline shown on homepage. - appNameNavbar: null # Name displayed on the navigation bar + appName: '' # Application's visible name + homeDescription: '' # Short description or tagline shown on homepage. + appNameNavbar: '' # Name displayed on the navigation bar endpoints: toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) @@ -307,7 +311,7 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom ![stirling-login](images/login-light.png) -### Prerequisites: +### Prerequisites - User must have the folder ./configs volumed within docker so that it is retained during updates. - Docker users must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. diff --git a/Version-groups.md b/Version-groups.md index a9a9ac162..0e1bc0927 100644 --- a/Version-groups.md +++ b/Version-groups.md @@ -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. Technology | Ultra-Lite | Full | diff --git a/build.gradle b/build.gradle index 8f97854ac..90e130f6c 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,9 @@ sourceSets { if (System.getenv("DOCKER_ENABLE_SECURITY") == "false") { exclude "stirling/software/SPDF/config/security/**" 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/DatabaseWebController.java" exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java" exclude "stirling/software/SPDF/model/Authority.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" @@ -97,7 +99,7 @@ dependencies { //security updates implementation "ch.qos.logback:logback-classic: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") @@ -120,6 +122,7 @@ dependencies { //2.2.x requires rebuild of DB file.. need migration path implementation "com.h2database:h2:2.1.214" + // implementation "com.h2database:h2:2.2.224" } testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion" @@ -133,7 +136,7 @@ dependencies { // implementation "com.twelvemonkeys.imageio:imageio-hdr: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-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-pict:3.10.1" // implementation "com.twelvemonkeys.imageio:imageio-pnm:3.10.1" diff --git a/scripts/counter_translation.py b/scripts/counter_translation.py index a4b6255bd..7f17d3778 100644 --- a/scripts/counter_translation.py +++ b/scripts/counter_translation.py @@ -79,7 +79,9 @@ def write_readme(progress_list: list[tuple[str, int]]) -> None: 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 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. """ # noqa: D205 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 = [] - sort_translation_status: tomlkit.TOMLDocument + sort_ignore_translation: tomlkit.TOMLDocument # read toml - with open(translation_status_file, encoding="utf-8") as f: - sort_translation_status = tomlkit.parse(f.read()) + with open(ignore_translation_file, encoding="utf-8") as f: + sort_ignore_translation = tomlkit.parse(f.read()) 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 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)) continue - if language not in sort_translation_status: - sort_translation_status[language] = tomlkit.table() + if language not in sort_ignore_translation: + sort_ignore_translation[language] = tomlkit.table() if ( - "ignore" not in sort_translation_status[language] - or len(sort_translation_status[language].get("ignore", [])) < 1 + "ignore" not in sort_ignore_translation[language] + 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]: - # sort_translation_status[language]["missing"] = tomlkit.array() - # elif "language.direction" in sort_translation_status[language]["missing"]: - # sort_translation_status[language]["missing"].remove("language.direction") + # if "missing" not in sort_ignore_translation[language]: + # sort_ignore_translation[language]["missing"] = tomlkit.array() + # elif "language.direction" in sort_ignore_translation[language]["missing"]: + # 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): next(default_file) try: @@ -133,34 +145,45 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis except StopIteration: 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: # Ignoring empty lines and lines start with # if line_default.strip() == "" or line_default.startswith("#"): continue - default_key, default_value = line_default.split("=", 1) file_key, file_value = line_file.split("=", 1) if ( 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.") - # if default_key.strip() not in sort_translation_status[language]["missing"]: + print( + 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.append(default_key.strip()) # missing_array.multiline(True) - # sort_translation_status[language]["missing"].extend(missing_array) + # sort_ignore_translation[language]["missing"].extend(missing_array) fails += 1 - # elif default_key.strip() in sort_translation_status[language]["ignore"]: - # if default_key.strip() in sort_translation_status[language]["missing"]: - # sort_translation_status[language]["missing"].remove(default_key.strip()) + # elif default_key.strip() in sort_ignore_translation[language]["ignore"]: + # if default_key.strip() in sort_ignore_translation[language]["missing"]: + # sort_ignore_translation[language]["missing"].remove(default_key.strip()) if default_value.strip() != file_value.strip(): - # if default_key.strip() in sort_translation_status[language]["missing"]: - # sort_translation_status[language]["missing"].remove(default_key.strip()) - if default_key.strip() in sort_translation_status[language]["ignore"]: - sort_translation_status[language]["ignore"].remove(default_key.strip()) - + # if default_key.strip() in sort_ignore_translation[language]["missing"]: + # sort_ignore_translation[language]["missing"].remove(default_key.strip()) + if ( + 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: pass @@ -171,9 +194,9 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis int((num_lines - fails) * 100 / num_lines), ) ) - translation_status = convert_to_multiline(sort_translation_status) - with open(translation_status_file, "w", encoding="utf-8") as file: - file.write(tomlkit.dumps(translation_status)) + ignore_translation = convert_to_multiline(sort_ignore_translation) + with open(ignore_translation_file, "w", encoding="utf-8") as file: + file.write(tomlkit.dumps(ignore_translation)) unique_data = list(set(result_list)) 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") 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) + ) diff --git a/scripts/translation_status.toml b/scripts/ignore_translation.toml similarity index 64% rename from scripts/translation_status.toml rename to scripts/ignore_translation.toml index 0a8afe75e..d55e820ac 100644 --- a/scripts/translation_status.toml +++ b/scripts/ignore_translation.toml @@ -10,7 +10,11 @@ ignore = [ [ca_CA] ignore = [ + 'PDFToText.tags', + 'adminUserSettings.admin', 'language.direction', + 'survey.button', + 'watermark.type.1', ] [cs_CZ] @@ -48,6 +52,7 @@ ignore = [ ignore = [ 'adminUserSettings.roles', 'color', + 'error', 'language.direction', 'no', 'showJS.tags', @@ -60,8 +65,26 @@ ignore = [ [fr_FR] 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', + 'licenses.license', + 'licenses.module', + 'licenses.nav', + 'licenses.version', + 'pdfOrganiser.mode', + 'pipeline.title', + 'pipelineOptions.pipelineHeader', 'sponsor', + 'watermark.type.2', ] [hi_IN] @@ -71,6 +94,7 @@ ignore = [ [hr_HR] ignore = [ + 'PDFToBook.selectText.1', 'font', 'home.pipeline.title', 'info', @@ -114,16 +138,34 @@ ignore = [ [nl_NL] ignore = [ + 'HTMLToPDF.print', + 'adjustContrast.contrast', + 'compare.document.1', + 'compare.document.2', + 'error', + 'getPdfInfo.downloadJson', + 'help', + 'info', 'language.direction', + 'navbar.allTools', + 'printFile.submit', + 'showJS.downloadJS', + 'sponsor', ] [no_NB] ignore = [ + 'PDFToBook.selectText.1', + 'adminUserSettings.admin', + 'info', 'language.direction', + 'oops', + 'sponsor', ] [pl_PL] ignore = [ + 'PDFToBook.selectText.1', 'language.direction', ] @@ -149,12 +191,20 @@ ignore = [ [sk_SK] ignore = [ + 'adminUserSettings.admin', + 'home.multiTool.title', + 'info', 'language.direction', + 'navbar.sections.security', + 'text', + 'watermark.type.1', ] [sr_LATN_RS] ignore = [ 'language.direction', + 'licenses.version', + 'poweredBy', ] [sv_SE] diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java index e568b327c..8c1ed05f2 100644 --- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java +++ b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java @@ -22,7 +22,8 @@ public class CleanUrlInterceptor implements HandlerInterceptor { "error", "erroroauth", "file", - "messageType"); + "messageType", + "infoMessage"); @Override public boolean preHandle( diff --git a/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java b/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java new file mode 100644 index 000000000..267981d18 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java @@ -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 getBackupList(); +} diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index e696c6bc1..689b5df03 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -6,28 +6,33 @@ import java.nio.file.Paths; import java.util.UUID; import org.simpleyaml.configuration.file.YamlFile; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; 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.Role; @Component +@Slf4j public class InitialSecuritySetup { @Autowired private UserService userService; @Autowired private ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(InitialSecuritySetup.class); + @Autowired private DatabaseBackupInterface databaseBackupHelper; @PostConstruct - public void init() { - if (!userService.hasUsers()) { + public void init() throws IllegalArgumentException, IOException { + if (databaseBackupHelper.hasBackup() && !userService.hasUsers()) { + databaseBackupHelper.importDatabase(); + } else if (!userService.hasUsers()) { initializeAdminUser(); + } else { + databaseBackupHelper.exportDatabase(); } initializeInternalApiUser(); } @@ -41,12 +46,11 @@ public class InitialSecuritySetup { } } - private void initializeAdminUser() { + private void initializeAdminUser() throws IOException { String initialUsername = applicationProperties.getSecurity().getInitialLogin().getUsername(); String initialPassword = applicationProperties.getSecurity().getInitialLogin().getPassword(); - if (initialUsername != null && !initialUsername.isEmpty() && initialPassword != null @@ -54,9 +58,9 @@ public class InitialSecuritySetup { && !userService.findByUsernameIgnoreCase(initialUsername).isPresent()) { try { userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId()); - logger.info("Admin user created: " + initialUsername); + log.info("Admin user created: " + initialUsername); } catch (IllegalArgumentException e) { - logger.error("Failed to initialize security setup", e); + log.error("Failed to initialize security setup", e); System.exit(1); } } else { @@ -64,23 +68,23 @@ public class InitialSecuritySetup { } } - private void createDefaultAdminUser() { + private void createDefaultAdminUser() throws IllegalArgumentException, IOException { String defaultUsername = "admin"; String defaultPassword = "stirling"; if (!userService.findByUsernameIgnoreCase(defaultUsername).isPresent()) { 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())) { userService.saveUser( Role.INTERNAL_API_USER.getRoleId(), UUID.randomUUID().toString(), 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()); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 0a6898f8a..f6cdfb91a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.config.security; +import java.io.IOException; import java.util.Collection; import java.util.HashMap; 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.stereotype.Service; +import stirling.software.SPDF.config.DatabaseBackupInterface; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; @@ -38,8 +40,11 @@ public class UserService implements UserServiceInterface { @Autowired private MessageSource messageSource; + @Autowired DatabaseBackupInterface databaseBackupHelper; + // 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)) { return false; } @@ -131,7 +136,7 @@ public class UserService implements UserServiceInterface { } public void saveUser(String username, AuthenticationType authenticationType) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -142,9 +147,11 @@ public class UserService implements UserServiceInterface { user.addAuthority(new Authority(Role.USER.getRoleId(), user)); user.setAuthenticationType(authenticationType); 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)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -154,10 +161,11 @@ public class UserService implements UserServiceInterface { user.setEnabled(true); user.setAuthenticationType(AuthenticationType.WEB); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void saveUser(String username, String password, String role, boolean firstLogin) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -169,10 +177,11 @@ public class UserService implements UserServiceInterface { user.setAuthenticationType(AuthenticationType.WEB); user.setFirstLogin(firstLogin); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void saveUser(String username, String password, String role) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { saveUser(username, password, role, false); } @@ -206,7 +215,8 @@ public class UserService implements UserServiceInterface { return userCount > 0; } - public void updateUserSettings(String username, Map updates) { + public void updateUserSettings(String username, Map updates) + throws IOException { Optional userOpt = userRepository.findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { User user = userOpt.get(); @@ -220,6 +230,7 @@ public class UserService implements UserServiceInterface { user.setSettings(settingsMap); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } } @@ -235,22 +246,26 @@ public class UserService implements UserServiceInterface { 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)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } user.setUsername(newUsername); 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)); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } - public void changeFirstUse(User user, boolean firstUse) { + public void changeFirstUse(User user, boolean firstUse) throws IOException { user.setFirstLogin(firstUse); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void changeRole(User user, String newRole) { diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java new file mode 100644 index 000000000..026a96843 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java @@ -0,0 +1,202 @@ +package stirling.software.SPDF.config.security.database; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.DatabaseBackupInterface; +import stirling.software.SPDF.utils.FileInfo; + +@Slf4j +@Configuration +public class DatabaseBackupHelper implements DatabaseBackupInterface { + + @Value("${spring.datasource.url}") + private String url; + + private Path backupPath = Paths.get("configs/db/backup/"); + + @Override + public boolean hasBackup() { + // Check if there is at least one backup + return !getBackupList().isEmpty(); + } + + @Override + public List getBackupList() { + // Check if the backup directory exists, and create it if it does not + ensureBackupDirectoryExists(); + + List backupFiles = new ArrayList<>(); + + // Read the backup directory and filter for files with the prefix "backup_" and suffix + // ".sql" + try (DirectoryStream 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 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 filteredBackupList = + this.getBackupList().stream() + .filter(backup -> !backup.getFileName().startsWith("backup_user_")) + .collect(Collectors.toList()); + + if (filteredBackupList.size() > 5) { + filteredBackupList.sort( + Comparator.comparing( + p -> p.getFileName().substring(7, p.getFileName().length() - 4))); + Files.deleteIfExists(Paths.get(filteredBackupList.get(0).getFilePath())); + log.info("Deleted oldest backup: {}", filteredBackupList.get(0).getFileName()); + } + + LocalDateTime dateNow = LocalDateTime.now(); + DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); + Path insertOutputFilePath = + this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql"); + String query = "SCRIPT SIMPLE COLUMNS DROP to '" + insertOutputFilePath.toString() + "';"; + + try (Connection conn = DriverManager.getConnection(url, "sa", ""); + Statement stmt = conn.createStatement()) { + stmt.execute(query); + log.info("Database export completed: {}", insertOutputFilePath); + } catch (SQLException e) { + log.error("Error during database export: {}", e.getMessage(), e); + } + } + + // Retrieves the H2 database version. + public String getH2Version() { + String version = "Unknown"; + try (Connection conn = DriverManager.getConnection(url, "sa", "")) { + try (Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT H2VERSION() AS version")) { + if (rs.next()) { + version = rs.getString("version"); + log.info("H2 Database Version: {}", version); + } + } + } catch (SQLException e) { + log.error("Error retrieving H2 version: {}", e.getMessage(), e); + } + return version; + } + + // Deletes a backup file. + public boolean deleteBackupFile(String fileName) throws IOException { + Path filePath = this.getBackupFilePath(fileName); + if (Files.deleteIfExists(filePath)) { + log.info("Deleted backup file: {}", fileName); + return true; + } else { + log.error("File not found or could not be deleted: {}", fileName); + return false; + } + } + + // Gets the Path object for a given backup file name. + public Path getBackupFilePath(String fileName) { + return Paths.get(backupPath.toString(), fileName); + } + + private boolean executeDatabaseScript(Path scriptPath) { + try (Connection conn = DriverManager.getConnection(url, "sa", ""); + Statement stmt = conn.createStatement()) { + + String query = "RUNSCRIPT from '" + scriptPath.toString() + "';"; + stmt.execute(query); + log.info("Database import completed: {}", scriptPath); + return true; + } catch (SQLException e) { + log.error("Error during database import: {}", e.getMessage(), e); + return false; + } + } + + private void ensureBackupDirectoryExists() { + if (Files.notExists(backupPath)) { + try { + Files.createDirectories(backupPath); + } catch (IOException e) { + log.error("Error creating directories: {}", e.getMessage()); + } + } + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java new file mode 100644 index 000000000..2ddc47e12 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java @@ -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(); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java new file mode 100644 index 000000000..2f7e207bc --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java @@ -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(); + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index ec316fbc4..b0deefa06 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import java.io.IOException; import java.security.Principal; import java.util.HashMap; import java.util.Map; @@ -42,7 +43,8 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @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())) { model.addAttribute("error", "Username already exists"); return "register"; @@ -63,7 +65,8 @@ public class UserController { @RequestParam(name = "newUsername") String newUsername, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (!userService.isUsernameValid(newUsername)) { return new RedirectView("/account?messageType=invalidUsername", true); @@ -116,7 +119,8 @@ public class UserController { @RequestParam(name = "newPassword") String newPassword, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (principal == null) { return new RedirectView("/change-creds?messageType=notAuthenticated", true); } @@ -149,7 +153,8 @@ public class UserController { @RequestParam(name = "newPassword") String newPassword, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (principal == null) { return new RedirectView("/account?messageType=notAuthenticated", true); } @@ -176,7 +181,8 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/updateUserSettings") - public String updateUserSettings(HttpServletRequest request, Principal principal) { + public String updateUserSettings(HttpServletRequest request, Principal principal) + throws IOException { Map paramMap = request.getParameterMap(); Map updates = new HashMap<>(); @@ -201,7 +207,8 @@ public class UserController { @RequestParam(name = "password") String password, @RequestParam(name = "role") String role, @RequestParam(name = "forceChange", required = false, defaultValue = "false") - boolean forceChange) { + boolean forceChange) + throws IllegalArgumentException, IOException { if (!userService.isUsernameValid(username)) { return new RedirectView("/addUsers?messageType=invalidUsername", true); diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index a70ae2116..73d2a0c4b 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -43,6 +43,7 @@ public class AccountWebController { @GetMapping("/login") public String login(HttpServletRequest request, Model model, Authentication authentication) { + if (authentication != null && authentication.isAuthenticated()) { 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("loginMethod", applicationProperties.getSecurity().getLoginMethod()); diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java new file mode 100644 index 000000000..3fd68ad59 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java @@ -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 backupList = databaseBackupHelper.getBackupList(); + model.addAttribute("systemUpdate", backupList); + + return "database"; + } +} diff --git a/src/main/java/stirling/software/SPDF/model/User.java b/src/main/java/stirling/software/SPDF/model/User.java index 74780dd8e..0a6ccc701 100644 --- a/src/main/java/stirling/software/SPDF/model/User.java +++ b/src/main/java/stirling/software/SPDF/model/User.java @@ -16,6 +16,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; import jakarta.persistence.MapKeyColumn; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; @@ -55,7 +56,8 @@ public class User { @ElementCollection @MapKeyColumn(name = "setting_key") - @Column(name = "setting_value") + @Lob + @Column(name = "setting_value", columnDefinition = "CLOB") @CollectionTable(name = "user_settings", joinColumns = @JoinColumn(name = "user_id")) private Map settings = new HashMap<>(); // Key-value pairs of settings. diff --git a/src/main/java/stirling/software/SPDF/utils/FileInfo.java b/src/main/java/stirling/software/SPDF/utils/FileInfo.java new file mode 100644 index 000000000..4e236756a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/utils/FileInfo.java @@ -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); + } +} diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 66902b18a..f97377d81 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=تغيير دور المستخدم 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=إزالة #compare compare.title=يقارن compare.header=قارن ملفات PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=المستند 1 compare.document.2=المستند 2 compare.submit=يقارن diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ac4971deb..0895f5f99 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Съхранете потребителя adminUserSettings.changeUserRole=Промяна на ролята на потребителя 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Премахване #compare compare.title=Сравнявай compare.header=Сравнявай PDF-и +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнявай diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index f6003fbaf..4a37930db 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Desar Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Comparar compare.header=Compara PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparar diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 9df08b569..36634d3ab 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Uložit Uživatele adminUserSettings.changeUserRole=Zmenit Roli Uživatele 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Odebrat #compare compare.title=Porovnat compare.header=Porovnat PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnat diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index e685e7f5c..b135d5101 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -86,7 +86,7 @@ pipeline.defaultOption=Benutzerdefiniert pipeline.submitButton=Speichern pipeline.help=Hilfe für Pipeline 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 # @@ -191,6 +191,23 @@ adminUserSettings.submit=Benutzer speichern adminUserSettings.changeUserRole=Benutzerrolle ändern 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Entfernen #compare compare.title=Vergleichen compare.header=PDFs vergleichen +compare.highlightColor.1=Highlight-Farbe 1: +compare.highlightColor.2=Highlight-Farbe 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Vergleichen @@ -1084,13 +1103,13 @@ licenses.version=Version licenses.license=Lizenz #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Umfrage +survey.title=Stirling-PDF-Umfrage +survey.description=Stirling-PDF hat kein Tracking, daher möchten wir von unseren Benutzern hören, wie wir Stirling-PDF verbessern können! +survey.please=Bitte nehmen Sie an unserer Umfrage teil! +survey.disabled=(Das Umfrage-Popup wird in folgenden Updates deaktiviert, ist aber am Fuß der Seite verfügbar.) +survey.button=Umfrage durchführen +survey.dontShowAgain=Nicht mehr anzeigen #error diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index c140c12c5..7db7e2742 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Κατάργηση #compare compare.title=Σύγκριση compare.header=Σύγκριση PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Έγγραφο 1 compare.document.2=Έγγραφο 2 compare.submit=Σύγκριση diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index d8d3e1480..7add06f62 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compare compare.header=Compare PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 45d6352a5..5f20e450c 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compare compare.header=Compare PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 0c0504602..daf1172fc 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Guardar Usuario adminUserSettings.changeUserRole=Cambiar rol de usuario 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Eliminar #compare compare.title=Comparar compare.header=Comparar archivos PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 45bdb032c..29dcc44b4 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Gorde Erabiltzailea adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Konparatu compare.header=Konparatu PDF fitxategiak +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=1. dokumentua compare.document.2=2. dokumentua compare.submit=Konparatu diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 7ff1c61b7..62731ae6b 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Ajouter adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Supprimer #compare compare.title=Comparer compare.header=Comparer +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparer diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 080d9bb37..000e27791 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=उपयोगकर्ता को सहेजे adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=हटाएं #compare compare.title=तुलना करें compare.header=पीडीएफ़ तुलना करें +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=दस्तावेज़ 1 compare.document.2=दस्तावेज़ 2 compare.submit=तुलना करें diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index a98e8ef73..9901e13f8 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Spremi korisnika adminUserSettings.changeUserRole=Promijenite korisničku ulogu 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Ukloni #compare compare.title=Uporedite compare.header=Usporedite PDF-ove +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 759fae669..b9b77e5fc 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Felhasználó mentése adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Összehasonlítás compare.header=PDF-ek összehasonlítása +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokumentum 1 compare.document.2=Dokumentum 2 compare.submit=Összehasonlítás diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 4ffaec2f7..38d4dee43 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Simpan Pengguna adminUserSettings.changeUserRole=Ubah Peran Pengguna 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Hapus #compare compare.title=Bandingkan compare.header=Bandingkan PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokumen 1 compare.document.2=Dokumen 2 compare.submit=Bandingkan diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 7589e4c52..dca16d027 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -35,7 +35,7 @@ sizes.large=Largo sizes.x-large=Extra-Large error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta delete=Elimina -username=Username +username=Nome utente password=Password welcome=Benvenuto property=Proprietà @@ -116,7 +116,7 @@ navbar.multiTool=Strumenti multipli navbar.sections.organize=Organizza navbar.sections.convertTo=Converti in PDF navbar.sections.convertFrom=Converti da PDF -navbar.sections.security=Firma Firma & Sicurezza +navbar.sections.security=Firma & Sicurezza navbar.sections.advance=Avanzate navbar.sections.edit=Visualizza & Modifica @@ -191,6 +191,23 @@ adminUserSettings.submit=Salva utente adminUserSettings.changeUserRole=Cambia il ruolo dell'utente 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 # ############# @@ -234,7 +251,7 @@ pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento home.addImage.title=Aggiungi Immagine 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.desc=Aggiungi una filigrana al tuo PDF. @@ -689,6 +706,8 @@ removeAnnotations.submit=Rimuovi #compare compare.title=Compara compare.header=Compara PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Compara diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index bab67998b..2ac0cf762 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=ユーザーの保存 adminUserSettings.changeUserRole=ユーザーの役割を変更する 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=削除 #compare compare.title=比較 compare.header=PDFの比較 +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=ドキュメント 1 compare.document.2=ドキュメント 2 compare.submit=比較 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 2a9d3461d..b86dca72f 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=사용자 저장 adminUserSettings.changeUserRole=사용자의 역할 변경 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=제거하다 #compare compare.title=비교 compare.header=PDF 문서 비교 +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=문서 1 compare.document.2=문서 2 compare.submit=비교 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index e9b275747..ed2046788 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -11,17 +11,17 @@ imgPrompt=Selecteer afbeelding(en) genericSubmit=Indienen processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) : goToPage=Ga true=Waar false=Onwaar unknown=Onbekend save=Opslaan -saveToBrowser=Save to Browser +saveToBrowser=Opslaan in browser close=Sluiten filesSelected=Bestanden geselecteerd noFavourites=Geen favorieten toegevoegd -downloadComplete=Download Complete +downloadComplete=Download klaar bored=Verveeld met wachten? alphabet=Alfabet downloadPdf=Download PDF @@ -54,23 +54,23 @@ notAuthenticatedMessage=Gebruiker niet ingelogd. userNotFoundMessage=Gebruiker niet gevonden. incorrectPasswordMessage=Huidige wachtwoord is onjuist. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. +confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen. +deleteCurrentUserMessage=Kan niet een momenteel ingelogde gebruiker verwijderen. +deleteUsernameExistsMessage=De gebruikersnaam bestaat niet en kan niet verwijderd worden. downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker. +userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker. error=Error -oops=Oops! +oops=Oeps! help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color +goHomepage=Ga naar de startpagina +joinDiscord=Word lid van onze Discord server +seeDockerHub=Zie Docker Hub +visitGithub=Ga naar de Github Repository +donate=Doneer +color=Kleur sponsor=Sponsor info=Info @@ -79,14 +79,14 @@ info=Info ############### # Pipeline # ############### -pipeline.header=Pijplijn menu (Alpha) +pipeline.header=Pijplijn menu (Beta) pipeline.uploadButton=Aangepast uploaden pipeline.configureButton=Configureren pipeline.defaultOption=Aangepast pipeline.submitButton=Opslaan -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.help=Pijplijn help +pipeline.scanHelp=Map scannen help +pipeline.deletePrompt=Weet je zeker dat je deze pijplijn wil verwijderen? ###################### # Pipeline Options # @@ -107,25 +107,25 @@ pipelineOptions.validateButton=Valideren ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favorieten navbar.darkmode=Donkere modus -navbar.language=Languages +navbar.language=Talen navbar.settings=Instellingen navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.multiTool=Multitools +navbar.sections.organize=Organizeren +navbar.sections.convertTo=Converteren naar PDF +navbar.sections.convertFrom=Converteren van PDF +navbar.sections.security=Ondertekenen & beveiliging +navbar.sections.advance=Geavanceerd +navbar.sections.edit=Bekijken & wijzigen ############# # SETTINGS # ############# settings.title=Instellingen settings.update=Update beschikbaar -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} is de huidig geïnstalleerde versie. Een nieuwe versie ({1}) is beschikbaar. settings.appVersion=App versie: settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip): settings.downloadOption.1=Open in hetzelfde venster @@ -134,13 +134,13 @@ settings.downloadOption.3=Download bestand settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan settings.signOut=Uitloggen settings.accountSettings=Account instellingen -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Schakelt geheim spelletje in +settings.cacheInputs.name=Sla invoer in formulieren op +settings.cacheInputs.help=Schakel in om eerdere invoeren op te slaan voor toekomstige uitvoeren changeCreds.title=Inloggegevens wijzigen changeCreds.header=Werk je accountgegevens bij -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=Je gebruikt de standaard inloggegevens. Voer alstublieft een nieuw wachtwoord in changeCreds.newUsername=Nieuwe gebruikersnaam changeCreds.oldPassword=Huidige wachtwoord changeCreds.newPassword=Nieuw wachtwoord @@ -175,27 +175,44 @@ adminUserSettings.header=Beheer gebruikers adminUserSettings.admin=Beheerder adminUserSettings.user=Gebruiker adminUserSettings.addUser=Voeg nieuwe gebruiker toe -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Verwijder gebruiker +adminUserSettings.confirmDeleteUser=Moet deze gebruiker verwijderd worden? +adminUserSettings.usernameInfo=Gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. adminUserSettings.roles=Rollen adminUserSettings.role=Rol adminUserSettings.actions=Acties adminUserSettings.apiUser=Beperkte API gebruiker -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=Extra beperkte API gebruiker adminUserSettings.webOnlyUser=Alleen web gebruiker adminUserSettings.demoUser=Demogebruiker (geen aangepaste instellingen) -adminUserSettings.internalApiUser=Internal API User +adminUserSettings.internalApiUser=Interne API gebruiker adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te wijzigen bij inloggen adminUserSettings.submit=Gebruiker opslaan adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Geauthenticeerd + + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File ############# # HOME-PAGE # ############# home.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 @@ -204,11 +221,11 @@ viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding home.multiTool.title=PDF multitool home.multiTool.desc=Pagina's samenvoegen, draaien, herschikken en verwijderen -multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats +multiTool.tags=Multitool,meerdere bewerkingen,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats home.merge.title=Samenvoegen home.merge.desc=Voeg eenvoudig meerdere PDF's samen tot één. -merge.tags=samenvoegen,Pagina bewerkingen,Serverkant +merge.tags=samenvoegen,pagina bewerkingen,serverzijde home.split.title=Splitsen home.split.desc=Splits PDF's in meerdere documenten @@ -255,7 +272,7 @@ addPassword.tags=veilig,beveiliging home.removePassword.title=Wachtwoord verwijderen home.removePassword.desc=Verwijder wachtwoordbeveiliging van je PDF-document. -removePassword.tags=veilig,Decrypteren,beveiliging,wachtwoord verwijderen +removePassword.tags=veilig,ontsleutelen,beveiliging,wachtwoord verwijderen home.compressPdfs.title=Comprimeren home.compressPdfs.desc=Comprimeer PDF's om hun bestandsgrootte te verkleinen. @@ -336,9 +353,9 @@ home.certSign.title=Ondertekenen met certificaat home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12) certSign.tags=authenticeren,PEM,P12,officieel,versleutelen -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Verwijder certificaat +home.removeCertSign.desc=Verwijder certificaat van PDF +removeCertSign.tags=authenticeren,PEM,P12,officieel,ontsleutelen home.pageLayout.title=Multi-pagina indeling home.pageLayout.desc=Voeg meerdere pagina's van een PDF-document samen op één pagina @@ -436,13 +453,13 @@ home.AddStampRequest.desc=Voeg tekst of afbeeldingsstempels toe op vaste locatie AddStampRequest.tags=Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre -PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.PDFToBook.title=PDF naar Boek +home.PDFToBook.desc=Converteert PDF naar boek-/stripformaat met gebruik van Calibre +PDFToBook.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre -BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.BookToPDF.title=Boek naar PDF +home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre +BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle ########################### @@ -460,12 +477,12 @@ login.locked=Je account is geblokkeerd. login.signinTitle=Gelieve in te loggen login.ssoSignIn=Inloggen via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden +login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo +login.oauth2invalidRequest=Ongeldig verzoek +login.oauth2AccessDenied=Toegang geweigerd +login.oauth2InvalidTokenResponse=Ongeldige tokenreactie +login.oauth2InvalidIdToken=Ongeldige ID token #auto-redact @@ -512,7 +529,7 @@ getPdfInfo.downloadJson=Download JSON MarkdownToPDF.title=Markdown naar PDF MarkdownToPDF.header=Markdown naar PDF MarkdownToPDF.submit=Converteren -MarkdownToPDF.help=in ontwikkeling +MarkdownToPDF.help=In ontwikkeling MarkdownToPDF.credit=Gebruikt WeasyPrint @@ -542,7 +559,7 @@ HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer) HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina. HTMLToPDF.none=Geen HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.screen=Scherm #AddStampRequest @@ -664,10 +681,10 @@ certSign.submit=PDF ondertekenen #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Verwijder certificaat +removeCertSign.header=Verwijder het digitale certificaat van de PDF +removeCertSign.selectPDF=Selecteer een PDF bestand: +removeCertSign.submit=Verwijder certificaat #removeBlanks @@ -689,22 +706,24 @@ removeAnnotations.submit=Verwijderen #compare compare.title=Vergelijken compare.header=PDF's vergelijken +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Vergelijken #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=Boeken en strips naar PDF +BookToPDF.header=Boek naar PDF +BookToPDF.credit=Gebruikt Calibre +BookToPDF.submit=Converteer #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book -PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.title=PDF naar boek +PDFToBook.header=PDF naar boek +PDFToBook.selectText.1=Formaat +PDFToBook.credit=Gebruikt Calibre +PDFToBook.submit=Converteer #sign sign.title=Ondertekenen @@ -725,7 +744,7 @@ repair.submit=Repareren #flatten flatten.title=Afvlakken flatten.header=PDF's afvlakken -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Alleen formulieren afvlakken flatten.submit=Afvlakken @@ -756,7 +775,7 @@ ocr.selectText.8=Normaal (Zal een fout geven als de PDF tekst bevat) ocr.selectText.9=Aanvullende instellingen ocr.selectText.10=OCR-modus ocr.selectText.11=Verwijder afbeeldingen na OCR (Verwijdert ALLE afbeeldingen, alleen nuttig als onderdeel van conversiestap) -ocr.selectText.12=Render Type (Geavanceerd) +ocr.selectText.12=Weergave Type (Geavanceerd) ocr.help=Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker ocr.credit=Deze dienst maakt gebruik van OCRmyPDF en Tesseract voor OCR. ocr.submit=Verwerk PDF met OCR @@ -803,7 +822,7 @@ merge.title=Samenvoegen merge.header=Meerdere PDF's samenvoegen (2+) merge.sortByName=Sorteer op naam merge.sortByDate=Sorteer op datum -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Verwijder digitale handtekening in het samengevoegde bestand? merge.submit=Samenvoegen @@ -811,24 +830,24 @@ merge.submit=Samenvoegen pdfOrganiser.title=Pagina organisator pdfOrganiser.header=PDF pagina organisator pdfOrganiser.submit=Pagina's herschikken -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=Modus +pdfOrganiser.mode.1=Aangepaste paginavolgorde +pdfOrganiser.mode.2=Omgekeerde volgorde +pdfOrganiser.mode.3=Duplex sorteren +pdfOrganiser.mode.4=Boekje sorteren +pdfOrganiser.mode.5=Zijsteek boekje sorteren +pdfOrganiser.mode.6=Oneven-even splitsen +pdfOrganiser.mode.7=Eerste verwijderen +pdfOrganiser.mode.8=Laatste verwijderen +pdfOrganiser.mode.9=Eerste en laaste verwijderen +pdfOrganiser.mode.10=Oneven-even samenvoeken +pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1) #multiTool multiTool.title=PDF Multitool multiTool.header=PDF Multitool -multiTool.uploadPrompts=File Name +multiTool.uploadPrompts=Bestandsnaam #view pdf viewPdf.title=PDF bekijken @@ -839,7 +858,7 @@ pageRemover.title=Pagina verwijderaar pageRemover.header=PDF pagina verwijderaar pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in): pageRemover.submit=Pagina's verwijderen -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(bijv. 1,2,6 of 1-10,15-30) #rotate @@ -980,9 +999,9 @@ pdfToPDFA.title=PDF naar PDF/A pdfToPDFA.header=PDF naar PDF/A pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie pdfToPDFA.submit=Converteren -pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd. pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.pdfWithDigitalSignature=Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd. #PDFToWord @@ -1064,14 +1083,14 @@ split-by-sections.vertical.label=Verticale secties split-by-sections.horizontal.placeholder=Voer het aantal horizontale secties in split-by-sections.vertical.placeholder=Voer het aantal verticale secties in split-by-sections.submit=PDF splitsen -split-by-sections.merge=Merge Into One PDF +split-by-sections.merge=Samenvoegen in één PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name +printFile.title=Print bestand +printFile.header=Print bestand naar printer +printFile.selectText.1=Selecteer bestand om te printen +printFile.selectText.2=Voer printernaam in printFile.submit=Print @@ -1084,25 +1103,25 @@ licenses.version=Versie licenses.license=Licentie #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Enquête +survey.title=Stirling-PDF Enquête +survey.description=Stirling-PDF heeft geen tracking, dus we willen van onze gebruikers horen om Stirling-PDF te verbeteren. +survey.please=Overweeg alstublieft om onze enquête in te vullen! +survey.disabled=(Enquête popup wordt in een toekomstige update weggehaald, maar is beschikbaar aan de onderkant van de pagina.) +survey.button=Vul enquête in. +survey.dontShowAgain=Niet weer tonen #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Excuses voor het probleem! +error.needHelp=Hulp nodig / probleem gevonden? +error.contactTip=Als je nog steeds problemen hebt, schroom niet om contact met ons op te nemen voor hulp. Je kan een ticket op onze Github pagina indienen of ons via Discord bereiken: +error.404.head=404 - Pagina niet gevonden | Oeps, we struikelden over de code! +error.404.1=We kunnen de pagina die je zoek niet vinden. +error.404.2=Er ging iets mis. +error.github=Dien een ticket op Github in. +error.showStack=Geeft tracering weer +error.copyStack=Kopieer tracering +error.githubSubmit=GitHub - Dien een ticket in +error.discordSubmit=Discord - Maak een support post diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 8597ebd81..584cabf1d 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Lagre Bruker adminUserSettings.changeUserRole=Endre Brukerens Rolle adminUserSettings.authenticated=Autentisert + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Fjern #compare compare.title=Sammenlign compare.header=Sammenlign PDF-er +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Sammenlign diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties old mode 100644 new mode 100755 index 5cb5df8bf..63dd95e3a --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -11,17 +11,17 @@ imgPrompt=Wybierz obraz(y) genericSubmit=Wyślij processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Niestandardowy wybór strony (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : goToPage=Idź true=Tak false=Nie unknown=Nieznany save=Zapisz -saveToBrowser=Save to Browser +saveToBrowser=Zapisz w przeglądarce close=Zamknij filesSelected=wybrane pliki noFavourites=Nie dodano ulubionych -downloadComplete=Download Complete +downloadComplete=Pobieranie zakończone bored=Znudzony czekaniem? alphabet=Alfabet downloadPdf=Pobierz PDF @@ -29,77 +29,77 @@ text=Tekst font=Czcionka selectFillter=-- Wybierz -- pageNum=Numer strony -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large +sizes.small=mniejszy +sizes.medium=średni +sizes.large=duży +sizes.x-large=bardzo duży error.pdfPassword=Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło. -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +delete=usuń +username=nazwa użytkownika +password=hasło +welcome=Witaj +property=własnośc +black=czarny +white=biały +red=czerwony +green=zielony +blue=niebieski +custom=Własny +WorkInProgess=Praca w toku, proszę zgłaszać błędy! +poweredBy=Zasilany +yes=tak +no=nie +changedCredsMessage=Dane logowanie zostały zmienione. +notAuthenticatedMessage=Użytkownik nie jest zalogowany. +userNotFoundMessage=Brak użytkownika. +incorrectPasswordMessage=Nieprawidłowe hasło. +usernameExistsMessage=Taki uzytkownik już istnieje. +invalidUsernameMessage=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. +confirmPasswordErrorMessage=Wpisz poprawnie hasło w OBA pola. +deleteCurrentUserMessage=Nie można usunąć zalogowanego użytkownika +deleteUsernameExistsMessage=Nie można usunąć zalogowanego użytkownika downgradeCurrentUserMessage=Nie można obniżyć roli bieżącego użytkownika downgradeCurrentUserLongMessage=Nie można obniżyć roli bieżącego użytkownika. W związku z tym bieżący użytkownik nie zostanie wyświetlony. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor -info=Info +userAlreadyExistsOAuthMessage=Takie konto użytkownika istnieje - stworzone za pomocą OAuth2. +userAlreadyExistsWebMessage=Takie konto użytkownika istnieje - stworzone za pomocą przeglądarki. +error=błąd +oops=Ups! +help=Pomoc +goHomepage=Idź do strony domowej +joinDiscord=Zapraszamy na DISCORD! +seeDockerHub=Docker Hub +visitGithub=Odwiedź repozytorium GitHub +donate=Podaruj +color=kolor +sponsor=sponsor +info=informacje ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Automatyzacja - menu (Beta) +pipeline.uploadButton=Wrzuć pliki +pipeline.configureButton=Konfiguracja +pipeline.defaultOption=Własny +pipeline.submitButton=Wyślij +pipeline.help=Pomoc automatyzacji +pipeline.scanHelp=Pomoc obserwowania folderu +pipeline.deletePrompt=Na pewno chcesz skasować automatyzacje ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=Konfiguracja automatyzacji +pipelineOptions.pipelineNameLabel=Nazwa automatyzacji +pipelineOptions.saveSettings=Zapisz automatyzacje +pipelineOptions.pipelineNamePrompt=Podaj nazwę automatyzacji +pipelineOptions.selectOperation=Wybierz operację +pipelineOptions.addOperationButton=Dodaj operację +pipelineOptions.pipelineHeader=Automatyzacja +pipelineOptions.saveButton=Pobierz +pipelineOptions.validateButton=Waliduj @@ -107,98 +107,115 @@ pipelineOptions.validateButton=Validate ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Ulubione navbar.darkmode=Tryb nocny -navbar.language=Languages +navbar.language=Języki navbar.settings=Ustawienia -navbar.allTools=Tools +navbar.allTools=Narzędzia navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.sections.organize=Organizuj +navbar.sections.convertTo=Przetwórz na PDF +navbar.sections.convertFrom=Przetwórz z PDF +navbar.sections.security=Podpis i bezpieczeństwo +navbar.sections.advance=Zaawansowane +navbar.sections.edit=Podgląd i edycja ############# # SETTINGS # ############# settings.title=Ustawienia settings.update=Dostępna aktualizacja -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. -settings.appVersion=Wersia aplikacji: +settings.updateAvailable=Wersja {0} jest obecenia zainstalowana , dostępna jest nowa wersja({1}). +settings.appVersion=Wersja aplikacji: 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.2=Otwórz w nowym oknie settings.downloadOption.3=Pobierz plik settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy -settings.signOut=Sign Out -settings.accountSettings=Account Settings -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.signOut=Wyloguj +settings.accountSettings=Ustawienia konta +settings.bored.help=Włącz easter-egg +settings.cacheInputs.name=Zapisz dane formularzy +settings.cacheInputs.help=Włącz aby zapisać dane dla przyszłych automatyzacji -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes +changeCreds.title=Zmień dane logowania +changeCreds.header=Zmień dane konta +changeCreds.changePassword=Musisz zmienić domyślne dane logowania +changeCreds.newUsername=Nowa nazwa użytkownika +changeCreds.oldPassword=Obecne hasło +changeCreds.newPassword=Nowe hasło +changeCreds.confirmNewPassword=Potwierdź obecne hasło +changeCreds.submit=Zapisz zmiany -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.newUsername=New Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +account.title=Ustawienia konta +account.accountSettings=Ustawienia konta +account.adminSettings=Admin - kontrola kont +account.userControlSettings=Kontrola praw uzytkownika +account.changeUsername=Zmień nazwę użytkownika +account.newUsername=Nowa nazwa użytkownika +account.password=Potwierdź hasło +account.oldPassword=Poprzednie hasło +account.newPassword=Nowe hasło +account.changePassword=Zmień hasło +account.confirmNewPassword=Potwierdź nowe hasło +account.signOut=Wyloguj +account.yourApiKey=Twój klucz API +account.syncTitle=Zapisz ustawienia konta w przeglądarce +account.settingsCompare=Porównania uprawnień +account.property=Własność +account.webBrowserSettings=Ustawienia przeglądarki +account.syncToBrowser=Zapisz dane konta w przeglądarce +account.syncToAccount=Wczytaj dane konta z przeglądarki -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.extraApiUser=Additional Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Save User +adminUserSettings.title=Ustawienia konta użytkownika +adminUserSettings.header=Ustawienia praw administratora +adminUserSettings.admin=administrator +adminUserSettings.user=użytkownik +adminUserSettings.addUser=dodaj nowego użytkownika +adminUserSettings.deleteUser=usuń 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.roles=Role +adminUserSettings.role=Rola +adminUserSettings.actions=Akcje +adminUserSettings.apiUser=Ograniczony Użytkownik API +adminUserSettings.extraApiUser=Dodatkowy ograniczony Użytkownik API +adminUserSettings.webOnlyUser=Uzytkownik tylko WEB +adminUserSettings.demoUser=Użytkownik DEMO +adminUserSettings.internalApiUser=Wenętrzny użytkownik API +adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu +adminUserSettings.submit=Zapisz użytkownika adminUserSettings.changeUserRole=Zmień rolę użytkownika -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Zalogowany + + +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.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF. -home.searchBar=Search for features... +home.searchBar=Szukaj opcji ... -home.viewPdf.title=View PDF +home.viewPdf.title=Podejrzyj PDF home.viewPdf.desc=View, annotate, add text or images viewPdf.tags=view,read,annotate,text,image @@ -324,8 +341,8 @@ home.removeBlanks.title=Usuń puste strony home.removeBlanks.desc=Wykrywa i usuwa puste strony z dokumentu PDF removeBlanks.tags=cleanup,streamline,non-content,organize -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF +home.removeAnnotations.title=Usuń notatki/przypisy +home.removeAnnotations.desc=Usuwa wszystkie notatki i przypisy z dokumentu PDF removeAnnotations.tags=comments,highlight,notes,markup,remove home.compare.title=Porównaj @@ -336,8 +353,8 @@ home.certSign.title=Podpisz certyfikatem home.certSign.desc=Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF +home.removeCertSign.title=Usuń podpis certyfikatem +home.removeCertSign.desc=Usuń podpis certyfikatem z dokumentu PDF removeCertSign.tags=authenticate,PEM,P12,official,decrypt home.pageLayout.title=Układ wielu stron @@ -348,100 +365,100 @@ home.scalePages.title=Dopasuj rozmiar stron home.scalePages.desc=Dopasuj rozmiar stron wybranego dokumentu PDF scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=Automatyzacja (Zaawansowane) +home.pipeline.desc=Wykonaj wiele akcji na dokumentach PDF, tworząc automatyzację pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +home.add-page-numbers.title=Dodaj numery stron +home.add-page-numbers.desc=Dodaj numbery strony w dokumencie PDF w podanej lokacji add-page-numbers.tags=paginate,label,organize,index -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header +home.auto-rename.title=Automatycznie zmień nazwę PDF +home.auto-rename.desc=Automatycznie zmień nazwę PDF bazując na nagłówku auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=Zmień kolor/nasycenie/jasność +home.adjust-contrast.desc=Zmień kolor/nasycenie/jasność w dokumencie PDF adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +home.crop.title=Przytnij PDF +home.crop.desc=Przytnij dokument PDF w celu zmiejszenia rozmiaru crop.tags=trim,shrink,edit,shape -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code +home.autoSplitPDF.title=Automatycznie podziel strony +home.autoSplitPDF.desc=Automatycznie podziel dokument na strony autoSplitPDF.tags=QR-based,separate,scan-segment,organize -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files +home.sanitizePdf.title=Dezynfekcja +home.sanitizePdf.desc=Usuń skrupt i inne elementy z dokumentu PDF sanitizePdf.tags=clean,secure,safe,remove-threats -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF +home.URLToPDF.title=Strona WWW do PDFa +home.URLToPDF.desc=Zapisuje podany adres WWW do PDFa URLToPDF.tags=web-capture,save-page,web-to-doc,archive -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF +home.HTMLToPDF.title=HTML do PDF +home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF HTMLToPDF.tags=markup,web-content,transformation,convert -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF +home.MarkdownToPDF.title=Markdown do PDF +home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF MarkdownToPDF.tags=markup,web-content,transformation,convert -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs +home.getPdfInfo.title=Pobierz informacje o pliku PDF +home.getPdfInfo.desc=Pobiera wszelkie informacje o pliku PDF getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=Wyciągnij stronę z PDF +home.extractPage.desc=Wyciąga stronę z dokumentu PDF extractPage.tags=extract -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page +home.PdfToSinglePage.title=PDF do jednej strony +home.PdfToSinglePage.desc=Łączy wszystkie strony PDFa w jedną wielką stronę PDF PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Pokaż kod JavaScript +home.showJS.desc=Znajduje i pokazuje załączony kod JS w dokumencie PDF showJS.tags=JS -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text +home.autoRedact.title=Zaciemnij +home.autoRedact.desc=Zaciemnia dokument PDF bazująć na podanej wartości autoRedact.tags=Redact,Hide,black out,black,marker,hidden -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +home.tableExtraxt.title=PDF do CSV +home.tableExtraxt.desc=Konwertuje table z PDF do pliku CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +home.autoSizeSplitPDF.title=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 autoSizeSplitPDF.tags=pdf,split,document,organization -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +home.overlay-pdfs.title=Nałóż PDFa +home.overlay-pdfs.desc=Nakłada dokumenty PDF na siebie overlay-pdfs.tags=Overlay -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +home.split-by-sections.title=Podziel PDF na sekcje +home.split-by-sections.desc=Podziel strony PDF w mniejsze sekcje split-by-sections.tags=Section Split, Divide, Customize -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations +home.AddStampRequest.title=Dodaj pieczęć +home.AddStampRequest.desc=Dodaj pieczęć tesktową/obrazową w wyznaczonej lokalizacji dokumentu AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF do eBooka +home.PDFToBook.desc=Zapisuje dokument PDF w formacie eBooka za pomocą Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=eBook do PDF +home.BookToPDF.desc=Zapisuje ebooka do PDF za pomocą Calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle @@ -451,189 +468,189 @@ BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle # # ########################### #login -login.title=Sign in -login.header=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Logowanie +login.header=Logowanie +login.signin=Logowanie +login.rememberme=Zapamiętaj +login.invalid=Nieprawidłowe dane logowania +login.locked=Konto jest zablokowane +login.signinTitle=Zaloguj się login.ssoSignIn=Zaloguj się za pomocą logowania jednokrotnego login.oauth2AutoCreateDisabled=Wyłączono automatyczne tworzenie użytkownika OAUTH2 -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2RequestNotFound=Błąd logowania OAuth2 +login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania +login.oauth2invalidRequest=Nieprawidłowe żądanie +login.oauth2AccessDenied=Brak dostępu +login.oauth2InvalidTokenResponse=Nieprawidłowy odpowiedź na token +login.oauth2InvalidIdToken=Nieprawidłowa wartośc tokenu #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Automatyczne zaciemnienie +autoRedact.header=Automatyczne zaciemnienie +autoRedact.colorLabel=Kolor +autoRedact.textsToRedactLabel=Tekst do zaciemnienia (podzielony liniami) +autoRedact.textsToRedactPlaceholder=przykład \n Poufne \n Ściśle tajne +autoRedact.useRegexLabel=Użyj RegExp +autoRedact.wholeWordSearchLabel=Szukaj całego słowa +autoRedact.customPaddingLabel=Dodatkowe wypełnienie +autoRedact.convertPDFToImageLabel=Przerób PDF na PDF-obrazowy (usuwa tekst w tle) +autoRedact.submitButton=Wyślij #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Pokaż Javascript +showJS.header=Pokaż Javascript +showJS.downloadJS=Pobierz Javascript +showJS.submit=Pokaż #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF do pojedyńczej strony +pdfToSinglePage.header=PDF do pojedyńczej strony +pdfToSinglePage.submit=Zapisz dokument jako PDF z jedną stroną #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.title=Wyciągnij stronę +pageExtracter.header=Wyciągnij stronę +pageExtracter.submit=Wyciągnij +pageExtracter.placeholder=(przykład 1,2,8 lub 2n-1) #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Pobierz informacje o pliku PDF +getPdfInfo.header=Pobierz informacje o pliku PDF +getPdfInfo.submit=Pobierz informacje +getPdfInfo.downloadJson=Pobierz JSON z zawartością #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown do PDF +MarkdownToPDF.header=Markdown do PDF +MarkdownToPDF.submit=Konwertuj +MarkdownToPDF.help=Prace trwają +MarkdownToPDF.credit=Użyj WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL do PDF +URLToPDF.header=URL do PDF +URLToPDF.submit=Konwertuj +URLToPDF.credit=Użyj WeasyPrint #html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.title=HTML do PDF +HTMLToPDF.header=HTML do PDF +HTMLToPDF.help=Akceptuje pliki HTML oraz ZIP zawierające html/css/obrazy +HTMLToPDF.submit=Konwertuj +HTMLToPDF.credit=Użyj WeasyPrint +HTMLToPDF.zoom=Powiększ +HTMLToPDF.pageWidth=Szerokość strony w cm (zostaw puste dla autoskalowania) +HTMLToPDF.pageHeight=Wysokość strony w cm (zostaw puste dla autoskalowania) +HTMLToPDF.marginTop=Górny margines strony w mm (zostaw puste dla autoskalowania) +HTMLToPDF.marginBottom=Dolny margines strony w mm (zostaw puste dla autoskalowania) +HTMLToPDF.marginLeft=Lewy margines strony w mm (zostaw puste dla autoskalowania) +HTMLToPDF.marginRight=Prawy margines strony w mm (zostaw puste dla autoskalowania) +HTMLToPDF.printBackground=Używaj tła stron +HTMLToPDF.defaultHeader=Domyślny nagłówek (Nazwa i numer strony) +HTMLToPDF.cssMediaType=Wskaż CSS dla strony +HTMLToPDF.none=Żaden +HTMLToPDF.print=Drukuj +HTMLToPDF.screen=Ekran #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Pieczęć PDF +AddStampRequest.title=Pieczęć PDF +AddStampRequest.stampType=Typ pieczęci +AddStampRequest.stampText=Tekst w pieczęci +AddStampRequest.stampImage=Obraz w pieczęci +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Rozmiar Czcionki/Obrazu +AddStampRequest.rotation=Obrót +AddStampRequest.opacity=Przeźroczystość +AddStampRequest.position=Pozycja +AddStampRequest.overrideX=Nadpisz koordynatę X +AddStampRequest.overrideY=Nadpisz koordynatę Y +AddStampRequest.customMargin=Własny margines +AddStampRequest.customColor=Własny kolor tekstu +AddStampRequest.submit=Wyślij #sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF +sanitizePDF.title=Dezynfekuj PDF +sanitizePDF.header=Dezynfekuj dokument PDF +sanitizePDF.selectText.1=Usuń elementy JavaScript +sanitizePDF.selectText.2=Usuń załącznone pliki +sanitizePDF.selectText.3=Usuń metadane +sanitizePDF.selectText.4=Usuń linki +sanitizePDF.selectText.5=Usuń czcionki +sanitizePDF.submit=Dezynfekuj PDF #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.title=Dodaj numerację stron +addPageNumbers.header=Dodaj numerację stron +addPageNumbers.selectText.1=Wskaż plik PDF: +addPageNumbers.selectText.2=Rozmiar marginesu +addPageNumbers.selectText.3=Pozycja +addPageNumbers.selectText.4=Numer początkowy +addPageNumbers.selectText.5=Ilość stron do ponumerowania +addPageNumbers.selectText.6=Tekst własny +addPageNumbers.customTextDesc=Tekst własny +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.submit=Dodaj numerację stron #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=Automatczna zmiana nazwy +auto-rename.header=Automatczna zmiana nazwy dokumentu PDF +auto-rename.submit=Automatczna zmiana nazwy #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=Dopasuj kontrast +adjustContrast.header=Dopasuj kontrast +adjustContrast.contrast=kontrast: +adjustContrast.brightness=jasność: +adjustContrast.saturation=nasycenie: +adjustContrast.download=Pobierz #crop -crop.title=Crop -crop.header=Crop PDF -crop.submit=Submit +crop.title=Przytnij +crop.header=Przytnij dokument PDF +crop.submit=Wyślij #autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit +autoSplitPDF.title=Automatycznie podziel PDF +autoSplitPDF.header=Automatycznie podziel PDF +autoSplitPDF.description=Drukuj, wstaw, skanuj, wyślij i pozwól nam automatycznie posortować dokumenty. +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.3=Wyślij pojedyńczy duży plik PDF zawierający skan i pozwól Stirling zająć się resztą. +autoSplitPDF.selectText.4=Strony separacji sa automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument. +autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF. +autoSplitPDF.duplexMode=Skanowanie dwustronne +autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=Wyślij #pipeline -pipeline.title=Pipeline +pipeline.title=Automatyzacja #pageLayout pageLayout.title=Układ wielu stron pageLayout.header=Układ wielu stron pageLayout.pagesPerSheet=Stron na jednym arkuszu: -pageLayout.addBorder=Add Borders +pageLayout.addBorder=Dodaj granicę pageLayout.submit=Wykonaj @@ -649,11 +666,11 @@ scalePages.submit=Wykonaj certSign.title=Podpisywanie certyfikatem certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie) certSign.selectPDF=Wybierz dokument PDF do podpisania: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=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.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.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Wybierz plik Java Keystore(.jks lub .keystore): certSign.certType=Typ certyfikatu certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje): certSign.showSig=Wyświetl podpis @@ -664,10 +681,10 @@ certSign.submit=Podpisz PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Usuń podpis cyfrowy +removeCertSign.header=Usuń podpis cyfrowy z dokumentu PDF +removeCertSign.selectPDF=Wskaż plik PDF: +removeCertSign.submit=Usuń podpis cyfrowy #removeBlanks @@ -681,30 +698,32 @@ removeBlanks.submit=Usuń puste #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations -removeAnnotations.submit=Remove +removeAnnotations.title=Usuń notatki +removeAnnotations.header=Usuń notatki +removeAnnotations.submit=Usuń #compare compare.title=Porównaj 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.2=Dokument 2 compare.submit=Porównaj #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=eBooki do PDF +BookToPDF.header=eBooki do PDF +BookToPDF.credit=Używając Calibre +BookToPDF.submit=Konwertuj #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book +PDFToBook.title=PDF do eBooka +PDFToBook.header=PDF do eBooka PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.credit=Używając Calibre +PDFToBook.submit=Konwertuj #sign sign.title=Podpis @@ -725,7 +744,7 @@ repair.submit=Napraw #flatten flatten.title=Spłaszcz flatten.header=Spłaszcz dokument(y) PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Spłaszcz tylko formularze flatten.submit=Spłaszcz @@ -811,35 +830,35 @@ merge.submit=Połącz pdfOrganiser.title=Kolejność stron pdfOrganiser.header=Kolejność stron PDF pdfOrganiser.submit=Zmień kolejność stron -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=Tryb +pdfOrganiser.mode.1=Własna kolejność stron +pdfOrganiser.mode.2=Odwrotny +pdfOrganiser.mode.3=Dwustronny +pdfOrganiser.mode.4=Ksiązki +pdfOrganiser.mode.5=Spiętej książki +pdfOrganiser.mode.6=Rozdziel parzyste-nieparzyste +pdfOrganiser.mode.7=Usuń pierwszą +pdfOrganiser.mode.8=Usuń ostatnią +pdfOrganiser.mode.9=Usuń pierwszą i ostatnią +pdfOrganiser.mode.10=Połącz parzyste i nieparzyste +pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) #multiTool multiTool.title=Multi narzędzie PDF multiTool.header=Multi narzędzie PDF -multiTool.uploadPrompts=File Name +multiTool.uploadPrompts=Nazwa pliku #view pdf -viewPdf.title=View PDF -viewPdf.header=View PDF +viewPdf.title=Podejrzyj PDF +viewPdf.header=Podejrzyj PDF #pageRemover pageRemover.title=Narzędzie do usuwania stron pageRemover.header=Narzędzie do usuwania stron w dokumentach PDF pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron oddzielonych przecinkami): pageRemover.submit=Usuń strony -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(przykład 1,3,2 lub 4-8,2,10-12) #rotate @@ -868,10 +887,10 @@ split.submit=Podziel imageToPDF.title=Obraz na PDF imageToPDF.header=Obraz na PDF imageToPDF.submit=Konwertuj -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios +imageToPDF.selectLabel=Opcje dopasowania +imageToPDF.fillPage=Wypełnij stronę +imageToPDF.fitDocumentToImage=Dopasuj stronę do obrazu +imageToPDF.maintainAspectRatio=Zachowaj proporcje imageToPDF.selectText.2=Automatyczne obracanie PDF imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy z wieloma obrazami) imageToPDF.selectText.4=Połącz w jeden dokument PDF @@ -908,9 +927,9 @@ addPassword.selectText.10=Zablokuj modyfikacje addPassword.selectText.11=Zablokuj modyfikacje adnotacji addPassword.selectText.12=Zablokuj drukowanie addPassword.selectText.13=Zablokuj drukowanie różnych formatów -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself +addPassword.selectText.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.16=Ogranicza otwarcie dokumentu addPassword.submit=Zablokuj @@ -924,11 +943,11 @@ watermark.selectText.4=Obrót (0-360): watermark.selectText.5=Odstęp w poziomie (odstęp między każdym znakiem wodnym w poziomie): watermark.selectText.6=Odstęp w pionie (odstęp między każdym znakiem wodnym w pionie): watermark.selectText.7=Nieprzezroczystość (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=Typ znaku wodnego: +watermark.selectText.9=Obraz znaku wodnego: watermark.submit=Dodaj znak wodny -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Tekst +watermark.type.2=Obraz #Change permissions @@ -980,9 +999,9 @@ pdfToPDFA.title=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.submit=Konwertuj -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=Tylko jeden plik na raz +pdfToPDFA.outputFormat=Format wyjściowy: +pdfToPDFA.pdfWithDigitalSignature=Dokument zawiera podpis cyfrowy, nie zostanie on wczytany. #PDFToWord @@ -1029,80 +1048,80 @@ PDFToCSV.prompt=Choose page to extract table PDFToCSV.submit=Wyci?g #split-by-size-or-count -split-by-size-or-count.title=Split PDF by Size or Count -split-by-size-or-count.header=Split PDF by Size or Count -split-by-size-or-count.type.label=Select Split Type -split-by-size-or-count.type.size=By Size -split-by-size-or-count.type.pageCount=By Page Count -split-by-size-or-count.type.docCount=By Document Count -split-by-size-or-count.value.label=Enter Value -split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) -split-by-size-or-count.submit=Submit +split-by-size-or-count.title=Podziel PDF przez ilość stron bądź rozmiar +split-by-size-or-count.header=Podziel PDF przez ilość stron bądź rozmiar +split-by-size-or-count.type.label=Wybierz typ podziału: +split-by-size-or-count.type.size=Rozmiar +split-by-size-or-count.type.pageCount=Ilość stron +split-by-size-or-count.type.docCount=Ilość dokumentów +split-by-size-or-count.value.label=Podaj wartość +split-by-size-or-count.value.placeholder=Podaj rozmiar(2MB lub 3KB) albo ilość(1 lub 4 lub 5) +split-by-size-or-count.submit=Wyślij #overlay-pdfs -overlay-pdfs.header=Overlay PDF Files -overlay-pdfs.baseFile.label=Select Base PDF File -overlay-pdfs.overlayFiles.label=Select Overlay PDF Files -overlay-pdfs.mode.label=Select Overlay Mode -overlay-pdfs.mode.sequential=Sequential Overlay -overlay-pdfs.mode.interleaved=Interleaved Overlay -overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay -overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) -overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) -overlay-pdfs.position.label=Select Overlay Position -overlay-pdfs.position.foreground=Foreground -overlay-pdfs.position.background=Background -overlay-pdfs.submit=Submit +overlay-pdfs.header=Nałóż pliki PDF +overlay-pdfs.baseFile.label=Wybierz bazowy plik PDF +overlay-pdfs.overlayFiles.label=Wybierz plik(i) nakładane PDF +overlay-pdfs.mode.label=Wybierz tryb nakładania +overlay-pdfs.mode.sequential=Sekwencyjny +overlay-pdfs.mode.interleaved=Przeplatany +overlay-pdfs.mode.fixedRepeat=Ustalona ilośc powtórzeń +overlay-pdfs.counts.label=Ile potwórzeń +overlay-pdfs.counts.placeholder=Wprowadź numerację rozdzieloną przecinkami (2,3,1) +overlay-pdfs.position.label=Wybierz miejsce nakładania +overlay-pdfs.position.foreground=Przód +overlay-pdfs.position.background=Tło +overlay-pdfs.submit=Wyślij #split-by-sections -split-by-sections.title=Split PDF by Sections -split-by-sections.header=Split PDF into Sections -split-by-sections.horizontal.label=Horizontal Divisions -split-by-sections.vertical.label=Vertical Divisions -split-by-sections.horizontal.placeholder=Enter number of horizontal divisions -split-by-sections.vertical.placeholder=Enter number of vertical divisions -split-by-sections.submit=Split PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.title=Podziel PDF przez sekcje +split-by-sections.header=Podziel PDF w sekcje +split-by-sections.horizontal.label=Podział pionowy +split-by-sections.vertical.label=Podział poziomy +split-by-sections.horizontal.placeholder=Podaj ilość podziałów pionowych +split-by-sections.vertical.placeholder=Podaj ilość podziałów poziomych +split-by-sections.submit=Podziel PDF +split-by-sections.merge=Połącz w jednego PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Drukuj plik +printFile.header=Drukuj plik za pomocą drukarki +printFile.selectText.1=Wskaż plik do wydruku +printFile.selectText.2=Wskaż drukarkę +printFile.submit=Drukuj #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Licencje +licenses.title=Licencje stron trzecich +licenses.header=Licencje stron trzecich +licenses.module=Moduł +licenses.version=Wersja +licenses.license=Licencha #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Ankieta +survey.title=Ankieta Stirling-PDF +survey.description=Stirling-PDF nie śledzi swoich użytkowników, więc chciałby poznać opinie swoich użytkowników! +survey.please=Wypełnij proszę ankietę dla nas! +survey.disabled=(Blokada wyskakującego okienka z ankieta zostanie dodane w następnych aktualizacjach, ale będzie dostępna na dole strony) +survey.button=Wypełnij ankietę +survey.dontShowAgain=Nie pokazuj ponownie. #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Przykro nam z powodu problemu! +error.needHelp=Potrzebujesz pomocy/znalazłem usterkę? +error.contactTip=Jeśli ciągle masz problem, skontakuj się z nami. Wyślij zgłoszenia na naszej stronie GitHub albo za pomocą Discorda: +error.404.head=404 - Strona nieodnaleziona | Oho, popsuliśmy kod ! +error.404.1=Nie ma czegoś takiego! +error.404.2=Coś się nie udało! +error.github=Zgłoś problem na GitHub +error.showStack=Pokaż Stack Trace +error.copyStack=Kopiuj Stack Trace +error.githubSubmit=GitHub - wyślij zgłoszenie +error.discordSubmit=Discord - wyślij posta z prośbą o pomoc diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index cc7fe4e89..bf87d427f 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar Função de Usuário 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Comparar compare.header=Comparar PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 74246eb6b..a0df21cdf 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar usuário 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remover #compare compare.title=Comparar compare.header=Comparar PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 836bfc430..1786a47d9 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Schimbați rolul utilizatorului 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compară compare.header=Compară PDF-uri +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compară diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index ab7a1ac9d..d632969f4 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Сохранить пользователя adminUserSettings.changeUserRole=Изменить роль пользователя 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Удалить #compare compare.title=Сравнение compare.header=Сравнение PDFы +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнить diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 6ca3173da..f6f0cc1cd 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Uložiť používateľa adminUserSettings.changeUserRole=Zmeniť rolu používateľa 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Odstrániť #compare compare.title=Porovnať compare.header=Porovnať PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnať diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 5e0e7ec3b..c20ac0d49 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Sačuvaj korisnika adminUserSettings.changeUserRole=Promenite ulogu korisnika 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Ukloni #compare compare.title=Uporedi compare.header=Uporedi PDF fajlove +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 00381ee8b..c67574c67 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Ändra användarens roll 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Jämför 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.2=Dokument 2 compare.submit=Jämför diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 4dfe0e190..321d048f8 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Kullanıcıyı Kaydet adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir adminUserSettings.authenticated=Onaylandı + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Kaldır #compare compare.title=Karşılaştır compare.header=PDF'leri Karşılaştır +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Belge 1 compare.document.2=Belge 2 compare.submit=Karşılaştır diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 2f9356c70..2f68967e8 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Зберегти користувача adminUserSettings.changeUserRole=Змінити роль користувача 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=Видалити #compare compare.title=Порівняння compare.header=Порівняння PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Порівняти diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index f2e7dbc1e..f24f092e3 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -10,8 +10,8 @@ multiPdfDropPrompt=选择(或拖拽)所需的PDF imgPrompt=选择图像 genericSubmit=提交 processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小 -pageOrderPrompt=页面顺序(输入逗号分隔的页码列表): -pageSelectionPrompt=自定义页面选择(输入以逗号分隔的页码列表 1,5,6 或 2n+1 等函数): +pageOrderPrompt=页面顺序(输入逗号分隔的页码列表或函数): +pageSelectionPrompt=自定义页面选择(输入以逗号分隔的页码列表或函数:1,5,6、2n+1): goToPage=到 true=对 false=错 @@ -33,7 +33,7 @@ sizes.small=小型尺寸 sizes.medium=中型尺寸 sizes.large=大型尺寸 sizes.x-large=超大型尺寸 -error.pdfPassword=PDF 文档有密码,未提供密码或密码不正确 +error.pdfPassword=PDF文档有密码,未提供密码或密码不正确 delete=删除 username=用户名 password=密码 @@ -55,13 +55,13 @@ userNotFoundMessage=未找到用户。 incorrectPasswordMessage=当前密码不正确。 usernameExistsMessage=新用户名已存在。 invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。 -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +confirmPasswordErrorMessage=两次密码不一致。 deleteCurrentUserMessage=无法删除当前登录的用户。 deleteUsernameExistsMessage=用户名不存在,无法删除。 downgradeCurrentUserMessage=无法降级当前用户的角色 downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。 -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=该用户已作为OAuth2用户存在。 +userAlreadyExistsWebMessage=该用户已作为Web用户存在。 error=错误 oops=哎呀! help=帮助 @@ -72,21 +72,21 @@ visitGithub=访问Github仓库 donate=捐款 color=颜色 sponsor=赞助 -info=Info +info=信息 ############### # Pipeline # ############### -pipeline.header=流水线菜单 (Beta) +pipeline.header=流水线菜单(Beta) pipeline.uploadButton=上传自定义流水线 pipeline.configureButton=配置 pipeline.defaultOption=自定义 pipeline.submitButton=提交 pipeline.help=工作流帮助 pipeline.scanHelp=文件夹扫描帮助 -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=确认删除该工作流? ###################### # Pipeline Options # @@ -125,7 +125,7 @@ navbar.sections.edit=查看和编辑 ############# settings.title=设置 settings.update=可更新 -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable=当前版本为 {0},新版本 ({1}) 可用。 settings.appVersion=应用程序版本: settings.downloadOption.title=选择下载选项(单个文件非压缩文件): settings.downloadOption.1=在同一窗口打开 @@ -133,10 +133,10 @@ settings.downloadOption.2=在新窗口中打开 settings.downloadOption.3=下载文件 settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。 settings.signOut=登出 -settings.accountSettings=帐号设定 -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.accountSettings=账号设定 +settings.bored.help=启用彩蛋游戏 +settings.cacheInputs.name=保存表单输入 +settings.cacheInputs.help=保存先前输入以供日后使用 changeCreds.title=更改凭证 changeCreds.header=更新您的账户详情 @@ -149,8 +149,8 @@ changeCreds.submit=提交更改 -account.title=帐号设定 -account.accountSettings=帐号设定 +account.title=账号设定 +account.accountSettings=账号设定 account.adminSettings=管理员设置 - 查看和添加用户 account.userControlSettings=用户控制设置 account.changeUsername=更改用户名 @@ -161,11 +161,11 @@ account.newPassword=新密码 account.changePassword=更改密码 account.confirmNewPassword=确认新密码 account.signOut=退出登录 -account.yourApiKey=您的 API 密钥 +account.yourApiKey=您的API密钥 account.syncTitle=将浏览器设置与账户同步 account.settingsCompare=设置比较: account.property=属性 -account.webBrowserSettings=Web 浏览器设置 +account.webBrowserSettings=Web浏览器设置 account.syncToBrowser=同步账户 -> 浏览器 account.syncToAccount=同步账户 <- 浏览器 @@ -175,21 +175,38 @@ adminUserSettings.header=管理员用户控制设置 adminUserSettings.admin=管理员 adminUserSettings.user=用户 adminUserSettings.addUser=添加新用户 -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.deleteUser=删除用户 +adminUserSettings.confirmDeleteUser=确认删除该用户? adminUserSettings.usernameInfo=用户名只能包含字母、数字和以下特殊字符@._+-,或者必须是有效的电子邮件地址。 adminUserSettings.roles=角色 adminUserSettings.role=角色 adminUserSettings.actions=操作 -adminUserSettings.apiUser=受限制的 API 用户 -adminUserSettings.extraApiUser=额外受限制的 API 用户 -adminUserSettings.webOnlyUser=仅限 Web 用户 +adminUserSettings.apiUser=受限制的API用户 +adminUserSettings.extraApiUser=额外受限制的API用户 +adminUserSettings.webOnlyUser=仅限Web用户 adminUserSettings.demoUser=演示用户(无自定义设置) adminUserSettings.internalApiUser=内部API用户 adminUserSettings.forceChange=强制用户在登录时更改用户名/密码 adminUserSettings.submit=保存用户 adminUserSettings.changeUserRole=更改用户角色 -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=已验证 + + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File ############# # HOME-PAGE # @@ -332,13 +349,13 @@ home.compare.title=比较 home.compare.desc=比较并显示两个PDF文档之间的差异 compare.tags=区分、对比、更改、分析 -home.certSign.title=使用证书签署 -home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签署 +home.certSign.title=使用证书签名 +home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签名 certSign.tags=身份验证、PEM、P12、官方、加密 -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=移除证书签名 +home.removeCertSign.desc=移除PDF的证书签名 +removeCertSign.tags=身份验证、PEM、P12、官方、加密 home.pageLayout.title=多页布局 home.pageLayout.desc=将PDF文档的多个页面合并成一页 @@ -459,13 +476,13 @@ login.invalid=用户名或密码无效。 login.locked=您的账户已被锁定。 login.signinTitle=请登录 login.ssoSignIn=通过单点登录登录 -login.oauth2AutoCreateDisabled=OAUTH2自动创建用户已禁用 -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2AutoCreateDisabled=OAuth2自动创建用户已禁用 +login.oauth2RequestNotFound=找不到验证请求 +login.oauth2InvalidUserInfoResponse=无效的用户信息响应 +login.oauth2invalidRequest=无效请求 +login.oauth2AccessDenied=拒绝访问 +login.oauth2InvalidTokenResponse=无效的Token响应 +login.oauth2InvalidIdToken=无效的Token #auto-redact @@ -482,15 +499,15 @@ autoRedact.submitButton=提交 #showJS -showJS.title=显示 JavaScript -showJS.header=显示 JavaScript -showJS.downloadJS=下载 JavaScript +showJS.title=显示JavaScript +showJS.header=显示JavaScript +showJS.downloadJS=下载JavaScript showJS.submit=显示 #pdfToSinglePage -pdfToSinglePage.title=PDF转为单页 -pdfToSinglePage.header=PDF转为单页 +pdfToSinglePage.title=PDF转单页 +pdfToSinglePage.header=将PDF转换为单页 pdfToSinglePage.submit=转为单页 @@ -498,7 +515,7 @@ pdfToSinglePage.submit=转为单页 pageExtracter.title=提取页面 pageExtracter.header=提取页面 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 @@ -510,7 +527,7 @@ getPdfInfo.downloadJson=下载JSON #markdown-to-pdf MarkdownToPDF.title=Markdown转PDF -MarkdownToPDF.header=Markdown转PDF +MarkdownToPDF.header=将Markdown转换为PDF MarkdownToPDF.submit=转换 MarkdownToPDF.help=正在努力中 MarkdownToPDF.credit=此服务使用WeasyPrint进行文件转换。 @@ -519,14 +536,14 @@ MarkdownToPDF.credit=此服务使用WeasyPrint进行文件转换。 #url-to-pdf URLToPDF.title=URL转PDF -URLToPDF.header=URL转PDF +URLToPDF.header=将URL转换为PDF URLToPDF.submit=转换 URLToPDF.credit=此服务使用WeasyPrint进行文件转换。 #html-to-pdf HTMLToPDF.title=HTML转PDF -HTMLToPDF.header=HTML转PDF +HTMLToPDF.header=将HTML转换为PDF HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件 HTMLToPDF.submit=转换 HTMLToPDF.credit=此服务使用WeasyPrint进行文件转换。 @@ -539,7 +556,7 @@ HTMLToPDF.marginLeft=页面左上边距-以毫米为单位(填空则使用默 HTMLToPDF.marginRight=页面右边距-以毫米为单位(填空则使用默认值) HTMLToPDF.printBackground=页面背景渲染 HTMLToPDF.defaultHeader=启用默认页头(文件名称和页码) -HTMLToPDF.cssMediaType=更换页面的CSS media type. +HTMLToPDF.cssMediaType=更换页面的CSS媒体类型。 HTMLToPDF.none=无 HTMLToPDF.print=打印 HTMLToPDF.screen=屏幕 @@ -556,8 +573,8 @@ AddStampRequest.fontSize=字体/图片大小 AddStampRequest.rotation=旋转角度 AddStampRequest.opacity=透明度 AddStampRequest.position=定位 -AddStampRequest.overrideX=覆盖 X 坐标 -AddStampRequest.overrideY=覆盖 Y 坐标 +AddStampRequest.overrideX=覆盖X坐标 +AddStampRequest.overrideY=覆盖Y坐标 AddStampRequest.customMargin=自定义外边距 AddStampRequest.customColor=自定义文本颜色 AddStampRequest.submit=提交 @@ -647,27 +664,27 @@ scalePages.submit=提交 #certSign certSign.title=证书签名 -certSign.header=使用您的证书签署 PDF(进行中) -certSign.selectPDF=选择要签名的 PDF 文件: -certSign.jksNote=注意:如果您的证书类型未在下面列出,请使用 keytool 命令行工具将其转换为 Java Keystore (.jks) 文件。 然后,选择下面的 .jks 文件选项。 -certSign.selectKey=选择您的私钥文件(PKCS#8 格式,可以是 .pem 或 .der): -certSign.selectCert=选择您的证书文件(X.509 格式,可以是 .pem 或 .der): -certSign.selectP12=选择您的 PKCS#12 密钥库文件(.p12 或 .pfx)(可选,如果提供,它应该包含您的私钥和证书): -certSign.selectJKS=选择你的 Java Keystore 文件 (.jks 或 .keystore): +certSign.header=使用您的证书签名PDF(进行中) +certSign.selectPDF=选择要签名的PDF文件: +certSign.jksNote=注意:如果您的证书类型未在下面列出,请使用keytool命令行工具将其转换为Java Keystore(.jks)文件。 然后,选择下面的.jks文件选项。 +certSign.selectKey=选择您的私钥文件(PKCS#8格式,可以是.pem或.der): +certSign.selectCert=选择您的证书文件(X.509格式,可以是.pem或.der): +certSign.selectP12=选择您的PKCS#12密钥库文件(.p12或.pfx)(可选,如果提供,它应该包含您的私钥和证书): +certSign.selectJKS=选择你的Java Keystore文件 (.jks或.keystore): certSign.certType=证书类型 certSign.password=输入您的密钥库或私钥密码(如果有): certSign.showSig=显示签名 certSign.reason=原因 certSign.location=位置 certSign.name=名称 -certSign.submit=签署 PDF +certSign.submit=给PDF签名 #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=移除证书签名 +removeCertSign.header=移除PDF的证书签名 +removeCertSign.selectPDF=选择PDF文件: +removeCertSign.submit=移除签名 #removeBlanks @@ -688,7 +705,9 @@ removeAnnotations.submit=删除 #compare 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.2=文档 2 compare.submit=比较 @@ -718,14 +737,14 @@ sign.add=添加 #repair repair.title=修复 -repair.header=修复 PDF +repair.header=修复PDF repair.submit=修复 #flatten flatten.title=展平 flatten.header=展平 PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=仅展平表格 flatten.submit=展平 @@ -752,7 +771,7 @@ ocr.selectText.4=清理页面,降低OCR在噪点中识别到文本的可能。 ocr.selectText.5=清洁页面,降低OCR在噪点中识别到文本的可能,保持输出的清洁。 ocr.selectText.6=忽略有交互式文本的页面,只对有图像的页面进行OCR。 ocr.selectText.7=强制OCR,将OCR每个页面,删除所有的原始文本元素。 -ocr.selectText.8=Normal (如果PDF包含文本,将出现错误) +ocr.selectText.8=正常 (如果PDF包含文本,将出现错误) ocr.selectText.9=额外设置 ocr.selectText.10=OCR模式 ocr.selectText.11=OCR后移除图像(移除所有图像,只有在转换步骤中才有用)。 @@ -773,7 +792,7 @@ extractImages.submit=提取 fileToPDF.title=文件转换为PDF fileToPDF.header=将任何文件转换为PDF。 fileToPDF.credit=此服务使用LibreOffice和Unoconv进行文件转换。 -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=支持的文件类型 fileToPDF.supportedFileTypes=支持的文件类型应该包括以下几种,但是,对于支持的格式的完整更新列表,请参考LibreOffice文档。 fileToPDF.submit=转换为 PDF @@ -781,12 +800,12 @@ fileToPDF.submit=转换为 PDF #compress compress.title=压缩 compress.header=压缩PDF -compress.credit=此服务使用 Ghostscript 进行 PDF 压缩/优化。 +compress.credit=此服务使用Ghostscript进行PDF压缩/优化。 compress.selectText.1=手动模式 - 从 1 到 4 compress.selectText.2=优化级别: compress.selectText.3=4(文本图像很糟糕) -compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的 PDF -compress.selectText.5=预期 PDF 大小(例如 25MB、10.8MB、25KB) +compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的PDF +compress.selectText.5=预期PDF大小(例如:25MB、10.8MB、25KB) compress.submit=压缩 @@ -803,7 +822,7 @@ merge.title=合并 merge.header=合并多个PDF(2个以上)。 merge.sortByName=按名称排序 merge.sortByDate=按日期排序 -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=删除合并文件的数字签名吗? merge.submit=合并 @@ -821,8 +840,8 @@ pdfOrganiser.mode.6=奇偶拆分 pdfOrganiser.mode.7=删除第一页 pdfOrganiser.mode.8=删除最后一页 pdfOrganiser.mode.9=删除第一页和最后一页 -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1) +pdfOrganiser.mode.10=奇偶合并 +pdfOrganiser.placeholder=(例如:1,3,2 或 4-8,2,10-12 或 2n-1) #multiTool @@ -839,7 +858,7 @@ pageRemover.title=删除页面 pageRemover.header=PDF页面移除器 pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表): pageRemover.submit=删除页面 -pageRemover.placeholder=(例如 1,2,6 或 1-10,15-30) +pageRemover.placeholder=(例如:1,2,6 或 1-10,15-30) #rotate @@ -866,7 +885,7 @@ split.submit=拆分 #merge imageToPDF.title=图片转PDF -imageToPDF.header=图像转为PDF +imageToPDF.header=将图片转换为PDF imageToPDF.submit=转换 imageToPDF.selectLabel=图片适应选项 imageToPDF.fillPage=填充页面 @@ -880,7 +899,7 @@ imageToPDF.selectText.5=转换为独立的PDF文件 #pdfToImage pdfToImage.title=PDF转图片 -pdfToImage.header=PDF转图片 +pdfToImage.header=将PDF转换为图片 pdfToImage.selectText=图像格式 pdfToImage.singleOrMultiple=图像结果类型 pdfToImage.single=单张图片 @@ -976,55 +995,55 @@ changeMetadata.submit=更改 #pdfToPDFA -pdfToPDFA.title=将PDF转换为PDF/A -pdfToPDFA.header=PDF转换为PDF/A +pdfToPDFA.title=PDF转PDF/A +pdfToPDFA.header=将PDF转换为PDF/A pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.submit=转换 pdfToPDFA.tip=目前不支持上传多个 -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.outputFormat=输出格式 +pdfToPDFA.pdfWithDigitalSignature=该PDF包含数字签名,下一步将移除该签名。 #PDFToWord -PDFToWord.title=PDF to Word -PDFToWord.header=将PDF转换成Word +PDFToWord.title=PDF转Word +PDFToWord.header=将PDF转换为Word PDFToWord.selectText.1=输出文件格式 PDFToWord.credit=此服务使用LibreOffice进行文件转换。 PDFToWord.submit=转换 #PDFToPresentation -PDFToPresentation.title=PDF转换为演示文稿 -PDFToPresentation.header=将PDF转为演示文稿 +PDFToPresentation.title=PDF转演示文稿 +PDFToPresentation.header=将PDF转换为演示文稿 PDFToPresentation.selectText.1=输出文件格式 PDFToPresentation.credit=此服务使用LibreOffice进行文件转换。 PDFToPresentation.submit=转换 #PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=将PDF转换成文本/RTF +PDFToText.title=PDF转文本/RTF +PDFToText.header=将PDF转换为文本/RTF PDFToText.selectText.1=输出文件格式 PDFToText.credit=此服务使用LibreOffice进行文件转换。 PDFToText.submit=转换 #PDFToHTML -PDFToHTML.title=PDF To HTML -PDFToHTML.header=将PDF转换成HTML +PDFToHTML.title=PDF转HTML +PDFToHTML.header=将PDF转换为HTML PDFToHTML.credit=此服务使用pdftohtml进行文件转换。 PDFToHTML.submit=转换 #PDFToXML -PDFToXML.title=PDF To XML +PDFToXML.title=PDF转XML PDFToXML.header=将PDF转换为XML PDFToXML.credit=此服务使用LibreOffice进行文件转换。 PDFToXML.submit=转换 #PDFToCSV -PDFToCSV.title=PDF To CSV -PDFToCSV.header=将 PDF 转换为 CSV +PDFToCSV.title=PDF转CSV +PDFToCSV.header=将PDF转换为CSV PDFToCSV.prompt=选择需要提取表格的页面 PDFToCSV.submit=提取 @@ -1036,7 +1055,7 @@ split-by-size-or-count.type.size=按照大小 split-by-size-or-count.type.pageCount=按照页数 split-by-size-or-count.type.docCount=按照文档数 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=提交 @@ -1049,7 +1068,7 @@ overlay-pdfs.mode.sequential=按顺序叠加 overlay-pdfs.mode.interleaved=交错叠加 overlay-pdfs.mode.fixedRepeat=固定重复叠加 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.foreground=前面(上面) overlay-pdfs.position.background=后面(下面) @@ -1068,11 +1087,11 @@ split-by-sections.merge=是否合并为一个pdf #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=打印文件 +printFile.header=使用打印机打印文件 +printFile.selectText.1=选择要打印的文件 +printFile.selectText.2=输入打印机名称 +printFile.submit=打印 #licenses @@ -1084,13 +1103,13 @@ licenses.version=版本 licenses.license=许可证 #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=调查 +survey.title=Stirling-PDF调查 +survey.description=Stirling-PDF没有跟踪器,所以我们希望听取用户的意见来改进Stirling-PDF! +survey.please=请考虑参加我们的调查! +survey.disabled=(调查弹出窗口将在后续更新中被禁用,但可在页脚处查看) +survey.button=参与调查 +survey.dontShowAgain=不再显示 #error diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 8bcc59eed..6a4b3ac09 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=儲存 adminUserSettings.changeUserRole=更改使用者身份 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 # ############# @@ -689,6 +706,8 @@ removeAnnotations.submit=移除 #compare compare.title=比較 compare.header=比較 PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=文件 1 compare.document.2=文件 2 compare.submit=比較 diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 4290126cd..2d4fe8efc 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -176,19 +176,19 @@ }, { "moduleName": "com.twelvemonkeys.common:common-image", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.common:common-io", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.common:common-lang", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, @@ -206,19 +206,19 @@ }, { "moduleName": "com.twelvemonkeys.imageio:imageio-core", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-jpeg", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-metadata", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, @@ -313,21 +313,21 @@ { "moduleName": "io.swagger.core.v3:swagger-annotations-jakarta", "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", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "io.swagger.core.v3:swagger-core-jakarta", "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", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "io.swagger.core.v3:swagger-models-jakarta", "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", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -859,19 +859,19 @@ }, { "moduleName": "org.springdoc:springdoc-openapi-starter-common", - "moduleVersion": "2.5.0", + "moduleVersion": "2.2.0", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-api", - "moduleVersion": "2.5.0", + "moduleVersion": "2.2.0", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-ui", - "moduleVersion": "2.5.0", + "moduleVersion": "2.2.0", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -1137,7 +1137,7 @@ { "moduleName": "org.springframework:spring-webmvc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.9", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1175,7 +1175,7 @@ { "moduleName": "org.webjars:swagger-ui", "moduleUrl": "http://webjars.org", - "moduleVersion": "5.13.0", + "moduleVersion": "5.2.0", "moduleLicense": "Apache 2.0", "moduleLicenseUrl": "https://github.com/swagger-api/swagger-ui" }, diff --git a/src/main/resources/static/css/error.css b/src/main/resources/static/css/error.css index 40ff7669e..329640852 100644 --- a/src/main/resources/static/css/error.css +++ b/src/main/resources/static/css/error.css @@ -1,8 +1,3 @@ -p { - text-align: center; - margin-top: 2em; -} - .features-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr)); diff --git a/src/main/resources/static/manifest.json b/src/main/resources/static/manifest.json index 88c7906a2..8ca262b47 100644 --- a/src/main/resources/static/manifest.json +++ b/src/main/resources/static/manifest.json @@ -3,12 +3,12 @@ "short_name": "Stirling-PDF", "icons": [ { - "src": "/android-icon-192x192.png", + "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/android-icon-512x512.png", + "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } diff --git a/src/main/resources/static/site.webmanifest b/src/main/resources/static/site.webmanifest index 42f8bb0c3..24f2e37c9 100644 --- a/src/main/resources/static/site.webmanifest +++ b/src/main/resources/static/site.webmanifest @@ -1,17 +1,17 @@ { - "name": "Stirling PDF", - "short_name": "Stirling PDF", + "name": "Stirling-PDF", + "short_name": "Stirling-PDF", "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } ], "theme_color": "#ffffff", "background_color": "#ffffff", diff --git a/src/main/resources/templates/account.html b/src/main/resources/templates/account.html index ddb48a30d..a0e543978 100644 --- a/src/main/resources/templates/account.html +++ b/src/main/resources/templates/account.html @@ -13,9 +13,12 @@
+
+ settings_account_box + User Settings +
-

User Settings

Default message if not found @@ -247,9 +250,9 @@ - - - + + + diff --git a/src/main/resources/templates/addUsers.html b/src/main/resources/templates/addUsers.html index b9790888d..025f758ff 100644 --- a/src/main/resources/templates/addUsers.html +++ b/src/main/resources/templates/addUsers.html @@ -12,10 +12,13 @@

-
+
+
+ manage_accounts + Admin User Control Settings +
-

Admin User Control Settings

PropertyAccount SettingWeb Browser SettingPropertyAccount SettingWeb Browser Setting
- - - - - - - - - - - - - - - - -
UsernameRolesActionsAuthenticated
-
- -
- - edit -
+
+ + + + + + + + + + + + + + + + + + + +
UIDUsernameRolesActionsAuthenticated
+
+ +
+ edit +
+
+
diff --git a/src/main/resources/templates/database.html b/src/main/resources/templates/database.html new file mode 100644 index 000000000..4f6f8a864 --- /dev/null +++ b/src/main/resources/templates/database.html @@ -0,0 +1,71 @@ + + + + + + + +
+
+ +

+
+
+
+
+ database + Database Im-/Export +
+

+

+
+ + + + + + + + + + + + + + + + + + + + + +
File NameCreation DateFile Size
deletebackupdownload
+
+
+
+
+

+

+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 2e9316eb2..291b75e88 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -13,7 +13,7 @@ - + diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index 241b98fca..430e98ce4 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -274,7 +274,7 @@