Compare commits
89
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b0b141074 | ||
|
|
42e484e30a | ||
|
|
9fb22d66f3 | ||
|
|
22daafcba3 | ||
|
|
31410f42f8 | ||
|
|
4ba84ec35f | ||
|
|
f8f541af8d | ||
|
|
9ed16687fa | ||
|
|
dbb5463d89 | ||
|
|
7b05e57a6d | ||
|
|
9df9c8caf2 | ||
|
|
d9e0970bd9 | ||
|
|
2a36a3c585 | ||
|
|
9fab426143 | ||
|
|
ac88ac077f | ||
|
|
579ea8948c | ||
|
|
b5c0ab3b11 | ||
|
|
a4dba200e0 | ||
|
|
5412326b49 | ||
|
|
b57a6d3354 | ||
|
|
b995a7f413 | ||
|
|
e20df4ca22 | ||
|
|
9b960f2e28 | ||
|
|
6a8183b0fd | ||
|
|
b4746fe377 | ||
|
|
378696a140 | ||
|
|
460cc827a6 | ||
|
|
db2e93d285 | ||
|
|
6ca248d68e | ||
|
|
8a22f2e52a | ||
|
|
31f5b73a05 | ||
|
|
0dab986c3d | ||
|
|
894293d378 | ||
|
|
178474d254 | ||
|
|
a8773cb769 | ||
|
|
2096ae3a1f | ||
|
|
bc40a856d8 | ||
|
|
61093191fb | ||
|
|
521c308e63 | ||
|
|
e7207475ee | ||
|
|
6c37815157 | ||
|
|
3b5f607cbf | ||
|
|
388bb439d7 | ||
|
|
279a307153 | ||
|
|
a20fb83d31 | ||
|
|
c1f569b2d5 | ||
|
|
bfda167b89 | ||
|
|
1090779081 | ||
|
|
edee6529ff | ||
|
|
8b81acf105 | ||
|
|
2969385844 | ||
|
|
b8dfb835da | ||
|
|
86d95d3fad | ||
|
|
e0ce76201a | ||
|
|
7c8ff1820f | ||
|
|
fb06028a5a | ||
|
|
649b426e4a | ||
|
|
0227274a03 | ||
|
|
49b79b5e66 | ||
|
|
793d25725a | ||
|
|
b0311a6325 | ||
|
|
709280895c | ||
|
|
700ef3eefc | ||
|
|
baea057050 | ||
|
|
0cb6ae1270 | ||
|
|
0e292a4d07 | ||
|
|
c2648e20b7 | ||
|
|
08bccc4607 | ||
|
|
71d1e5e2c4 | ||
|
|
bf7987b483 | ||
|
|
914e6c0129 | ||
|
|
e4e9bba413 | ||
|
|
4f66948ed6 | ||
|
|
7b726496c7 | ||
|
|
93c11d1702 | ||
|
|
1bfe37f2fe | ||
|
|
5099dc049e | ||
|
|
b9d71cdef0 | ||
|
|
f2dfc30f80 | ||
|
|
98fdf1a01b | ||
|
|
d5453a06cd | ||
|
|
6009310c69 | ||
|
|
b0fe3877a9 | ||
|
|
640aa861d4 | ||
|
|
2f33d0318e | ||
|
|
4634ccb25d | ||
|
|
153faec52a | ||
|
|
f06f6d30d1 | ||
|
|
ce42c3e41a |
@@ -13,8 +13,6 @@
|
||||
"reecebrowne",
|
||||
"DarioGii",
|
||||
"ConnorYoh",
|
||||
"EthanHealy01",
|
||||
"jbrunton96",
|
||||
"balazs-szucs"
|
||||
"EthanHealy01"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "gradle" # See documentation for possible values
|
||||
directories:
|
||||
directories:
|
||||
- "/" # Location of package manifests
|
||||
- "/app/common"
|
||||
- "/app/core"
|
||||
|
||||
+1
-1
@@ -200,4 +200,4 @@
|
||||
from_name: "tauri"
|
||||
- name: "license-review-required"
|
||||
color: "EDEDED"
|
||||
description: "This PR requires a license review"
|
||||
description: "This PR requires a license review"
|
||||
@@ -11,16 +11,13 @@ adjusting the format.
|
||||
Usage:
|
||||
python check_language_toml.py --reference-file <path_to_reference_file> --branch <branch_name> [--actor <actor_name>] [--files <list_of_changed_files>]
|
||||
"""
|
||||
|
||||
# Sample for Windows:
|
||||
# python .github/scripts/check_language_toml.py --reference-file frontend/public/locales/en-GB/translation.toml --branch "" --files frontend/public/locales/de-DE/translation.toml frontend/public/locales/fr-FR/translation.toml
|
||||
|
||||
import argparse
|
||||
import glob
|
||||
import os
|
||||
import argparse
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
import tomllib # Python 3.11+ (stdlib)
|
||||
import tomli_w # For writing TOML files
|
||||
|
||||
@@ -39,8 +36,7 @@ def find_duplicate_keys(file_path, keys=None, prefix=""):
|
||||
duplicates = []
|
||||
|
||||
# Load TOML file
|
||||
file_path = Path(file_path)
|
||||
with file_path.open("rb") as file:
|
||||
with open(file_path, "rb") as file:
|
||||
data = tomllib.load(file)
|
||||
|
||||
def process_dict(obj, current_prefix=""):
|
||||
@@ -59,8 +55,8 @@ def find_duplicate_keys(file_path, keys=None, prefix=""):
|
||||
return duplicates
|
||||
|
||||
|
||||
# Maximum size for TOML files (e.g., 570 KB)
|
||||
MAX_FILE_SIZE = 570 * 1024
|
||||
# Maximum size for TOML files (e.g., 500 KB)
|
||||
MAX_FILE_SIZE = 500 * 1024
|
||||
|
||||
|
||||
def parse_toml_file(file_path):
|
||||
@@ -69,8 +65,7 @@ def parse_toml_file(file_path):
|
||||
:param file_path: Path to the TOML file.
|
||||
:return: Dictionary with flattened keys.
|
||||
"""
|
||||
file_path = Path(file_path)
|
||||
with file_path.open("rb") as file:
|
||||
with open(file_path, "rb") as file:
|
||||
data = tomllib.load(file)
|
||||
|
||||
def flatten_dict(d, parent_key="", sep="."):
|
||||
@@ -113,8 +108,7 @@ def write_toml_file(file_path, updated_properties):
|
||||
"""
|
||||
nested_data = unflatten_dict(updated_properties)
|
||||
|
||||
file_path = Path(file_path)
|
||||
with file_path.open("wb") as file:
|
||||
with open(file_path, "wb") as file:
|
||||
tomli_w.dump(nested_data, file)
|
||||
|
||||
|
||||
@@ -125,23 +119,18 @@ def update_missing_keys(reference_file, file_list, branch=""):
|
||||
:param file_list: List of translation files to update.
|
||||
:param branch: Branch where the files are located.
|
||||
"""
|
||||
reference_file = Path(reference_file)
|
||||
reference_properties = parse_toml_file(reference_file)
|
||||
branch_path = Path(branch) if branch else Path()
|
||||
|
||||
for file_path in file_list:
|
||||
file_path = Path(file_path)
|
||||
language_dir = file_path.parent.name
|
||||
reference_lang_dir = reference_file.parent.name
|
||||
basename_current_file = os.path.basename(os.path.join(branch, file_path))
|
||||
if (
|
||||
language_dir == reference_lang_dir
|
||||
or file_path.suffix != ".toml"
|
||||
or file_path.parents[1].name != "locales"
|
||||
basename_current_file == os.path.basename(reference_file)
|
||||
or not file_path.endswith(".toml")
|
||||
or not os.path.dirname(file_path).endswith("locales")
|
||||
):
|
||||
print(f"Skipping file: {file_path}")
|
||||
continue
|
||||
|
||||
current_properties = parse_toml_file(branch_path / file_path)
|
||||
current_properties = parse_toml_file(os.path.join(branch, file_path))
|
||||
updated_properties = {}
|
||||
|
||||
for ref_key, ref_value in reference_properties.items():
|
||||
@@ -152,7 +141,7 @@ def update_missing_keys(reference_file, file_list, branch=""):
|
||||
# Add missing key with reference value
|
||||
updated_properties[ref_key] = ref_value
|
||||
|
||||
write_toml_file(branch_path / file_path, updated_properties)
|
||||
write_toml_file(os.path.join(branch, file_path), updated_properties)
|
||||
|
||||
|
||||
def check_for_missing_keys(reference_file, file_list, branch):
|
||||
@@ -160,17 +149,14 @@ def check_for_missing_keys(reference_file, file_list, branch):
|
||||
|
||||
|
||||
def read_toml_keys(file_path):
|
||||
file_path = Path(file_path)
|
||||
if file_path.is_file():
|
||||
if os.path.isfile(file_path) and os.path.exists(file_path):
|
||||
return parse_toml_file(file_path)
|
||||
return {}
|
||||
|
||||
|
||||
def check_for_differences(reference_file, file_list, branch, actor):
|
||||
reference_branch = branch
|
||||
reference_file = Path(reference_file)
|
||||
basename_reference_file = reference_file.name
|
||||
branch_path = Path(branch) if branch else Path()
|
||||
basename_reference_file = os.path.basename(reference_file)
|
||||
|
||||
report = []
|
||||
report.append(f"#### 🔄 Reference Branch: `{reference_branch}`")
|
||||
@@ -184,44 +170,39 @@ def check_for_differences(reference_file, file_list, branch, actor):
|
||||
if len(file_list) == 1:
|
||||
file_arr = file_list[0].split()
|
||||
|
||||
base_dir = Path.cwd() / "frontend" / "public" / "locales"
|
||||
base_dir = os.path.abspath(
|
||||
os.path.join(os.getcwd(), "frontend", "public", "locales")
|
||||
)
|
||||
|
||||
for file_path in file_arr:
|
||||
file_path = Path(file_path)
|
||||
file_normpath = file_path
|
||||
absolute_path = file_normpath.resolve()
|
||||
|
||||
basename_current_file = (branch_path / file_normpath).name
|
||||
locale_dir = file_normpath.parent.name
|
||||
report.append(f"#### 📃 **File Check:** `{locale_dir}/{basename_current_file}`")
|
||||
file_normpath = os.path.normpath(file_path)
|
||||
absolute_path = os.path.abspath(file_normpath)
|
||||
|
||||
# Verify that file is within the expected directory
|
||||
if not absolute_path.is_relative_to(base_dir):
|
||||
has_differences = True
|
||||
report.append(
|
||||
f"\n⚠️ Unsafe file found: `{locale_dir}/{basename_current_file}`\n\n---\n"
|
||||
)
|
||||
continue
|
||||
if not absolute_path.startswith(base_dir):
|
||||
raise ValueError(f"Unsafe file found: {file_normpath}")
|
||||
|
||||
# Verify file size before processing
|
||||
if (branch_path / file_normpath).stat().st_size > MAX_FILE_SIZE:
|
||||
has_differences = True
|
||||
report.append(
|
||||
f"\n⚠️ The file `{locale_dir}/{basename_current_file}` is too large and could pose a security risk.\n\n---\n"
|
||||
if os.path.getsize(os.path.join(branch, file_normpath)) > MAX_FILE_SIZE:
|
||||
raise ValueError(
|
||||
f"The file {file_normpath} is too large and could pose a security risk."
|
||||
)
|
||||
continue
|
||||
|
||||
basename_current_file = os.path.basename(os.path.join(branch, file_normpath))
|
||||
locale_dir = os.path.basename(os.path.dirname(file_normpath))
|
||||
|
||||
if basename_current_file == basename_reference_file and locale_dir == "en-GB":
|
||||
continue
|
||||
|
||||
if (
|
||||
file_normpath.suffix != ".toml"
|
||||
not file_normpath.endswith(".toml")
|
||||
or basename_current_file != "translation.toml"
|
||||
):
|
||||
continue
|
||||
|
||||
only_reference_file = False
|
||||
current_keys = read_toml_keys(branch_path / file_path)
|
||||
report.append(f"#### 📃 **File Check:** `{locale_dir}/{basename_current_file}`")
|
||||
current_keys = read_toml_keys(os.path.join(branch, file_path))
|
||||
reference_key_count = len(reference_keys)
|
||||
current_key_count = len(current_keys)
|
||||
|
||||
@@ -266,13 +247,13 @@ def check_for_differences(reference_file, file_list, branch, actor):
|
||||
else:
|
||||
report.append("2. **Test Status:** ✅ **_Passed_**")
|
||||
|
||||
if find_duplicate_keys(branch_path / file_normpath):
|
||||
if find_duplicate_keys(os.path.join(branch, file_normpath)):
|
||||
has_differences = True
|
||||
output = "\n".join(
|
||||
[
|
||||
f" - `{key}`: first at {first}, duplicate at `{duplicate}`"
|
||||
for key, first, duplicate in find_duplicate_keys(
|
||||
branch_path / file_normpath
|
||||
os.path.join(branch, file_normpath)
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -11,10 +11,6 @@ on:
|
||||
allow_fork:
|
||||
description: "Allow deploying fork PR?"
|
||||
required: false
|
||||
type: choice
|
||||
options:
|
||||
- "true"
|
||||
- "false"
|
||||
default: "false"
|
||||
|
||||
permissions:
|
||||
@@ -35,7 +31,7 @@ jobs:
|
||||
pr_ref: ${{ steps.resolve.outputs.ref }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -46,7 +42,7 @@ jobs:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
let prNumber = context.eventName === 'workflow_dispatch'
|
||||
? parseInt(context.payload.inputs.pr, 10)
|
||||
? parseInt(process.env.INPUT_PR, 10)
|
||||
: context.payload.number;
|
||||
|
||||
if (!Number.isInteger(prNumber)) { core.setFailed('Invalid PR number'); return; }
|
||||
@@ -111,7 +107,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -180,7 +176,7 @@ jobs:
|
||||
fetch-depth: 0 # Fetch full history for commit hash detection
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
@@ -189,56 +185,93 @@ jobs:
|
||||
echo "versionNumber=$VERSION" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_API }}
|
||||
|
||||
- name: Get commit hash for app
|
||||
id: commit-hash
|
||||
- name: Get commit hashes for frontend and backend
|
||||
id: commit-hashes
|
||||
run: |
|
||||
# Get last commit that touched the application code
|
||||
APP_HASH=$(git log -1 --format="%H" -- . 2>/dev/null || echo "")
|
||||
if [ -z "$APP_HASH" ]; then
|
||||
APP_HASH="no-changes"
|
||||
# Get last commit that touched the frontend folder, docker/frontend, or docker/compose
|
||||
FRONTEND_HASH=$(git log -1 --format="%H" -- frontend/ docker/frontend/ docker/compose/ 2>/dev/null || echo "")
|
||||
if [ -z "$FRONTEND_HASH" ]; then
|
||||
FRONTEND_HASH="no-frontend-changes"
|
||||
fi
|
||||
|
||||
echo "App hash: $APP_HASH"
|
||||
echo "app_hash=$APP_HASH" >> $GITHUB_OUTPUT
|
||||
# Get last commit that touched backend code, docker/backend, or docker/compose
|
||||
BACKEND_HASH=$(git log -1 --format="%H" -- app/ docker/backend/ docker/compose/ 2>/dev/null || echo "")
|
||||
if [ -z "$BACKEND_HASH" ]; then
|
||||
BACKEND_HASH="no-backend-changes"
|
||||
fi
|
||||
|
||||
# Short hash for tags
|
||||
if [ "$APP_HASH" = "no-changes" ]; then
|
||||
echo "app_short=no-changes" >> $GITHUB_OUTPUT
|
||||
echo "Frontend hash: $FRONTEND_HASH"
|
||||
echo "Backend hash: $BACKEND_HASH"
|
||||
|
||||
echo "frontend_hash=$FRONTEND_HASH" >> $GITHUB_OUTPUT
|
||||
echo "backend_hash=$BACKEND_HASH" >> $GITHUB_OUTPUT
|
||||
|
||||
# Short hashes for tags
|
||||
if [ "$FRONTEND_HASH" = "no-frontend-changes" ]; then
|
||||
echo "frontend_short=no-frontend" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "app_short=${APP_HASH:0:8}" >> $GITHUB_OUTPUT
|
||||
echo "frontend_short=${FRONTEND_HASH:0:8}" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Check if image exists
|
||||
id: check-image
|
||||
if [ "$BACKEND_HASH" = "no-backend-changes" ]; then
|
||||
echo "backend_short=no-backend" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "backend_short=${BACKEND_HASH:0:8}" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Check if frontend image exists
|
||||
id: check-frontend
|
||||
run: |
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-${{ steps.commit-hash.outputs.app_short }} >/dev/null 2>&1; then
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-frontend-${{ steps.commit-hashes.outputs.frontend_short }} >/dev/null 2>&1; then
|
||||
echo "exists=true" >> $GITHUB_OUTPUT
|
||||
echo "Image already exists, skipping build"
|
||||
echo "Frontend image already exists, skipping build"
|
||||
else
|
||||
echo "exists=false" >> $GITHUB_OUTPUT
|
||||
echo "Image needs to be built"
|
||||
echo "Frontend image needs to be built"
|
||||
fi
|
||||
|
||||
- name: Build and push V2 image
|
||||
if: steps.check-image.outputs.exists == 'false'
|
||||
- name: Check if backend image exists
|
||||
id: check-backend
|
||||
run: |
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-backend-${{ steps.commit-hashes.outputs.backend_short }} >/dev/null 2>&1; then
|
||||
echo "exists=true" >> $GITHUB_OUTPUT
|
||||
echo "Backend image already exists, skipping build"
|
||||
else
|
||||
echo "exists=false" >> $GITHUB_OUTPUT
|
||||
echo "Backend image needs to be built"
|
||||
fi
|
||||
|
||||
- name: Build and push V2 frontend image
|
||||
if: steps.check-frontend.outputs.exists == 'false'
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/embedded/Dockerfile
|
||||
file: ./docker/frontend/Dockerfile
|
||||
push: true
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-${{ steps.commit-hash.outputs.app_short }}
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-frontend-${{ steps.commit-hashes.outputs.frontend_short }}
|
||||
build-args: VERSION_TAG=v2-alpha
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Build and push V2 backend image
|
||||
if: steps.check-backend.outputs.exists == 'false'
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/backend/Dockerfile
|
||||
push: true
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-backend-${{ steps.commit-hashes.outputs.backend_short }}
|
||||
build-args: VERSION_TAG=v2-alpha
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Deploy V2 to VPS
|
||||
@@ -246,16 +279,17 @@ jobs:
|
||||
run: |
|
||||
# Use same port strategy as regular PRs - just the PR number
|
||||
V2_PORT=${{ needs.check-pr.outputs.pr_number }}
|
||||
BACKEND_PORT=$((V2_PORT + 10000)) # Backend on higher port to avoid conflicts
|
||||
|
||||
# Create docker-compose for V2 with unified embedded image
|
||||
# Create docker-compose for V2 with separate frontend and backend
|
||||
cat > docker-compose.yml << EOF
|
||||
version: '3.3'
|
||||
services:
|
||||
stirling-pdf-v2:
|
||||
container_name: stirling-pdf-v2-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-${{ steps.commit-hash.outputs.app_short }}
|
||||
stirling-pdf-v2-backend:
|
||||
container_name: stirling-pdf-v2-backend-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-backend-${{ steps.commit-hashes.outputs.backend_short }}
|
||||
ports:
|
||||
- "${V2_PORT}:8080"
|
||||
- "${BACKEND_PORT}:8080" # Backend API port
|
||||
volumes:
|
||||
- /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}/data:/usr/share/tessdata:rw
|
||||
- /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}/config:/configs:rw
|
||||
@@ -267,7 +301,7 @@ jobs:
|
||||
SECURITY_INITIALLOGIN_PASSWORD: "${{ secrets.TEST_LOGIN_PASSWORD }}"
|
||||
SYSTEM_DEFAULTLOCALE: en-GB
|
||||
UI_APPNAME: "Stirling-PDF V2 PR#${{ needs.check-pr.outputs.pr_number }}"
|
||||
UI_HOMEDESCRIPTION: "V2 PR#${{ needs.check-pr.outputs.pr_number }} - Embedded Architecture"
|
||||
UI_HOMEDESCRIPTION: "V2 PR#${{ needs.check-pr.outputs.pr_number }} - Frontend/Backend Split Architecture"
|
||||
UI_APPNAMENAVBAR: "V2 PR#${{ needs.check-pr.outputs.pr_number }}"
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
@@ -275,12 +309,23 @@ jobs:
|
||||
SWAGGER_SERVER_URL: "https://${V2_PORT}.ssl.stirlingpdf.cloud"
|
||||
baseUrl: "https://${V2_PORT}.ssl.stirlingpdf.cloud"
|
||||
restart: on-failure:5
|
||||
|
||||
stirling-pdf-v2-frontend:
|
||||
container_name: stirling-pdf-v2-frontend-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-frontend-${{ steps.commit-hashes.outputs.frontend_short }}
|
||||
ports:
|
||||
- "${V2_PORT}:80" # Frontend port (same as regular PRs)
|
||||
environment:
|
||||
VITE_API_BASE_URL: "http://${{ secrets.VPS_HOST }}:${BACKEND_PORT}"
|
||||
depends_on:
|
||||
- stirling-pdf-v2-backend
|
||||
restart: on-failure:5
|
||||
EOF
|
||||
|
||||
# Deploy to VPS
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }}:/tmp/docker-compose-v2.yml
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/docker-compose-v2.yml
|
||||
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << ENDSSH
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << ENDSSH
|
||||
# Create V2 PR-specific directories
|
||||
mkdir -p /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}/{data,config,logs}
|
||||
|
||||
@@ -290,15 +335,15 @@ jobs:
|
||||
# Stop any existing container and clean up
|
||||
cd /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}
|
||||
docker-compose down --remove-orphans 2>/dev/null || true
|
||||
|
||||
|
||||
# Start the new container
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
|
||||
|
||||
# Clean up unused Docker resources to save space
|
||||
docker system prune -af --volumes || true
|
||||
|
||||
# Clean up old images (older than 2 weeks)
|
||||
# Clean up old backend/frontend images (older than 2 weeks)
|
||||
docker image prune -af --filter "until=336h" --filter "label!=keep=true" || true
|
||||
ENDSSH
|
||||
|
||||
@@ -330,11 +375,11 @@ jobs:
|
||||
}
|
||||
}
|
||||
|
||||
const deploymentUrl = `http://${{ secrets.NEW_VPS_HOST }}:${v2Port}`;
|
||||
const deploymentUrl = `http://${{ secrets.VPS_HOST }}:${v2Port}`;
|
||||
const httpsUrl = `https://${v2Port}.ssl.stirlingpdf.cloud`;
|
||||
|
||||
const commentBody = `## 🚀 V2 Auto-Deployment Complete!\n\n` +
|
||||
`Your V2 PR with embedded architecture has been deployed!\n\n` +
|
||||
`Your V2 PR with the new frontend/backend split architecture has been deployed!\n\n` +
|
||||
`🔗 **Direct Test URL (non-SSL)** [${deploymentUrl}](${deploymentUrl})\n\n` +
|
||||
`🔐 **Secure HTTPS URL**: [${httpsUrl}](${httpsUrl})\n\n` +
|
||||
`_This deployment will be automatically cleaned up when the PR is closed._\n\n` +
|
||||
@@ -357,7 +402,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -405,12 +450,12 @@ jobs:
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Cleanup V2 deployment
|
||||
run: |
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << 'ENDSSH'
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << 'ENDSSH'
|
||||
if [ -d "/stirling/V2-PR-${{ github.event.pull_request.number }}" ]; then
|
||||
echo "Found V2 PR directory, proceeding with cleanup..."
|
||||
|
||||
@@ -424,8 +469,9 @@ jobs:
|
||||
# Remove V2 PR-specific directories
|
||||
rm -rf /stirling/V2-PR-${{ github.event.pull_request.number }}
|
||||
|
||||
# Clean up V2 container by name (in case compose cleanup missed it)
|
||||
docker rm -f stirling-pdf-v2-pr-${{ github.event.pull_request.number }} || true
|
||||
# Clean up V2 containers by name (in case compose cleanup missed them)
|
||||
docker rm -f stirling-pdf-v2-frontend-pr-${{ github.event.pull_request.number }} || true
|
||||
docker rm -f stirling-pdf-v2-backend-pr-${{ github.event.pull_request.number }} || true
|
||||
|
||||
echo "V2 cleanup completed"
|
||||
else
|
||||
|
||||
@@ -25,7 +25,8 @@ jobs:
|
||||
github.event.comment.user.login == 'frooodle' ||
|
||||
github.event.comment.user.login == 'sf298' ||
|
||||
github.event.comment.user.login == 'Ludy87' ||
|
||||
github.event.comment.user.login == 'balazs-szucs' ||
|
||||
github.event.comment.user.login == 'LaserKaspar' ||
|
||||
github.event.comment.user.login == 'sbplat' ||
|
||||
github.event.comment.user.login == 'reecebrowne' ||
|
||||
github.event.comment.user.login == 'DarioGii' ||
|
||||
github.event.comment.user.login == 'EthanHealy01' ||
|
||||
@@ -40,7 +41,7 @@ jobs:
|
||||
enable_enterprise: ${{ steps.check-pro-flag.outputs.enable_enterprise }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -128,7 +129,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -168,7 +169,7 @@ jobs:
|
||||
STIRLING_PDF_DESKTOP_UI: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
@@ -189,7 +190,7 @@ jobs:
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Deploy to VPS
|
||||
@@ -251,9 +252,9 @@ jobs:
|
||||
EOF
|
||||
|
||||
# Then copy the file and execute commands
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }}:/tmp/docker-compose.yml
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/docker-compose.yml
|
||||
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << ENDSSH
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << ENDSSH
|
||||
# Create PR-specific directories
|
||||
mkdir -p /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/{data,config,logs}
|
||||
|
||||
@@ -335,7 +336,7 @@ jobs:
|
||||
const prNumber = ${{ needs.check-comment.outputs.pr_number }};
|
||||
const securityStatus = process.env.security_status || "Security Disabled";
|
||||
|
||||
const deploymentUrl = `http://${{ secrets.NEW_VPS_HOST }}:${prNumber}`;
|
||||
const deploymentUrl = `http://${{ secrets.VPS_HOST }}:${prNumber}`;
|
||||
const commentBody = `## 🚀 PR Test Deployment\n\n` +
|
||||
`Your PR has been deployed for testing!\n\n` +
|
||||
`🔗 **Test URL:** [${deploymentUrl}](${deploymentUrl})\n` +
|
||||
@@ -362,7 +363,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
SERVER_IP: ${{ secrets.NEW_VPS_IP }} # Add this to your GitHub secrets
|
||||
SERVER_IP: ${{ secrets.VPS_IP }} # Add this to your GitHub secrets
|
||||
CLEANUP_PERFORMED: "false" # Add flag to track if cleanup occurred
|
||||
|
||||
jobs:
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -100,14 +100,14 @@ jobs:
|
||||
if: steps.remove-label-comment.outputs.present == 'true'
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Cleanup PR deployment
|
||||
if: steps.remove-label-comment.outputs.present == 'true'
|
||||
id: cleanup
|
||||
run: |
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << 'ENDSSH'
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << 'ENDSSH'
|
||||
if [ -d "/stirling/PR-${{ github.event.pull_request.number }}" ]; then
|
||||
echo "Found PR directory, proceeding with cleanup..."
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
+12
-24
@@ -32,7 +32,7 @@ jobs:
|
||||
frontend: ${{ steps.changes.outputs.frontend }}
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
- name: Checkout repository
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
spring-security: [true, false]
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
- name: Checkout repository
|
||||
@@ -97,7 +97,6 @@ jobs:
|
||||
with:
|
||||
name: test-reports-jdk-${{ matrix.jdk-version }}-spring-security-${{ matrix.spring-security }}
|
||||
path: |
|
||||
app/**/build/reports/jacoco/test
|
||||
app/**/build/reports/tests/
|
||||
app/**/build/test-results/
|
||||
app/**/build/reports/problems/
|
||||
@@ -105,24 +104,13 @@ jobs:
|
||||
retention-days: 3
|
||||
if-no-files-found: warn
|
||||
|
||||
- name: Add coverage to PR with spring security ${{ matrix.spring-security }} and JDK ${{ matrix.jdk-version }}
|
||||
id: jacoco
|
||||
uses: madrapps/jacoco-report@50d3aff4548aa991e6753342d9ba291084e63848 # v1.7.2
|
||||
with:
|
||||
paths: |
|
||||
${{ github.workspace }}/**/build/reports/jacoco/test/jacocoTestReport.xml
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
min-coverage-overall: 10
|
||||
min-coverage-changed-files: 0
|
||||
comment-type: summary
|
||||
|
||||
check-generateOpenApiDocs:
|
||||
if: needs.files-changed.outputs.openapi == 'true'
|
||||
needs: [files-changed]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -152,7 +140,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
- name: Checkout repository
|
||||
@@ -186,7 +174,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -231,7 +219,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -245,7 +233,7 @@ jobs:
|
||||
distribution: "temurin"
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Install Docker Compose
|
||||
run: |
|
||||
@@ -286,7 +274,7 @@ jobs:
|
||||
artifact-suffix: Dockerfile.fat
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -313,11 +301,11 @@ jobs:
|
||||
STIRLING_PDF_DESKTOP_UI: false
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Build ${{ matrix.docker-rev }}
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
@@ -326,8 +314,8 @@ jobs:
|
||||
context: .
|
||||
file: ./${{ matrix.docker-rev }}
|
||||
push: false
|
||||
cache-from: type=gha,scope=${{ matrix.artifact-suffix }}
|
||||
cache-to: type=gha,mode=max,scope=${{ matrix.artifact-suffix }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
platforms: linux/amd64,linux/arm64/v8
|
||||
provenance: true
|
||||
sbom: true
|
||||
|
||||
@@ -7,8 +7,6 @@ on:
|
||||
types: [opened, synchronize, reopened]
|
||||
paths:
|
||||
- "frontend/public/locales/*/translation.toml"
|
||||
- ".github/scripts/check_language_toml.py"
|
||||
- ".github/workflows/check_toml.yml"
|
||||
|
||||
# cancel in-progress jobs if a new job is triggered
|
||||
concurrency:
|
||||
@@ -27,7 +25,7 @@ jobs:
|
||||
pull-requests: write # Allow writing to pull requests
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Get commit hashes for frontend and backend
|
||||
id: commit-hashes
|
||||
@@ -119,7 +119,7 @@ jobs:
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
chmod 600 ../private.key
|
||||
|
||||
- name: Deploy to VPS on port 3000
|
||||
@@ -158,17 +158,17 @@ jobs:
|
||||
ports:
|
||||
- "3000:80"
|
||||
environment:
|
||||
VITE_API_BASE_URL: "http://${{ secrets.NEW_VPS_HOST }}:13000"
|
||||
VITE_API_BASE_URL: "http://${{ secrets.VPS_HOST }}:13000"
|
||||
depends_on:
|
||||
- backend
|
||||
restart: on-failure:5
|
||||
EOF
|
||||
|
||||
# Copy to remote with unique name
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no $UNIQUE_NAME ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }}:/tmp/$UNIQUE_NAME
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no $UNIQUE_NAME ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/$UNIQUE_NAME
|
||||
|
||||
# SSH and rename/move atomically to avoid interference
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << ENDSSH
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << ENDSSH
|
||||
mkdir -p /stirling/V2/{data,config,logs}
|
||||
mv /tmp/$UNIQUE_NAME /stirling/V2/docker-compose.yml
|
||||
cd /stirling/V2
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
licenses-backend: ${{ steps.changes.outputs.licenses-backend }}
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
repository-projects: write # Required for enabling automerge
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -312,7 +312,7 @@ jobs:
|
||||
repository-projects: write # Required for enabling automerge
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -26,6 +26,18 @@ on:
|
||||
release:
|
||||
types: [created]
|
||||
|
||||
# cancel in-progress jobs if a new job is triggered
|
||||
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
|
||||
# or a pull request is updated.
|
||||
# It helps to save resources and time by ensuring that only the latest commit is built and tested
|
||||
# This is particularly useful for long-running jobs that may take a while to complete.
|
||||
# The `group` is set to a combination of the workflow name, event name, and branch name.
|
||||
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
|
||||
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref_name || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
@@ -38,7 +50,7 @@ jobs:
|
||||
version: ${{ steps.versionNumber.outputs.versionNumber }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -75,15 +87,15 @@ jobs:
|
||||
echo 'matrix={"include":[{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
"linux")
|
||||
echo 'matrix={"include":[{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
*)
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
esac
|
||||
else
|
||||
# For push/release events, build all platforms
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
build-jars:
|
||||
@@ -106,7 +118,7 @@ jobs:
|
||||
file_suffix: "-server"
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -162,21 +174,68 @@ jobs:
|
||||
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
allowed-endpoints: >
|
||||
one.digicert.com:443
|
||||
clientauth.one.digicert.com:443
|
||||
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Install dependencies (ubuntu only)
|
||||
if: matrix.platform == 'ubuntu-22.04'
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name != 'linux-x86_64-appimage'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libjavascriptcoregtk-4.0-dev libsoup2.4-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev
|
||||
# Dependencies explanation:
|
||||
# - libwebkit2gtk-4.1-dev: WebKit engine for Tauri v2 (4.0 was for v1)
|
||||
# - libappindicator3-dev: System tray support
|
||||
# - librsvg2-dev: SVG rendering
|
||||
# - patchelf: Required for AppImage packaging
|
||||
# - libxdo-dev: Keyboard/mouse automation
|
||||
# - libasound2-dev: Audio support
|
||||
# - libopenblas-dev: GPU acceleration support
|
||||
# - libx11-dev: X11 development files for window system interaction
|
||||
# - libxtst-dev: X11 testing extensions for input simulation
|
||||
# - libxrandr-dev: X11 RandR extension for display configuration
|
||||
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev libasound2-dev libopenblas-dev libx11-dev libxtst-dev libxrandr-dev
|
||||
|
||||
- name: Install macOS DMG tooling
|
||||
if: startsWith(matrix.platform, 'macos')
|
||||
run: |
|
||||
brew list create-dmg >/dev/null 2>&1 || brew install create-dmg
|
||||
|
||||
- name: Install dependencies (appimage only)
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
sudo apt-get install -y \
|
||||
build-essential \
|
||||
curl \
|
||||
wget \
|
||||
file \
|
||||
libgtk-3-dev \
|
||||
libxdo-dev \
|
||||
libssl-dev \
|
||||
libappindicator3-dev \
|
||||
librsvg2-dev \
|
||||
openjdk-17-jre-headless \
|
||||
patchelf
|
||||
|
||||
mkdir -p /tmp/ubuntu-packages
|
||||
cd /tmp/ubuntu-packages
|
||||
wget https://launchpadlibrarian.net/723972773/libwebkit2gtk-4.1-0_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libwebkit2gtk-4.1-0"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972761/libwebkit2gtk-4.1-dev_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libwebkit2gtk-4.1-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972770/libjavascriptcoregtk-4.1-0_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libjavascriptcoregtk-4.1-0"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972746/libjavascriptcoregtk-4.1-dev_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libjavascriptcoregtk-4.1-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972735/gir1.2-javascriptcoregtk-4.1_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download gir1.2-javascriptcoregtk-4.1"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972739/gir1.2-webkit2-4.1_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download gir1.2-webkit2-4.1"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433947/libicu70_70.1-2ubuntu1_amd64.deb || { echo "Failed to download libicu70"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433941/libicu-dev_70.1-2ubuntu1_amd64.deb || { echo "Failed to download libicu-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433945/icu-devtools_70.1-2ubuntu1_amd64.deb || { echo "Failed to download icu-devtools"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/595623693/libjpeg8_8c-2ubuntu10_amd64.deb || { echo "Failed to download libjpeg8"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/587202140/libjpeg-turbo8_2.1.2-0ubuntu1_amd64.deb || { echo "Failed to download libjpeg-turbo8"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/592959859/xdg-desktop-portal-gtk_1.14.0-1build1_amd64.deb || { echo "Failed to download xdg-desktop-portal-gtk"; exit 1; }
|
||||
sudo apt-get install -y /tmp/ubuntu-packages/*.deb
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
@@ -271,7 +330,7 @@ jobs:
|
||||
|
||||
- name: Install frontend dependencies
|
||||
working-directory: ./frontend
|
||||
run: npm ci
|
||||
run: npm install
|
||||
|
||||
# DigiCert KeyLocker Setup (Cloud HSM)
|
||||
- name: Setup DigiCert KeyLocker
|
||||
@@ -384,6 +443,35 @@ jobs:
|
||||
echo "APPLE_SIGNING_IDENTITY=$CERT_ID" >> $GITHUB_ENV
|
||||
echo "Certificate imported successfully."
|
||||
|
||||
- name: Check DMG creation dependencies (macOS only)
|
||||
if: matrix.platform == 'macos-15' || matrix.platform == 'macos-15-intel'
|
||||
run: |
|
||||
echo "🔍 Checking DMG creation dependencies on ${{ matrix.platform }}..."
|
||||
echo "hdiutil version: $(hdiutil --version || echo 'NOT FOUND')"
|
||||
echo "create-dmg availability: $(which create-dmg || echo 'NOT FOUND')"
|
||||
echo "Available disk space: $(df -h /tmp | tail -1)"
|
||||
echo "macOS version: $(sw_vers -productVersion)"
|
||||
echo "Available tools:"
|
||||
ls -la /usr/bin/hd* || echo "No hd* tools found"
|
||||
|
||||
- name: Generate temporary GPG key for AppImage
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
cat >keyparams <<EOF
|
||||
%no-protection
|
||||
Key-Type: RSA
|
||||
Key-Length: 2048
|
||||
Name-Real: CI AppImage Signer
|
||||
Name-Email: ci-appimage@example.invalid
|
||||
Expire-Date: 0
|
||||
%commit
|
||||
EOF
|
||||
gpg --batch --generate-key keyparams
|
||||
export GPG_FINGERPRINT=$(gpg --batch --with-colons --list-secret-keys | awk -F: '/^fpr:/ {print $10; exit}')
|
||||
echo "GPG_FINGERPRINT=$GPG_FINGERPRINT" >> $GITHUB_ENV
|
||||
echo "Generated temporary GPG key:"
|
||||
gpg --list-secret-keys --keyid-format=long
|
||||
|
||||
- name: Build Tauri app
|
||||
uses: tauri-apps/tauri-action@v0
|
||||
env:
|
||||
@@ -407,6 +495,15 @@ jobs:
|
||||
tauriScript: npx tauri
|
||||
args: ${{ matrix.args }}
|
||||
|
||||
- name: Cleanup temporary GPG key
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
if [ -n "${GPG_FINGERPRINT:-}" ]; then
|
||||
gpg --batch --yes --delete-secret-keys "$GPG_FINGERPRINT" || true
|
||||
gpg --batch --yes --delete-keys "$GPG_FINGERPRINT" || true
|
||||
fi
|
||||
rm -f keyparams
|
||||
|
||||
# Sign with DigiCert KeyLocker (post-build)
|
||||
- name: Sign Windows binaries with DigiCert KeyLocker
|
||||
if: ${{ matrix.platform == 'windows-latest' && env.SM_API_KEY != '' && (github.event_name == 'release' || github.ref == 'refs/heads/V2-master') }}
|
||||
@@ -512,10 +609,13 @@ jobs:
|
||||
find . -name "*.msi" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.msi" \;
|
||||
elif [ "${{ matrix.platform }}" = "macos-15" ] || [ "${{ matrix.platform }}" = "macos-15-intel" ]; then
|
||||
find . -name "*.dmg" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.dmg" \;
|
||||
find . -name "*.app" -exec cp -r {} "../../../dist/Stirling-PDF-${{ matrix.name }}.app" \;
|
||||
else
|
||||
# find . -name "*.app" -exec cp -r {} "../../../dist/Stirling-PDF-${{ matrix.name }}.app" \;
|
||||
elif [ "${{ matrix.platform }}" = "ubuntu-22.04" ]; then
|
||||
find . -name "*.deb" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.deb" \;
|
||||
find . -name "*.rpm" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.rpm" \;
|
||||
find . -name "*.AppImage" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.AppImage" \;
|
||||
else
|
||||
echo "Unknown platform: ${{ matrix.platform }}"
|
||||
fi
|
||||
|
||||
- name: Upload build artifacts
|
||||
@@ -533,7 +633,7 @@ jobs:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -570,10 +670,11 @@ jobs:
|
||||
tag_name: v${{ needs.determine-matrix.outputs.version }}
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./artifacts/**/*.jar
|
||||
./artifacts/**/*.msi
|
||||
./artifacts/**/*.dmg
|
||||
./artifacts/**/*.deb
|
||||
./artifacts/**/*.AppImage
|
||||
./artifacts/**/Stirling-PDF-*.jar
|
||||
./artifacts/**/Stirling-PDF-*.msi
|
||||
./artifacts/**/Stirling-PDF-*.dmg
|
||||
./artifacts/**/Stirling-PDF-*.deb
|
||||
./artifacts/**/Stirling-PDF-*.rpm
|
||||
./artifacts/**/Stirling-PDF-*.AppImage
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -75,6 +75,6 @@ jobs:
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v3.29.5
|
||||
uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # v3.29.5
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -23,6 +23,18 @@ on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
# cancel in-progress jobs if a new job is triggered
|
||||
# This is useful to avoid running multiple builds for the same branch if a new commit is pushed
|
||||
# or a pull request is updated.
|
||||
# It helps to save resources and time by ensuring that only the latest commit is built and tested
|
||||
# This is particularly useful for long-running jobs that may take a while to complete.
|
||||
# The `group` is set to a combination of the workflow name, event name, and branch name.
|
||||
# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of
|
||||
# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref_name || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
@@ -33,6 +45,11 @@ jobs:
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Determine build matrix
|
||||
id: set-matrix
|
||||
run: |
|
||||
@@ -45,15 +62,15 @@ jobs:
|
||||
echo 'matrix={"include":[{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
"linux")
|
||||
echo 'matrix={"include":[{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
*)
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
;;
|
||||
esac
|
||||
else
|
||||
# For PR/push events, build all platforms
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"","name":"linux-x86_64"}]}' >> $GITHUB_OUTPUT
|
||||
echo 'matrix={"include":[{"platform":"windows-latest","args":"--target x86_64-pc-windows-msvc","name":"windows-x86_64"},{"platform":"macos-15","args":"--target aarch64-apple-darwin","name":"macos-aarch64"},{"platform":"macos-15-intel","args":"--target x86_64-apple-darwin","name":"macos-x86_64"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b appimage","name":"linux-x86_64-appimage"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b deb","name":"linux-x86_64-deb"},{"platform":"ubuntu-22.04","args":"--target x86_64-unknown-linux-gnu -b rpm","name":"linux-x86_64-rpm"}]}' >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
build:
|
||||
@@ -67,18 +84,68 @@ jobs:
|
||||
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Install dependencies (ubuntu only)
|
||||
if: matrix.platform == 'ubuntu-22.04'
|
||||
- name: install dependencies (ubuntu only)
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name != 'linux-x86_64-appimage'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libjavascriptcoregtk-4.0-dev libsoup2.4-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev
|
||||
# Dependencies explanation:
|
||||
# - libwebkit2gtk-4.1-dev: WebKit engine for Tauri v2 (4.0 was for v1)
|
||||
# - libappindicator3-dev: System tray support
|
||||
# - librsvg2-dev: SVG rendering
|
||||
# - patchelf: Required for AppImage packaging
|
||||
# - libxdo-dev: Keyboard/mouse automation
|
||||
# - libasound2-dev: Audio support
|
||||
# - libopenblas-dev: GPU acceleration support
|
||||
# - libx11-dev: X11 development files for window system interaction
|
||||
# - libxtst-dev: X11 testing extensions for input simulation
|
||||
# - libxrandr-dev: X11 RandR extension for display configuration
|
||||
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev libasound2-dev libopenblas-dev libx11-dev libxtst-dev libxrandr-dev
|
||||
|
||||
- name: Install macOS DMG tooling
|
||||
if: startsWith(matrix.platform, 'macos')
|
||||
run: |
|
||||
brew list create-dmg >/dev/null 2>&1 || brew install create-dmg
|
||||
|
||||
- name: Install dependencies (appimage only)
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
sudo apt-get install -y \
|
||||
build-essential \
|
||||
curl \
|
||||
wget \
|
||||
file \
|
||||
libgtk-3-dev \
|
||||
libxdo-dev \
|
||||
libssl-dev \
|
||||
libappindicator3-dev \
|
||||
librsvg2-dev \
|
||||
openjdk-17-jre-headless \
|
||||
patchelf
|
||||
|
||||
mkdir -p /tmp/ubuntu-packages
|
||||
cd /tmp/ubuntu-packages
|
||||
wget https://launchpadlibrarian.net/723972773/libwebkit2gtk-4.1-0_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libwebkit2gtk-4.1-0"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972761/libwebkit2gtk-4.1-dev_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libwebkit2gtk-4.1-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972770/libjavascriptcoregtk-4.1-0_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libjavascriptcoregtk-4.1-0"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972746/libjavascriptcoregtk-4.1-dev_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download libjavascriptcoregtk-4.1-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972735/gir1.2-javascriptcoregtk-4.1_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download gir1.2-javascriptcoregtk-4.1"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/723972739/gir1.2-webkit2-4.1_2.44.0-0ubuntu0.22.04.1_amd64.deb || { echo "Failed to download gir1.2-webkit2-4.1"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433947/libicu70_70.1-2ubuntu1_amd64.deb || { echo "Failed to download libicu70"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433941/libicu-dev_70.1-2ubuntu1_amd64.deb || { echo "Failed to download libicu-dev"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/606433945/icu-devtools_70.1-2ubuntu1_amd64.deb || { echo "Failed to download icu-devtools"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/595623693/libjpeg8_8c-2ubuntu10_amd64.deb || { echo "Failed to download libjpeg8"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/587202140/libjpeg-turbo8_2.1.2-0ubuntu1_amd64.deb || { echo "Failed to download libjpeg-turbo8"; exit 1; }
|
||||
wget https://launchpadlibrarian.net/592959859/xdg-desktop-portal-gtk_1.14.0-1build1_amd64.deb || { echo "Failed to download xdg-desktop-portal-gtk"; exit 1; }
|
||||
sudo apt-get install -y /tmp/ubuntu-packages/*.deb
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
@@ -99,6 +166,18 @@ jobs:
|
||||
java-version: "21"
|
||||
distribution: "temurin"
|
||||
|
||||
- name: Make libjvm discoverable (appimage only)
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
JAVA_LIBJVM="$JAVA_HOME/lib/server/libjvm.so"
|
||||
if [ -f "$JAVA_LIBJVM" ]; then
|
||||
sudo ln -sf "$JAVA_LIBJVM" /usr/lib/libjvm.so
|
||||
echo "Linked libjvm from $JAVA_LIBJVM"
|
||||
else
|
||||
echo "libjvm not found at $JAVA_LIBJVM"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Build Java backend with JLink
|
||||
working-directory: ./
|
||||
shell: bash
|
||||
@@ -298,6 +377,24 @@ jobs:
|
||||
echo "Available tools:"
|
||||
ls -la /usr/bin/hd* || echo "No hd* tools found"
|
||||
|
||||
- name: Generate temporary GPG key for AppImage
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
cat >keyparams <<EOF
|
||||
%no-protection
|
||||
Key-Type: RSA
|
||||
Key-Length: 2048
|
||||
Name-Real: CI AppImage Signer
|
||||
Name-Email: ci-appimage@example.invalid
|
||||
Expire-Date: 0
|
||||
%commit
|
||||
EOF
|
||||
gpg --batch --generate-key keyparams
|
||||
export GPG_FINGERPRINT=$(gpg --batch --with-colons --list-secret-keys | awk -F: '/^fpr:/ {print $10; exit}')
|
||||
echo "GPG_FINGERPRINT=$GPG_FINGERPRINT" >> $GITHUB_ENV
|
||||
echo "Generated temporary GPG key:"
|
||||
gpg --list-secret-keys --keyid-format=long
|
||||
|
||||
- name: Build Tauri app
|
||||
uses: tauri-apps/tauri-action@v0
|
||||
env:
|
||||
@@ -308,19 +405,33 @@ jobs:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
APPIMAGETOOL_SIGN_PASSPHRASE: ${{ secrets.APPIMAGETOOL_SIGN_PASSPHRASE }}
|
||||
# APPIMAGETOOL_SIGN_PASSPHRASE: ${{ secrets.APPIMAGETOOL_SIGN_PASSPHRASE }}
|
||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||
VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY: ${{ secrets.VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY }}
|
||||
VITE_SAAS_SERVER_URL: ${{ secrets.VITE_SAAS_SERVER_URL }}
|
||||
# Only enable Windows signing in Tauri when on main
|
||||
SIGN: ${{ github.ref == 'refs/heads/main' && (env.SM_API_KEY == '' && env.WINDOWS_CERTIFICATE != '') && '1' || '0' }}
|
||||
# Enable Windows signing only when ALL of the following are true:
|
||||
# - The build is running on the Windows platform (matrix.platform == 'windows-latest')
|
||||
# - The build is triggered from the main branch (github.ref == 'refs/heads/main')
|
||||
# - The DigiCert KeyLocker HSM is NOT being used (env.SM_API_KEY == '')
|
||||
# - A Windows certificate is available (env.WINDOWS_CERTIFICATE != '')
|
||||
# If all conditions are met, SIGN=1 (enable signing); otherwise, SIGN=0 (disable signing).
|
||||
SIGN: ${{ (matrix.platform == 'windows-latest' && github.ref == 'refs/heads/main' && env.SM_API_KEY == '' && env.WINDOWS_CERTIFICATE != '') && '1' || '0' }}
|
||||
CI: true
|
||||
with:
|
||||
projectPath: ./frontend
|
||||
tauriScript: npx tauri
|
||||
args: ${{ matrix.args }}
|
||||
|
||||
- name: Cleanup temporary GPG key
|
||||
if: matrix.platform == 'ubuntu-22.04' && matrix.name == 'linux-x86_64-appimage'
|
||||
run: |
|
||||
if [ -n "${GPG_FINGERPRINT:-}" ]; then
|
||||
gpg --batch --yes --delete-secret-keys "$GPG_FINGERPRINT" || true
|
||||
gpg --batch --yes --delete-keys "$GPG_FINGERPRINT" || true
|
||||
fi
|
||||
rm -f keyparams
|
||||
|
||||
# Sign with DigiCert KeyLocker (post-build)
|
||||
- name: Sign Windows binaries with DigiCert KeyLocker
|
||||
if: ${{ matrix.platform == 'windows-latest' && env.SM_API_KEY != '' && github.ref == 'refs/heads/main' }}
|
||||
@@ -507,9 +618,13 @@ jobs:
|
||||
find . -name "*.msi" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.msi" \;
|
||||
elif [ "${{ matrix.platform }}" = "macos-15" ] || [ "${{ matrix.platform }}" = "macos-15-intel" ]; then
|
||||
find . -name "*.dmg" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.dmg" \;
|
||||
else
|
||||
# find . -name "*.app" -exec cp -r {} "../../../dist/Stirling-PDF-${{ matrix.name }}.app" \;
|
||||
elif [ "${{ matrix.platform }}" = "ubuntu-22.04" ]; then
|
||||
find . -name "*.deb" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.deb" \;
|
||||
find . -name "*.rpm" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.rpm" \;
|
||||
find . -name "*.AppImage" -exec cp {} "../../../dist/Stirling-PDF-${{ matrix.name }}.AppImage" \;
|
||||
else
|
||||
echo "Unknown platform: ${{ matrix.platform }}"
|
||||
fi
|
||||
|
||||
- name: Verify Windows Code Signature
|
||||
@@ -599,13 +714,16 @@ jobs:
|
||||
echo "❌ No macOS artifacts found"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
elif [ "${{ matrix.platform }}" = "ubuntu-22.04" ]; then
|
||||
echo "Checking for Linux artifacts..."
|
||||
find . -name "*.deb" -o -name "*.AppImage" | head -5
|
||||
if [ $(find . -name "*.deb" -o -name "*.AppImage" | wc -l) -eq 0 ]; then
|
||||
find . -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" | head -5
|
||||
if [ $(find . -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" | wc -l) -eq 0 ]; then
|
||||
echo "❌ No Linux artifacts found"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Unknown platform: ${{ matrix.platform }}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Build artifacts found for ${{ matrix.name }}"
|
||||
@@ -615,7 +733,7 @@ jobs:
|
||||
run: |
|
||||
cd ./frontend/src-tauri/target
|
||||
echo "Artifact sizes for ${{ matrix.name }}:"
|
||||
find . -name "*.exe" -o -name "*.dmg" -o -name "*.deb" -o -name "*.AppImage" -o -name "*.msi" | while read file; do
|
||||
find . -name "*.exe" -o -name "*.dmg" -o -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" -o -name "*.msi" | while read file; do
|
||||
if [ -f "$file" ]; then
|
||||
size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null || echo "unknown")
|
||||
echo "$file: $size bytes"
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
DISABLE_ADDITIONAL_FEATURES: true
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Deploy to VPS
|
||||
@@ -107,9 +107,9 @@ jobs:
|
||||
restart: on-failure:5
|
||||
EOF
|
||||
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }}:/tmp/docker-compose.yml
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/docker-compose.yml
|
||||
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << EOF
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << EOF
|
||||
mkdir -p /stirling/test-${{ github.sha }}/{data,config,logs}
|
||||
mv /tmp/docker-compose.yml /stirling/test-${{ github.sha }}/docker-compose.yml
|
||||
cd /stirling/test-${{ github.sha }}
|
||||
@@ -140,7 +140,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -161,7 +161,7 @@ jobs:
|
||||
npm install
|
||||
npm run build
|
||||
npm install dashcam-chrome --save
|
||||
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=$(pwd)/node_modules/dashcam-chrome/build", "http://${{ secrets.NEW_VPS_HOST }}:1337"
|
||||
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=$(pwd)/node_modules/dashcam-chrome/build", "http://${{ secrets.VPS_HOST }}:1337"
|
||||
Start-Sleep -Seconds 20
|
||||
prompt: |
|
||||
1. /run testing/testdriver/test.yml
|
||||
@@ -176,20 +176,20 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.NEW_VPS_SSH_KEY }}" > ../private.key
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Cleanup deployment
|
||||
if: always()
|
||||
run: |
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${{ secrets.NEW_VPS_USERNAME }}@${{ secrets.NEW_VPS_HOST }} << EOF
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << EOF
|
||||
cd /stirling/test-${{ github.sha }}
|
||||
docker-compose down
|
||||
cd /stirling
|
||||
|
||||
@@ -44,9 +44,6 @@ dependencies {
|
||||
api 'jakarta.servlet:jakarta.servlet-api:6.1.0'
|
||||
api 'org.snakeyaml:snakeyaml-engine:2.10'
|
||||
api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.14"
|
||||
// Simple Java Mail for EML/MSG parsing (replaces direct Angus Mail usage)
|
||||
api 'org.simplejavamail:simple-java-mail:8.12.6'
|
||||
api 'org.simplejavamail:outlook-module:8.12.6' // MSG file support
|
||||
api 'jakarta.mail:jakarta.mail-api:2.1.5'
|
||||
runtimeOnly 'org.eclipse.angus:angus-mail:2.0.5'
|
||||
}
|
||||
|
||||
+8
-91
@@ -2,9 +2,6 @@ package stirling.software.common.configuration;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -17,8 +14,6 @@ import stirling.software.common.model.ApplicationProperties.CustomPaths;
|
||||
import stirling.software.common.model.ApplicationProperties.CustomPaths.Operations;
|
||||
import stirling.software.common.model.ApplicationProperties.CustomPaths.Pipeline;
|
||||
import stirling.software.common.model.ApplicationProperties.System;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.UnoServerPool;
|
||||
|
||||
@Slf4j
|
||||
@Configuration
|
||||
@@ -37,8 +32,6 @@ public class RuntimePathConfig {
|
||||
// Tesseract data path
|
||||
private final String tessDataPath;
|
||||
|
||||
private final List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> unoServerEndpoints;
|
||||
|
||||
// Pipeline paths
|
||||
private final String pipelineWatchedFoldersPath;
|
||||
private final String pipelineFinishedFoldersPath;
|
||||
@@ -101,28 +94,17 @@ public class RuntimePathConfig {
|
||||
defaultSOfficePath, operations != null ? operations.getSoffice() : null);
|
||||
|
||||
// Initialize Tesseract data path
|
||||
// Priority: config setting > TESSDATA_PREFIX env var > default path
|
||||
String defaultTessDataPath =
|
||||
isDocker ? "/usr/share/tesseract-ocr/5/tessdata" : "/usr/share/tessdata";
|
||||
|
||||
String tessPath = system.getTessdataDir();
|
||||
String tessdataPrefix = java.lang.System.getenv("TESSDATA_PREFIX");
|
||||
String defaultPath = "/usr/share/tesseract-ocr/5/tessdata";
|
||||
|
||||
if (tessPath != null && !tessPath.isEmpty()) {
|
||||
this.tessDataPath = tessPath;
|
||||
} else if (tessdataPrefix != null && !tessdataPrefix.isEmpty()) {
|
||||
this.tessDataPath = tessdataPrefix;
|
||||
} else {
|
||||
this.tessDataPath = defaultPath;
|
||||
}
|
||||
String tessdataDir = java.lang.System.getenv("TESSDATA_PREFIX");
|
||||
|
||||
this.tessDataPath =
|
||||
resolvePath(
|
||||
defaultTessDataPath,
|
||||
(tessPath != null && !tessPath.isEmpty()) ? tessPath : tessdataDir);
|
||||
log.info("Using Tesseract data path: {}", this.tessDataPath);
|
||||
|
||||
ApplicationProperties.ProcessExecutor processExecutor = properties.getProcessExecutor();
|
||||
int libreOfficeLimit = 1;
|
||||
if (processExecutor != null && processExecutor.getSessionLimit() != null) {
|
||||
libreOfficeLimit = processExecutor.getSessionLimit().getLibreOfficeSessionLimit();
|
||||
}
|
||||
this.unoServerEndpoints = buildUnoServerEndpoints(processExecutor, libreOfficeLimit);
|
||||
ProcessExecutor.setUnoServerPool(new UnoServerPool(this.unoServerEndpoints));
|
||||
}
|
||||
|
||||
private String resolvePath(String defaultPath, String customPath) {
|
||||
@@ -132,69 +114,4 @@ public class RuntimePathConfig {
|
||||
private boolean isRunningInDocker() {
|
||||
return Files.exists(Path.of("/.dockerenv"));
|
||||
}
|
||||
|
||||
private List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> buildUnoServerEndpoints(
|
||||
ApplicationProperties.ProcessExecutor processExecutor, int sessionLimit) {
|
||||
if (processExecutor == null) {
|
||||
log.warn("ProcessExecutor config missing; defaulting to a single UNO endpoint.");
|
||||
return Collections.singletonList(
|
||||
new ApplicationProperties.ProcessExecutor.UnoServerEndpoint());
|
||||
}
|
||||
if (!processExecutor.isAutoUnoServer()) {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> configured =
|
||||
sanitizeUnoServerEndpoints(processExecutor.getUnoServerEndpoints());
|
||||
if (!configured.isEmpty()) {
|
||||
// Warn if manual endpoint count doesn't match sessionLimit
|
||||
if (configured.size() != sessionLimit) {
|
||||
log.warn(
|
||||
"Manual UNO endpoint count ({}) differs from libreOfficeSessionLimit ({}). "
|
||||
+ "Concurrency will be limited by endpoint count, not sessionLimit.",
|
||||
configured.size(),
|
||||
sessionLimit);
|
||||
}
|
||||
return configured;
|
||||
}
|
||||
log.warn(
|
||||
"autoUnoServer disabled but no unoServerEndpoints configured; defaulting to 127.0.0.1:2003.");
|
||||
return Collections.singletonList(
|
||||
new ApplicationProperties.ProcessExecutor.UnoServerEndpoint());
|
||||
}
|
||||
int count = sessionLimit > 0 ? sessionLimit : 1;
|
||||
return buildAutoUnoServerEndpoints(count);
|
||||
}
|
||||
|
||||
private List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint>
|
||||
buildAutoUnoServerEndpoints(int count) {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints = new ArrayList<>();
|
||||
int basePort = 2003;
|
||||
for (int i = 0; i < count; i++) {
|
||||
ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint =
|
||||
new ApplicationProperties.ProcessExecutor.UnoServerEndpoint();
|
||||
endpoint.setHost("127.0.0.1");
|
||||
endpoint.setPort(basePort + (i * 2));
|
||||
endpoints.add(endpoint);
|
||||
}
|
||||
return endpoints;
|
||||
}
|
||||
|
||||
private List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint>
|
||||
sanitizeUnoServerEndpoints(
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints) {
|
||||
if (endpoints == null || endpoints.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> sanitized = new ArrayList<>();
|
||||
for (ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint : endpoints) {
|
||||
if (endpoint == null) {
|
||||
continue;
|
||||
}
|
||||
String host = endpoint.getHost();
|
||||
int port = endpoint.getPort();
|
||||
if (host == null || host.isBlank() || port <= 0) {
|
||||
continue;
|
||||
}
|
||||
sanitized.add(endpoint);
|
||||
}
|
||||
return sanitized;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-128
@@ -61,7 +61,6 @@ public class ApplicationProperties {
|
||||
private AutomaticallyGenerated automaticallyGenerated = new AutomaticallyGenerated();
|
||||
|
||||
private Mail mail = new Mail();
|
||||
private Telegram telegram = new Telegram();
|
||||
|
||||
private Premium premium = new Premium();
|
||||
|
||||
@@ -419,15 +418,6 @@ public class ApplicationProperties {
|
||||
|
||||
// 'https://app.example.com'). If not set, falls back to backendUrl.
|
||||
private boolean enableMobileScanner = false; // Enable mobile phone QR code upload feature
|
||||
private MobileScannerSettings mobileScannerSettings = new MobileScannerSettings();
|
||||
|
||||
@Data
|
||||
public static class MobileScannerSettings {
|
||||
private boolean convertToPdf = true; // Whether to automatically convert images to PDF
|
||||
private String imageResolution = "full"; // Options: "full", "reduced"
|
||||
private String pageFormat = "A4"; // Options: "keep", "A4", "letter"
|
||||
private boolean stretchToFit = false; // Whether to stretch image to fill page
|
||||
}
|
||||
|
||||
public boolean isAnalyticsEnabled() {
|
||||
return this.getEnableAnalytics() != null && this.getEnableAnalytics();
|
||||
@@ -552,10 +542,10 @@ public class ApplicationProperties {
|
||||
@Override
|
||||
public String toString() {
|
||||
return """
|
||||
Driver {
|
||||
driverName='%s'
|
||||
}
|
||||
"""
|
||||
Driver {
|
||||
driverName='%s'
|
||||
}
|
||||
"""
|
||||
.formatted(driverName);
|
||||
}
|
||||
}
|
||||
@@ -608,7 +598,6 @@ public class ApplicationProperties {
|
||||
private boolean ssoAutoLogin;
|
||||
private CustomMetadata customMetadata = new CustomMetadata();
|
||||
|
||||
@Deprecated
|
||||
@Data
|
||||
public static class CustomMetadata {
|
||||
private boolean autoUpdateMetadata;
|
||||
@@ -616,23 +605,16 @@ public class ApplicationProperties {
|
||||
private String creator;
|
||||
private String producer;
|
||||
|
||||
@Deprecated
|
||||
public String getCreator() {
|
||||
return creator == null || creator.trim().isEmpty() ? "Stirling-PDF" : creator;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public String getProducer() {
|
||||
return producer == null || producer.trim().isEmpty() ? "Stirling-PDF" : producer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mail server configuration properties.
|
||||
*
|
||||
* @since 0.46.1
|
||||
*/
|
||||
@Data
|
||||
public static class Mail {
|
||||
private boolean enabled;
|
||||
@@ -655,102 +637,6 @@ public class ApplicationProperties {
|
||||
private Boolean sslCheckServerIdentity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Telegram bot configuration properties.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
@Data
|
||||
public static class Telegram {
|
||||
private Boolean enabled = false;
|
||||
@ToString.Exclude private String botToken;
|
||||
private String botUsername;
|
||||
private String pipelineInboxFolder = "telegram";
|
||||
private Boolean customFolderSuffix = false;
|
||||
private Boolean enableAllowUserIDs = false;
|
||||
private List<Long> allowUserIDs = new ArrayList<>();
|
||||
private Boolean enableAllowChannelIDs = false;
|
||||
private List<Long> allowChannelIDs = new ArrayList<>();
|
||||
private long processingTimeoutSeconds = 180;
|
||||
private long pollingIntervalMillis = 2000;
|
||||
private Feedback feedback = new Feedback();
|
||||
|
||||
/**
|
||||
* Configuration for feedback messages sent by the Telegram bot.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
@Data
|
||||
public static class Feedback {
|
||||
private Channel channel = new Channel();
|
||||
private User user = new User();
|
||||
|
||||
/**
|
||||
* Channel-specific feedback settings.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
@Data
|
||||
public static class Channel {
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress "no valid document" feedback messages to
|
||||
* the channel (to avoid spam).
|
||||
*/
|
||||
private Boolean noValidDocument = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress generic error feedback messages to the
|
||||
* channel (to avoid spam).
|
||||
*/
|
||||
private Boolean errorMessage = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress processing error feedback messages to the
|
||||
* channel (to avoid spam).
|
||||
*/
|
||||
private Boolean errorProcessing = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress "processing" feedback messages to the
|
||||
* channel (to avoid spam).
|
||||
*/
|
||||
private Boolean processing = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* User-specific feedback settings.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
@Data
|
||||
public static class User {
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress "no valid document" feedback messages to
|
||||
* users (to avoid spam).
|
||||
*/
|
||||
private Boolean noValidDocument = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress generic error feedback messages to users
|
||||
* (to avoid spam).
|
||||
*/
|
||||
private Boolean errorMessage = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress processing error feedback messages to users
|
||||
* (to avoid spam).
|
||||
*/
|
||||
private Boolean errorProcessing = true;
|
||||
|
||||
/**
|
||||
* Set to {@code false} to hide/suppress "processing" feedback messages to users (to
|
||||
* avoid spam).
|
||||
*/
|
||||
private Boolean processing = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Premium {
|
||||
private boolean enabled;
|
||||
@@ -827,16 +713,6 @@ public class ApplicationProperties {
|
||||
public static class ProcessExecutor {
|
||||
private SessionLimit sessionLimit = new SessionLimit();
|
||||
private TimeoutMinutes timeoutMinutes = new TimeoutMinutes();
|
||||
private boolean autoUnoServer = true;
|
||||
private List<UnoServerEndpoint> unoServerEndpoints = new ArrayList<>();
|
||||
|
||||
@Data
|
||||
public static class UnoServerEndpoint {
|
||||
private String host = "127.0.0.1";
|
||||
private int port = 2003;
|
||||
private String hostLocation = "auto"; // auto|local|remote
|
||||
private String protocol = "http"; // http|https
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class SessionLimit {
|
||||
|
||||
@@ -1,417 +1,651 @@
|
||||
package stirling.software.common.util;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.time.ZoneOffset;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.simplejavamail.api.email.AttachmentResource;
|
||||
import org.simplejavamail.api.email.Email;
|
||||
import org.simplejavamail.api.email.Recipient;
|
||||
import org.simplejavamail.converter.EmailConverter;
|
||||
|
||||
import jakarta.activation.DataSource;
|
||||
import jakarta.mail.Message.RecipientType;
|
||||
import org.springframework.http.MediaType;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.api.converters.EmlToPdfRequest;
|
||||
|
||||
@Slf4j
|
||||
@UtilityClass
|
||||
public class EmlParser {
|
||||
|
||||
// Configuration constants
|
||||
private final int DEFAULT_MAX_ATTACHMENT_MB = 10;
|
||||
private final long MAX_SIZE_ESTIMATION_BYTES = 500L * 1024 * 1024; // 500MB
|
||||
private static volatile Boolean jakartaMailAvailable = null;
|
||||
private static volatile Method mimeUtilityDecodeTextMethod = null;
|
||||
private static volatile boolean mimeUtilityChecked = false;
|
||||
|
||||
// Message constants
|
||||
private final String NO_CONTENT_MESSAGE = "Email content could not be parsed";
|
||||
private final String ATTACHMENT_PREFIX = "attachment-";
|
||||
private static final Pattern MIME_ENCODED_PATTERN =
|
||||
RegexPatternUtils.getInstance().getMimeEncodedWordPattern();
|
||||
|
||||
public EmailContent extractEmailContent(
|
||||
private static final String DISPOSITION_ATTACHMENT = "attachment";
|
||||
private static final String TEXT_PLAIN = MediaType.TEXT_PLAIN_VALUE;
|
||||
private static final String TEXT_HTML = MediaType.TEXT_HTML_VALUE;
|
||||
private static final String MULTIPART_PREFIX = "multipart/";
|
||||
|
||||
private static final String HEADER_CONTENT_TYPE = "content-type:";
|
||||
private static final String HEADER_CONTENT_DISPOSITION = "content-disposition:";
|
||||
private static final String HEADER_CONTENT_TRANSFER_ENCODING = "content-transfer-encoding:";
|
||||
private static final String HEADER_CONTENT_ID = "Content-ID";
|
||||
private static final String HEADER_SUBJECT = "Subject:";
|
||||
private static final String HEADER_FROM = "From:";
|
||||
private static final String HEADER_TO = "To:";
|
||||
private static final String HEADER_CC = "Cc:";
|
||||
private static final String HEADER_BCC = "Bcc:";
|
||||
private static final String HEADER_DATE = "Date:";
|
||||
|
||||
private static synchronized boolean isJakartaMailAvailable() {
|
||||
if (jakartaMailAvailable == null) {
|
||||
try {
|
||||
Class.forName("jakarta.mail.internet.MimeMessage");
|
||||
Class.forName("jakarta.mail.Session");
|
||||
Class.forName("jakarta.mail.internet.MimeUtility");
|
||||
Class.forName("jakarta.mail.internet.MimePart");
|
||||
Class.forName("jakarta.mail.internet.MimeMultipart");
|
||||
Class.forName("jakarta.mail.Multipart");
|
||||
Class.forName("jakarta.mail.Part");
|
||||
jakartaMailAvailable = true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
jakartaMailAvailable = false;
|
||||
}
|
||||
}
|
||||
return jakartaMailAvailable;
|
||||
}
|
||||
|
||||
public static EmailContent extractEmailContent(
|
||||
byte[] emlBytes, EmlToPdfRequest request, CustomHtmlSanitizer customHtmlSanitizer)
|
||||
throws IOException {
|
||||
|
||||
EmlProcessingUtils.validateEmlInput(emlBytes);
|
||||
|
||||
Email email = parseEmail(emlBytes);
|
||||
return buildEmailContent(email, request, customHtmlSanitizer);
|
||||
}
|
||||
|
||||
private Email parseEmail(byte[] emlBytes) throws IOException {
|
||||
boolean isMsgFile = EmlProcessingUtils.isMsgFile(emlBytes);
|
||||
try (ByteArrayInputStream input = new ByteArrayInputStream(emlBytes)) {
|
||||
Email email;
|
||||
if (isMsgFile) {
|
||||
try {
|
||||
email = EmailConverter.outlookMsgToEmail(input);
|
||||
} catch (Exception e) {
|
||||
// OLE2 magic bytes match but parsing failed - might be DOC/XLS/other OLE2 file
|
||||
throw new IOException(
|
||||
"The file appears to be an OLE2 file (MSG/DOC/XLS) but could not be "
|
||||
+ "parsed as an Outlook email. Ensure it is a valid .msg file: "
|
||||
+ e.getMessage(),
|
||||
e);
|
||||
}
|
||||
} else {
|
||||
email = EmailConverter.emlToEmail(input);
|
||||
}
|
||||
|
||||
return email;
|
||||
} catch (IOException e) {
|
||||
throw e; // Re-throw IOException as-is
|
||||
} catch (Exception e) {
|
||||
throw new IOException(
|
||||
String.format(
|
||||
"Failed to parse EML file with Simple Java Mail: %s", e.getMessage()),
|
||||
e);
|
||||
if (isJakartaMailAvailable()) {
|
||||
return extractEmailContentAdvanced(emlBytes, request, customHtmlSanitizer);
|
||||
} else {
|
||||
return extractEmailContentBasic(emlBytes, customHtmlSanitizer);
|
||||
}
|
||||
}
|
||||
|
||||
private EmailContent buildEmailContent(
|
||||
Email email, EmlToPdfRequest request, CustomHtmlSanitizer customHtmlSanitizer)
|
||||
throws IOException {
|
||||
|
||||
private static EmailContent extractEmailContentBasic(
|
||||
byte[] emlBytes, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
String emlContent = new String(emlBytes, StandardCharsets.UTF_8);
|
||||
EmailContent content = new EmailContent();
|
||||
content.setSubject(defaultString(email.getSubject()));
|
||||
content.setFrom(formatRecipient(email.getFromRecipient()));
|
||||
content.setTo(formatRecipients(email.getRecipients(), RecipientType.TO));
|
||||
content.setCc(formatRecipients(email.getRecipients(), RecipientType.CC));
|
||||
content.setBcc(formatRecipients(email.getRecipients(), RecipientType.BCC));
|
||||
|
||||
Date sentDate = email.getSentDate();
|
||||
if (sentDate != null) {
|
||||
// Use UTC for consistent timezone handling across deployments
|
||||
content.setDate(ZonedDateTime.ofInstant(sentDate.toInstant(), ZoneOffset.UTC));
|
||||
content.setSubject(extractBasicHeader(emlContent, HEADER_SUBJECT));
|
||||
content.setFrom(extractBasicHeader(emlContent, HEADER_FROM));
|
||||
content.setTo(extractBasicHeader(emlContent, HEADER_TO));
|
||||
content.setCc(extractBasicHeader(emlContent, HEADER_CC));
|
||||
content.setBcc(extractBasicHeader(emlContent, HEADER_BCC));
|
||||
|
||||
String dateStr = extractBasicHeader(emlContent, HEADER_DATE);
|
||||
if (!dateStr.isEmpty()) {
|
||||
content.setDateString(dateStr);
|
||||
}
|
||||
|
||||
String htmlBody = email.getHTMLText();
|
||||
if (customHtmlSanitizer != null && htmlBody != null) {
|
||||
htmlBody = customHtmlSanitizer.sanitize(htmlBody);
|
||||
}
|
||||
content.setHtmlBody(htmlBody);
|
||||
|
||||
String textBody = email.getPlainText();
|
||||
if (customHtmlSanitizer != null && textBody != null) {
|
||||
textBody = customHtmlSanitizer.sanitize(textBody);
|
||||
}
|
||||
content.setTextBody(textBody);
|
||||
|
||||
if (isBlank(content.getHtmlBody()) && isBlank(content.getTextBody())) {
|
||||
content.setTextBody(NO_CONTENT_MESSAGE);
|
||||
String htmlBody = extractHtmlBody(emlContent);
|
||||
if (htmlBody != null) {
|
||||
content.setHtmlBody(htmlBody);
|
||||
} else {
|
||||
String textBody = extractTextBody(emlContent);
|
||||
content.setTextBody(textBody != null ? textBody : "Email content could not be parsed");
|
||||
}
|
||||
|
||||
List<EmailAttachment> attachments = new ArrayList<>();
|
||||
attachments.addAll(mapResources(email.getEmbeddedImages(), request, true));
|
||||
attachments.addAll(mapResources(email.getAttachments(), request, false));
|
||||
content.setAttachments(attachments);
|
||||
content.setAttachmentCount(attachments.size());
|
||||
content.getAttachments().addAll(extractAttachmentsBasic(emlContent));
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
private List<EmailAttachment> mapResources(
|
||||
List<AttachmentResource> resources, EmlToPdfRequest request, boolean embedded)
|
||||
throws IOException {
|
||||
private static EmailContent extractEmailContentAdvanced(
|
||||
byte[] emlBytes, EmlToPdfRequest request, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
try {
|
||||
Class<?> sessionClass = Class.forName("jakarta.mail.Session");
|
||||
Class<?> mimeMessageClass = Class.forName("jakarta.mail.internet.MimeMessage");
|
||||
|
||||
if (resources == null || resources.isEmpty()) {
|
||||
return List.of();
|
||||
Method getDefaultInstance =
|
||||
sessionClass.getMethod("getDefaultInstance", Properties.class);
|
||||
Object session = getDefaultInstance.invoke(null, new Properties());
|
||||
|
||||
Class<?>[] constructorArgs = new Class<?>[] {sessionClass, InputStream.class};
|
||||
Constructor<?> mimeMessageConstructor =
|
||||
mimeMessageClass.getConstructor(constructorArgs);
|
||||
Object message =
|
||||
mimeMessageConstructor.newInstance(session, new ByteArrayInputStream(emlBytes));
|
||||
|
||||
return extractFromMimeMessage(message, request, customHtmlSanitizer);
|
||||
|
||||
} catch (ReflectiveOperationException e) {
|
||||
return extractEmailContentBasic(emlBytes, customHtmlSanitizer);
|
||||
}
|
||||
|
||||
List<EmailAttachment> mapped = new ArrayList<>(resources.size());
|
||||
int unnamedCounter = 0; // Start at 0, increment before use
|
||||
|
||||
for (AttachmentResource resource : resources) {
|
||||
if (resource == null) {
|
||||
continue; // Skip null resources early
|
||||
}
|
||||
|
||||
// Pre-determine if this resource needs a generated filename
|
||||
boolean needsGeneratedName = !embedded && needsGeneratedFilename(resource);
|
||||
|
||||
if (needsGeneratedName) {
|
||||
unnamedCounter++;
|
||||
}
|
||||
|
||||
EmailAttachment attachment =
|
||||
toEmailAttachment(resource, request, embedded, unnamedCounter);
|
||||
if (attachment != null) {
|
||||
mapped.add(attachment);
|
||||
}
|
||||
}
|
||||
return mapped;
|
||||
}
|
||||
|
||||
/** Checks if a resource needs a generated filename (has no usable name). */
|
||||
private boolean needsGeneratedFilename(AttachmentResource resource) {
|
||||
if (resource == null) {
|
||||
return false;
|
||||
private static EmailContent extractFromMimeMessage(
|
||||
Object message, EmlToPdfRequest request, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
EmailContent content = new EmailContent();
|
||||
|
||||
try {
|
||||
Class<?> messageClass = message.getClass();
|
||||
|
||||
Method getSubject = messageClass.getMethod("getSubject");
|
||||
String subject = (String) getSubject.invoke(message);
|
||||
content.setSubject(subject != null ? safeMimeDecode(subject) : "No Subject");
|
||||
|
||||
Method getFrom = messageClass.getMethod("getFrom");
|
||||
Object[] fromAddresses = (Object[]) getFrom.invoke(message);
|
||||
content.setFrom(buildAddressString(fromAddresses));
|
||||
|
||||
extractRecipients(message, messageClass, content);
|
||||
|
||||
Method getSentDate = messageClass.getMethod("getSentDate");
|
||||
Date legacyDate = (Date) getSentDate.invoke(message);
|
||||
if (legacyDate != null) {
|
||||
content.setDate(
|
||||
ZonedDateTime.ofInstant(legacyDate.toInstant(), ZoneId.systemDefault()));
|
||||
}
|
||||
|
||||
Method getContent = messageClass.getMethod("getContent");
|
||||
Object messageContent = getContent.invoke(message);
|
||||
|
||||
processMessageContent(message, messageContent, content, request, customHtmlSanitizer);
|
||||
|
||||
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||
content.setSubject("Email Conversion");
|
||||
content.setFrom("Unknown");
|
||||
content.setTo("Unknown");
|
||||
content.setCc("");
|
||||
content.setBcc("");
|
||||
content.setTextBody("Email content could not be parsed with advanced processing");
|
||||
}
|
||||
String resourceName = resource.getName();
|
||||
if (!isBlank(resourceName)) {
|
||||
return false;
|
||||
}
|
||||
DataSource dataSource = resource.getDataSource();
|
||||
return isBlank(dataSource.getName());
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
private EmailAttachment toEmailAttachment(
|
||||
AttachmentResource resource, EmlToPdfRequest request, boolean embedded, int counter)
|
||||
throws IOException {
|
||||
private static void extractRecipients(
|
||||
Object message, Class<?> messageClass, EmailContent content) {
|
||||
try {
|
||||
Method getRecipients =
|
||||
messageClass.getMethod(
|
||||
"getRecipients", Class.forName("jakarta.mail.Message$RecipientType"));
|
||||
Class<?> recipientTypeClass = Class.forName("jakarta.mail.Message$RecipientType");
|
||||
|
||||
if (resource == null) {
|
||||
return null;
|
||||
}
|
||||
Object toType = recipientTypeClass.getField("TO").get(null);
|
||||
Object[] toRecipients = (Object[]) getRecipients.invoke(message, toType);
|
||||
content.setTo(buildAddressString(toRecipients));
|
||||
|
||||
EmailAttachment attachment = new EmailAttachment();
|
||||
attachment.setEmbedded(embedded);
|
||||
Object ccType = recipientTypeClass.getField("CC").get(null);
|
||||
Object[] ccRecipients = (Object[]) getRecipients.invoke(message, ccType);
|
||||
content.setCc(buildAddressString(ccRecipients));
|
||||
|
||||
String resourceName = defaultString(resource.getName());
|
||||
String filename = resourceName;
|
||||
DataSource dataSource = resource.getDataSource();
|
||||
String contentType = dataSource.getContentType();
|
||||
Object bccType = recipientTypeClass.getField("BCC").get(null);
|
||||
Object[] bccRecipients = (Object[]) getRecipients.invoke(message, bccType);
|
||||
content.setBcc(buildAddressString(bccRecipients));
|
||||
|
||||
if (!isBlank(dataSource.getName())) {
|
||||
filename = dataSource.getName();
|
||||
}
|
||||
filename = safeMimeDecode(filename);
|
||||
|
||||
// Generate unique filename for unnamed attachments
|
||||
if (isBlank(filename)) {
|
||||
String extension = detectExtensionFromMimeType(contentType);
|
||||
filename = embedded ? resourceName : (ATTACHMENT_PREFIX + counter + extension);
|
||||
}
|
||||
attachment.setFilename(filename);
|
||||
|
||||
String contentId = embedded ? stripCid(resourceName) : null;
|
||||
attachment.setContentId(contentId);
|
||||
|
||||
String detectedContentType = EmlProcessingUtils.detectMimeType(filename, contentType);
|
||||
attachment.setContentType(detectedContentType);
|
||||
|
||||
// Read data with size limit to prevent OOM
|
||||
ReadResult readResult = readData(dataSource, embedded, request);
|
||||
if (readResult != null) {
|
||||
attachment.setSizeBytes(readResult.totalSize);
|
||||
if (shouldIncludeAttachmentData(embedded, request, readResult)) {
|
||||
attachment.setData(readResult.data);
|
||||
} catch (ReflectiveOperationException e) {
|
||||
try {
|
||||
Method getAllRecipients = messageClass.getMethod("getAllRecipients");
|
||||
Object[] recipients = (Object[]) getAllRecipients.invoke(message);
|
||||
content.setTo(buildAddressString(recipients));
|
||||
content.setCc("");
|
||||
content.setBcc("");
|
||||
} catch (ReflectiveOperationException ex) {
|
||||
content.setTo("");
|
||||
content.setCc("");
|
||||
content.setBcc("");
|
||||
}
|
||||
}
|
||||
|
||||
return attachment;
|
||||
}
|
||||
|
||||
private boolean shouldIncludeAttachmentData(
|
||||
boolean embedded, EmlToPdfRequest request, ReadResult readResult) {
|
||||
// Always include embedded images for proper rendering
|
||||
if (embedded) {
|
||||
return readResult != null && readResult.data() != null;
|
||||
}
|
||||
// Check if attachments are requested and data is available within size limit
|
||||
if (request == null || !request.isIncludeAttachments()) {
|
||||
return false;
|
||||
}
|
||||
if (readResult == null || readResult.data() == null) {
|
||||
return false;
|
||||
}
|
||||
return readResult.data().length <= getMaxAttachmentSizeBytes(request);
|
||||
}
|
||||
|
||||
private String detectExtensionFromMimeType(String mimeType) {
|
||||
if (mimeType == null) {
|
||||
private static String buildAddressString(Object[] addresses) {
|
||||
if (addresses == null || addresses.length == 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
String lower = mimeType.toLowerCase(Locale.ROOT);
|
||||
|
||||
// Remove any parameters (e.g., "text/plain; charset=utf-8" -> "text/plain")
|
||||
int semicolon = lower.indexOf(';');
|
||||
if (semicolon > 0) {
|
||||
lower = lower.substring(0, semicolon).trim();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int i = 0; i < addresses.length; i++) {
|
||||
if (i > 0) builder.append(", ");
|
||||
builder.append(safeMimeDecode(addresses[i].toString()));
|
||||
}
|
||||
|
||||
// Match exact MIME types first, then fall back to contains() for variants
|
||||
return switch (lower) {
|
||||
case "application/pdf" -> ".pdf";
|
||||
case "image/png" -> ".png";
|
||||
case "image/jpeg", "image/jpg" -> ".jpg";
|
||||
case "image/gif" -> ".gif";
|
||||
case "image/webp" -> ".webp";
|
||||
case "image/bmp" -> ".bmp";
|
||||
case "text/plain" -> ".txt";
|
||||
case "text/html" -> ".html";
|
||||
case "text/xml", "application/xml" -> ".xml";
|
||||
case "application/json" -> ".json";
|
||||
case "application/zip" -> ".zip";
|
||||
case "application/octet-stream" -> ".bin";
|
||||
default -> {
|
||||
if (lower.contains("wordprocessingml") || lower.contains("msword")) yield ".docx";
|
||||
if (lower.contains("spreadsheetml") || lower.contains("excel")) yield ".xlsx";
|
||||
if (lower.contains("presentationml") || lower.contains("powerpoint")) yield ".pptx";
|
||||
if (lower.contains("opendocument.text")) yield ".odt";
|
||||
if (lower.contains("opendocument.spreadsheet")) yield ".ods";
|
||||
yield "";
|
||||
}
|
||||
};
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private ReadResult readData(DataSource dataSource, boolean embedded, EmlToPdfRequest request)
|
||||
throws IOException {
|
||||
if (dataSource == null) {
|
||||
return null;
|
||||
}
|
||||
private static void processMessageContent(
|
||||
Object message,
|
||||
Object messageContent,
|
||||
EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
try {
|
||||
if (messageContent instanceof String stringContent) {
|
||||
Method getContentType = message.getClass().getMethod("getContentType");
|
||||
String contentType = (String) getContentType.invoke(message);
|
||||
|
||||
long maxBytes = getMaxAttachmentSizeBytes(request);
|
||||
|
||||
try (InputStream input = dataSource.getInputStream()) {
|
||||
// Embedded images are usually needed for display regardless of size,
|
||||
// but regular attachments should be guarded against OOM
|
||||
if (!embedded && request != null) {
|
||||
byte[] buffer = new byte[8192];
|
||||
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||
int bytesRead;
|
||||
long totalBytes = 0;
|
||||
while ((bytesRead = input.read(buffer)) != -1) {
|
||||
totalBytes += bytesRead;
|
||||
if (totalBytes > maxBytes) {
|
||||
// Attachment too large - skip remaining data but estimate total size
|
||||
long remainingBytes = countRemainingBytes(input, totalBytes);
|
||||
log.debug(
|
||||
"Attachment exceeds size limit: {} bytes (max: {} bytes), skipping",
|
||||
remainingBytes,
|
||||
maxBytes);
|
||||
return new ReadResult(null, remainingBytes);
|
||||
}
|
||||
output.write(buffer, 0, bytesRead);
|
||||
if (contentType != null
|
||||
&& contentType.toLowerCase(Locale.ROOT).contains(TEXT_HTML)) {
|
||||
content.setHtmlBody(stringContent);
|
||||
} else {
|
||||
content.setTextBody(stringContent);
|
||||
}
|
||||
byte[] data = output.toByteArray();
|
||||
return new ReadResult(data, data.length);
|
||||
} else {
|
||||
byte[] data = input.readAllBytes();
|
||||
return new ReadResult(data, data.length);
|
||||
Class<?> multipartClass = Class.forName("jakarta.mail.Multipart");
|
||||
if (multipartClass.isInstance(messageContent)) {
|
||||
processMultipart(messageContent, content, request, customHtmlSanitizer, 0);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
if (embedded) {
|
||||
log.debug(
|
||||
"Failed to read embedded image, using empty placeholder: {}",
|
||||
e.getMessage());
|
||||
return new ReadResult(new byte[0], 0);
|
||||
}
|
||||
throw e;
|
||||
} catch (ReflectiveOperationException | ClassCastException e) {
|
||||
content.setTextBody("Email content could not be parsed with advanced processing");
|
||||
}
|
||||
}
|
||||
|
||||
private long countRemainingBytes(InputStream input, long alreadyRead) throws IOException {
|
||||
long count = alreadyRead;
|
||||
private static void processMultipart(
|
||||
Object multipart,
|
||||
EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
CustomHtmlSanitizer customHtmlSanitizer,
|
||||
int depth) {
|
||||
|
||||
long skipped;
|
||||
while (count < MAX_SIZE_ESTIMATION_BYTES
|
||||
&& (skipped = input.skip(MAX_SIZE_ESTIMATION_BYTES - count)) > 0) {
|
||||
count += skipped;
|
||||
final int MAX_MULTIPART_DEPTH = 10;
|
||||
if (depth > MAX_MULTIPART_DEPTH) {
|
||||
content.setHtmlBody("<div class=\"error\">Maximum multipart depth exceeded</div>");
|
||||
return;
|
||||
}
|
||||
|
||||
if (count < MAX_SIZE_ESTIMATION_BYTES && input.available() > 0) {
|
||||
byte[] buffer = new byte[8192];
|
||||
int read;
|
||||
while ((read = input.read(buffer)) != -1 && count < MAX_SIZE_ESTIMATION_BYTES) {
|
||||
count += read;
|
||||
try {
|
||||
Class<?> multipartClass = multipart.getClass();
|
||||
Method getCount = multipartClass.getMethod("getCount");
|
||||
int count = (Integer) getCount.invoke(multipart);
|
||||
|
||||
Method getBodyPart = multipartClass.getMethod("getBodyPart", int.class);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
Object part = getBodyPart.invoke(multipart, i);
|
||||
processPart(part, content, request, customHtmlSanitizer, depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
} catch (ReflectiveOperationException | ClassCastException e) {
|
||||
content.setHtmlBody("<div class=\"error\">Error processing multipart content</div>");
|
||||
}
|
||||
}
|
||||
|
||||
private String formatRecipients(List<Recipient> recipients, RecipientType type) {
|
||||
if (recipients == null || type == null) {
|
||||
private static void processPart(
|
||||
Object part,
|
||||
EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
CustomHtmlSanitizer customHtmlSanitizer,
|
||||
int depth) {
|
||||
try {
|
||||
Class<?> partClass = part.getClass();
|
||||
|
||||
Method isMimeType = partClass.getMethod("isMimeType", String.class);
|
||||
Method getContent = partClass.getMethod("getContent");
|
||||
Method getDisposition = partClass.getMethod("getDisposition");
|
||||
Method getFileName = partClass.getMethod("getFileName");
|
||||
Method getContentType = partClass.getMethod("getContentType");
|
||||
Method getHeader = partClass.getMethod("getHeader", String.class);
|
||||
|
||||
Object disposition = getDisposition.invoke(part);
|
||||
String filename = (String) getFileName.invoke(part);
|
||||
String contentType = (String) getContentType.invoke(part);
|
||||
|
||||
String normalizedDisposition =
|
||||
disposition != null ? ((String) disposition).toLowerCase(Locale.ROOT) : null;
|
||||
|
||||
if ((Boolean) isMimeType.invoke(part, TEXT_PLAIN) && normalizedDisposition == null) {
|
||||
Object partContent = getContent.invoke(part);
|
||||
if (partContent instanceof String stringContent) {
|
||||
content.setTextBody(stringContent);
|
||||
}
|
||||
} else if ((Boolean) isMimeType.invoke(part, TEXT_HTML)
|
||||
&& normalizedDisposition == null) {
|
||||
Object partContent = getContent.invoke(part);
|
||||
if (partContent instanceof String stringContent) {
|
||||
String htmlBody =
|
||||
customHtmlSanitizer != null
|
||||
? customHtmlSanitizer.sanitize(stringContent)
|
||||
: stringContent;
|
||||
content.setHtmlBody(htmlBody);
|
||||
}
|
||||
} else if ((normalizedDisposition != null
|
||||
&& normalizedDisposition.contains(DISPOSITION_ATTACHMENT))
|
||||
|| (filename != null && !filename.trim().isEmpty())) {
|
||||
|
||||
processAttachment(
|
||||
part, content, request, getHeader, getContent, filename, contentType);
|
||||
} else if ((Boolean) isMimeType.invoke(part, "multipart/*")) {
|
||||
Object multipartContent = getContent.invoke(part);
|
||||
if (multipartContent != null) {
|
||||
Class<?> multipartClass = Class.forName("jakarta.mail.Multipart");
|
||||
if (multipartClass.isInstance(multipartContent)) {
|
||||
processMultipart(
|
||||
multipartContent, content, request, customHtmlSanitizer, depth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||
// Continue processing other parts if one fails
|
||||
}
|
||||
}
|
||||
|
||||
private static void processAttachment(
|
||||
Object part,
|
||||
EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
Method getHeader,
|
||||
Method getContent,
|
||||
String filename,
|
||||
String contentType) {
|
||||
|
||||
content.setAttachmentCount(content.getAttachmentCount() + 1);
|
||||
|
||||
if (filename != null && !filename.trim().isEmpty()) {
|
||||
EmailAttachment attachment = new EmailAttachment();
|
||||
attachment.setFilename(safeMimeDecode(filename));
|
||||
attachment.setContentType(contentType);
|
||||
|
||||
try {
|
||||
String[] contentIdHeaders = (String[]) getHeader.invoke(part, HEADER_CONTENT_ID);
|
||||
if (contentIdHeaders != null) {
|
||||
for (String contentIdHeader : contentIdHeaders) {
|
||||
if (contentIdHeader != null && !contentIdHeader.trim().isEmpty()) {
|
||||
attachment.setEmbedded(true);
|
||||
String contentId =
|
||||
RegexPatternUtils.getInstance()
|
||||
.getAngleBracketsPattern()
|
||||
.matcher(contentIdHeader.trim())
|
||||
.replaceAll("");
|
||||
attachment.setContentId(contentId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ReflectiveOperationException e) {
|
||||
}
|
||||
|
||||
if ((request != null && request.isIncludeAttachments()) || attachment.isEmbedded()) {
|
||||
extractAttachmentData(part, attachment, getContent, request);
|
||||
}
|
||||
|
||||
content.getAttachments().add(attachment);
|
||||
}
|
||||
}
|
||||
|
||||
private static void extractAttachmentData(
|
||||
Object part, EmailAttachment attachment, Method getContent, EmlToPdfRequest request) {
|
||||
try {
|
||||
Object attachmentContent = getContent.invoke(part);
|
||||
byte[] attachmentData = null;
|
||||
|
||||
if (attachmentContent instanceof InputStream inputStream) {
|
||||
try (InputStream stream = inputStream) {
|
||||
attachmentData = stream.readAllBytes();
|
||||
} catch (IOException e) {
|
||||
if (attachment.isEmbedded()) {
|
||||
attachmentData = new byte[0];
|
||||
} else {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
} else if (attachmentContent instanceof byte[] byteArray) {
|
||||
attachmentData = byteArray;
|
||||
} else if (attachmentContent instanceof String stringContent) {
|
||||
attachmentData = stringContent.getBytes(StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
if (attachmentData != null) {
|
||||
long maxSizeMB = request != null ? request.getMaxAttachmentSizeMB() : 10L;
|
||||
long maxSizeBytes = maxSizeMB * 1024 * 1024;
|
||||
|
||||
if (attachmentData.length <= maxSizeBytes || attachment.isEmbedded()) {
|
||||
attachment.setData(attachmentData);
|
||||
attachment.setSizeBytes(attachmentData.length);
|
||||
} else {
|
||||
attachment.setSizeBytes(attachmentData.length);
|
||||
}
|
||||
}
|
||||
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||
// Continue without attachment data
|
||||
}
|
||||
}
|
||||
|
||||
private static String extractBasicHeader(String emlContent, String headerName) {
|
||||
try {
|
||||
String[] lines =
|
||||
RegexPatternUtils.getInstance().getNewlineSplitPattern().split(emlContent);
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
String line = lines[i];
|
||||
if (line.toLowerCase(Locale.ROOT).startsWith(headerName.toLowerCase(Locale.ROOT))) {
|
||||
StringBuilder value =
|
||||
new StringBuilder(line.substring(headerName.length()).trim());
|
||||
for (int j = i + 1; j < lines.length; j++) {
|
||||
if (lines[j].startsWith(" ") || lines[j].startsWith("\t")) {
|
||||
value.append(" ").append(lines[j].trim());
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return safeMimeDecode(value.toString());
|
||||
}
|
||||
if (line.trim().isEmpty()) break;
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
// Ignore errors in header extraction
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private static String extractHtmlBody(String emlContent) {
|
||||
try {
|
||||
String lowerContent = emlContent.toLowerCase(Locale.ROOT);
|
||||
int htmlStart = lowerContent.indexOf(HEADER_CONTENT_TYPE + " " + TEXT_HTML);
|
||||
if (htmlStart == -1) return null;
|
||||
|
||||
int bodyStart = emlContent.indexOf("\r\n\r\n", htmlStart);
|
||||
if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n", htmlStart);
|
||||
if (bodyStart == -1) return null;
|
||||
|
||||
bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2;
|
||||
int bodyEnd = findPartEnd(emlContent, bodyStart);
|
||||
|
||||
return emlContent.substring(bodyStart, bodyEnd).trim();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static String extractTextBody(String emlContent) {
|
||||
try {
|
||||
String lowerContent = emlContent.toLowerCase(Locale.ROOT);
|
||||
int textStart = lowerContent.indexOf(HEADER_CONTENT_TYPE + " " + TEXT_PLAIN);
|
||||
if (textStart == -1) {
|
||||
int bodyStart = emlContent.indexOf("\r\n\r\n");
|
||||
if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n");
|
||||
if (bodyStart != -1) {
|
||||
bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2;
|
||||
int bodyEnd = findPartEnd(emlContent, bodyStart);
|
||||
return emlContent.substring(bodyStart, bodyEnd).trim();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
int bodyStart = emlContent.indexOf("\r\n\r\n", textStart);
|
||||
if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n", textStart);
|
||||
if (bodyStart == -1) return null;
|
||||
|
||||
bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2;
|
||||
int bodyEnd = findPartEnd(emlContent, bodyStart);
|
||||
|
||||
return emlContent.substring(bodyStart, bodyEnd).trim();
|
||||
} catch (RuntimeException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static int findPartEnd(String content, int start) {
|
||||
String[] lines =
|
||||
RegexPatternUtils.getInstance()
|
||||
.getNewlineSplitPattern()
|
||||
.split(content.substring(start));
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
for (String line : lines) {
|
||||
if (line.startsWith("--") && line.length() > 10) break;
|
||||
result.append(line).append("\n");
|
||||
}
|
||||
|
||||
return start + result.length();
|
||||
}
|
||||
|
||||
private static List<EmailAttachment> extractAttachmentsBasic(String emlContent) {
|
||||
List<EmailAttachment> attachments = new ArrayList<>();
|
||||
try {
|
||||
String[] lines =
|
||||
RegexPatternUtils.getInstance().getNewlineSplitPattern().split(emlContent);
|
||||
boolean inHeaders = true;
|
||||
String currentContentType = "";
|
||||
String currentDisposition = "";
|
||||
String currentFilename = "";
|
||||
String currentEncoding = "";
|
||||
|
||||
for (String line : lines) {
|
||||
String lowerLine = line.toLowerCase(Locale.ROOT).trim();
|
||||
|
||||
if (line.trim().isEmpty()) {
|
||||
inHeaders = false;
|
||||
if (isAttachment(currentDisposition, currentFilename, currentContentType)) {
|
||||
EmailAttachment attachment = new EmailAttachment();
|
||||
attachment.setFilename(currentFilename);
|
||||
attachment.setContentType(currentContentType);
|
||||
attachment.setTransferEncoding(currentEncoding);
|
||||
attachments.add(attachment);
|
||||
}
|
||||
currentContentType = "";
|
||||
currentDisposition = "";
|
||||
currentFilename = "";
|
||||
currentEncoding = "";
|
||||
inHeaders = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!inHeaders) continue;
|
||||
|
||||
if (lowerLine.startsWith(HEADER_CONTENT_TYPE)) {
|
||||
currentContentType = line.substring(HEADER_CONTENT_TYPE.length()).trim();
|
||||
} else if (lowerLine.startsWith(HEADER_CONTENT_DISPOSITION)) {
|
||||
currentDisposition = line.substring(HEADER_CONTENT_DISPOSITION.length()).trim();
|
||||
currentFilename = extractFilenameFromDisposition(currentDisposition);
|
||||
} else if (lowerLine.startsWith(HEADER_CONTENT_TRANSFER_ENCODING)) {
|
||||
currentEncoding =
|
||||
line.substring(HEADER_CONTENT_TRANSFER_ENCODING.length()).trim();
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
// Continue with empty list
|
||||
}
|
||||
return attachments;
|
||||
}
|
||||
|
||||
private static boolean isAttachment(String disposition, String filename, String contentType) {
|
||||
return (disposition.toLowerCase(Locale.ROOT).contains(DISPOSITION_ATTACHMENT)
|
||||
&& !filename.isEmpty())
|
||||
|| (!filename.isEmpty()
|
||||
&& !contentType.toLowerCase(Locale.ROOT).startsWith("text/"))
|
||||
|| (contentType.toLowerCase(Locale.ROOT).contains("application/")
|
||||
&& !filename.isEmpty());
|
||||
}
|
||||
|
||||
private static String extractFilenameFromDisposition(String disposition) {
|
||||
if (disposition == null || !disposition.contains("filename=")) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return recipients.stream()
|
||||
.filter(Objects::nonNull)
|
||||
// Use type.equals() for null-safe comparison (recipient.getType() may be null)
|
||||
.filter(recipient -> type.equals(recipient.getType()))
|
||||
.map(EmlParser::formatRecipient)
|
||||
.filter(string -> !isBlank(string))
|
||||
.collect(Collectors.joining(", "));
|
||||
// Handle filename*= (RFC 2231 encoded filename)
|
||||
if (disposition.toLowerCase(Locale.ROOT).contains("filename*=")) {
|
||||
int filenameStarStart = disposition.toLowerCase(Locale.ROOT).indexOf("filename*=") + 10;
|
||||
int filenameStarEnd = disposition.indexOf(";", filenameStarStart);
|
||||
if (filenameStarEnd == -1) filenameStarEnd = disposition.length();
|
||||
String extendedFilename =
|
||||
disposition.substring(filenameStarStart, filenameStarEnd).trim();
|
||||
extendedFilename =
|
||||
RegexPatternUtils.getInstance()
|
||||
.getQuotesRemovalPattern()
|
||||
.matcher(extendedFilename)
|
||||
.replaceAll("");
|
||||
|
||||
if (extendedFilename.contains("'")) {
|
||||
String[] parts = extendedFilename.split("'", 3);
|
||||
if (parts.length == 3) {
|
||||
return EmlProcessingUtils.decodeUrlEncoded(parts[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle regular filename=
|
||||
int filenameStart = disposition.toLowerCase(Locale.ROOT).indexOf("filename=") + 9;
|
||||
int filenameEnd = disposition.indexOf(";", filenameStart);
|
||||
if (filenameEnd == -1) filenameEnd = disposition.length();
|
||||
String filename = disposition.substring(filenameStart, filenameEnd).trim();
|
||||
filename =
|
||||
RegexPatternUtils.getInstance()
|
||||
.getQuotesRemovalPattern()
|
||||
.matcher(filename)
|
||||
.replaceAll("");
|
||||
return safeMimeDecode(filename);
|
||||
}
|
||||
|
||||
private String formatRecipient(Recipient recipient) {
|
||||
if (recipient == null) {
|
||||
public static String safeMimeDecode(String headerValue) {
|
||||
if (headerValue == null || headerValue.trim().isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
String name = safeMimeDecode(recipient.getName());
|
||||
String address = safeMimeDecode(recipient.getAddress());
|
||||
|
||||
if (!isBlank(name) && !isBlank(address)) {
|
||||
return name + " <" + address + ">";
|
||||
if (!mimeUtilityChecked) {
|
||||
synchronized (EmlParser.class) {
|
||||
if (!mimeUtilityChecked) {
|
||||
initializeMimeUtilityDecoding();
|
||||
}
|
||||
}
|
||||
}
|
||||
return !isBlank(name) ? name : address;
|
||||
}
|
||||
|
||||
public String safeMimeDecode(String headerValue) {
|
||||
if (isBlank(headerValue)) {
|
||||
return "";
|
||||
if (mimeUtilityDecodeTextMethod != null) {
|
||||
try {
|
||||
return (String) mimeUtilityDecodeTextMethod.invoke(null, headerValue.trim());
|
||||
} catch (ReflectiveOperationException | RuntimeException e) {
|
||||
// Fall through to custom implementation
|
||||
}
|
||||
}
|
||||
|
||||
return EmlProcessingUtils.decodeMimeHeader(headerValue.trim());
|
||||
}
|
||||
|
||||
private String stripCid(String contentId) {
|
||||
if (contentId == null) {
|
||||
return null;
|
||||
}
|
||||
return RegexPatternUtils.getInstance()
|
||||
.getAngleBracketsPattern()
|
||||
.matcher(contentId)
|
||||
.replaceAll("")
|
||||
.trim();
|
||||
}
|
||||
|
||||
private long getMaxAttachmentSizeBytes(EmlToPdfRequest request) {
|
||||
long maxMb = request != null ? request.getMaxAttachmentSizeMB() : DEFAULT_MAX_ATTACHMENT_MB;
|
||||
return maxMb * 1024L * 1024L;
|
||||
}
|
||||
|
||||
private boolean isBlank(String value) {
|
||||
return value == null || value.trim().isEmpty();
|
||||
}
|
||||
|
||||
private String defaultString(String value) {
|
||||
return value != null ? value : "";
|
||||
}
|
||||
|
||||
private record ReadResult(byte[] data, long totalSize) {
|
||||
public ReadResult {
|
||||
if (totalSize < 0) {
|
||||
throw new IllegalArgumentException("Size cannot be negative: " + totalSize);
|
||||
}
|
||||
if (data != null && data.length > totalSize) {
|
||||
throw new IllegalArgumentException(
|
||||
"Data length (" + data.length + ") exceeds total size (" + totalSize + ")");
|
||||
}
|
||||
private static void initializeMimeUtilityDecoding() {
|
||||
try {
|
||||
Class<?> mimeUtilityClass = Class.forName("jakarta.mail.internet.MimeUtility");
|
||||
mimeUtilityDecodeTextMethod = mimeUtilityClass.getMethod("decodeText", String.class);
|
||||
} catch (ClassNotFoundException | NoSuchMethodException e) {
|
||||
mimeUtilityDecodeTextMethod = null;
|
||||
}
|
||||
mimeUtilityChecked = true;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class EmailContent {
|
||||
public static class EmailContent {
|
||||
private String subject;
|
||||
private String from;
|
||||
private String to;
|
||||
private String cc;
|
||||
private String bcc;
|
||||
private ZonedDateTime date;
|
||||
private String dateString; // Maintained for compatibility
|
||||
private String dateString; // For basic parsing fallback
|
||||
private String htmlBody;
|
||||
private String textBody;
|
||||
private int attachmentCount;
|
||||
@@ -439,7 +673,7 @@ public class EmlParser {
|
||||
}
|
||||
|
||||
@Data
|
||||
public class EmailAttachment {
|
||||
public static class EmailAttachment {
|
||||
private String filename;
|
||||
private String contentType;
|
||||
private byte[] data;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package stirling.software.common.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
@@ -10,41 +8,32 @@ import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
|
||||
import lombok.Synchronized;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.api.converters.EmlToPdfRequest;
|
||||
import stirling.software.common.model.api.converters.HTMLToPdfRequest;
|
||||
|
||||
@Slf4j
|
||||
@UtilityClass
|
||||
public class EmlProcessingUtils {
|
||||
|
||||
// Style constants
|
||||
private final int DEFAULT_FONT_SIZE = 12;
|
||||
private final String DEFAULT_FONT_FAMILY = "Helvetica, sans-serif";
|
||||
private final float DEFAULT_LINE_HEIGHT = 1.4f;
|
||||
private final String DEFAULT_ZOOM = "1.0";
|
||||
private final String DEFAULT_TEXT_COLOR = "#202124";
|
||||
private final String DEFAULT_BACKGROUND_COLOR = "#ffffff";
|
||||
private final String DEFAULT_BORDER_COLOR = "#e8eaed";
|
||||
private final String ATTACHMENT_BACKGROUND_COLOR = "#f9f9f9";
|
||||
private final String ATTACHMENT_BORDER_COLOR = "#eeeeee";
|
||||
private static final int DEFAULT_FONT_SIZE = 12;
|
||||
private static final String DEFAULT_FONT_FAMILY = "Helvetica, sans-serif";
|
||||
private static final float DEFAULT_LINE_HEIGHT = 1.4f;
|
||||
private static final String DEFAULT_ZOOM = "1.0";
|
||||
private static final String DEFAULT_TEXT_COLOR = "#202124";
|
||||
private static final String DEFAULT_BACKGROUND_COLOR = "#ffffff";
|
||||
private static final String DEFAULT_BORDER_COLOR = "#e8eaed";
|
||||
private static final String ATTACHMENT_BACKGROUND_COLOR = "#f9f9f9";
|
||||
private static final String ATTACHMENT_BORDER_COLOR = "#eeeeee";
|
||||
|
||||
private final String CSS_RESOURCE_PATH = "templates/email-pdf-styles.css";
|
||||
private final int EML_CHECK_LENGTH = 8192;
|
||||
private final int MIN_HEADER_COUNT_FOR_VALID_EML = 2;
|
||||
// MSG file magic bytes (Compound File Binary Format / OLE2)
|
||||
// D0 CF 11 E0 A1 B1 1A E1
|
||||
private final byte[] MSG_MAGIC_BYTES = {
|
||||
(byte) 0xD0, (byte) 0xCF, (byte) 0x11, (byte) 0xE0,
|
||||
(byte) 0xA1, (byte) 0xB1, (byte) 0x1A, (byte) 0xE1
|
||||
};
|
||||
private final Map<String, String> EXTENSION_TO_MIME_TYPE =
|
||||
private static final int EML_CHECK_LENGTH = 8192;
|
||||
private static final int MIN_HEADER_COUNT_FOR_VALID_EML = 2;
|
||||
|
||||
// MIME type detection
|
||||
private static final Map<String, String> EXTENSION_TO_MIME_TYPE =
|
||||
Map.of(
|
||||
".png", MediaType.IMAGE_PNG_VALUE,
|
||||
".jpg", MediaType.IMAGE_JPEG_VALUE,
|
||||
@@ -56,36 +45,18 @@ public class EmlProcessingUtils {
|
||||
".ico", "image/x-icon",
|
||||
".tiff", "image/tiff",
|
||||
".tif", "image/tiff");
|
||||
private volatile String cachedCssContent = null;
|
||||
|
||||
public void validateEmlInput(byte[] emlBytes) {
|
||||
public static void validateEmlInput(byte[] emlBytes) {
|
||||
if (emlBytes == null || emlBytes.length == 0) {
|
||||
throw ExceptionUtils.createEmlEmptyException();
|
||||
}
|
||||
|
||||
if (isMsgFile(emlBytes)) {
|
||||
return; // Valid MSG file, no further EML validation needed
|
||||
}
|
||||
|
||||
if (isInvalidEmlFormat(emlBytes)) {
|
||||
throw ExceptionUtils.createEmlInvalidFormatException();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMsgFile(byte[] fileBytes) {
|
||||
if (fileBytes == null || fileBytes.length < MSG_MAGIC_BYTES.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < MSG_MAGIC_BYTES.length; i++) {
|
||||
if (fileBytes[i] != MSG_MAGIC_BYTES[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isInvalidEmlFormat(byte[] emlBytes) {
|
||||
private static boolean isInvalidEmlFormat(byte[] emlBytes) {
|
||||
try {
|
||||
int checkLength = Math.min(emlBytes.length, EML_CHECK_LENGTH);
|
||||
String content;
|
||||
@@ -130,7 +101,7 @@ public class EmlProcessingUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public String generateEnhancedEmailHtml(
|
||||
public static String generateEnhancedEmailHtml(
|
||||
EmlParser.EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
@@ -174,7 +145,7 @@ public class EmlProcessingUtils {
|
||||
html.append(
|
||||
String.format(
|
||||
Locale.ROOT,
|
||||
"<div><strong>CC:</strong> %s</div>%n",
|
||||
"<div><strong>CC:</strong> %s</div>\n",
|
||||
sanitizeText(content.getCc(), customHtmlSanitizer)));
|
||||
}
|
||||
|
||||
@@ -182,7 +153,7 @@ public class EmlProcessingUtils {
|
||||
html.append(
|
||||
String.format(
|
||||
Locale.ROOT,
|
||||
"<div><strong>BCC:</strong> %s</div>%n",
|
||||
"<div><strong>BCC:</strong> %s</div>\n",
|
||||
sanitizeText(content.getBcc(), customHtmlSanitizer)));
|
||||
}
|
||||
|
||||
@@ -190,19 +161,19 @@ public class EmlProcessingUtils {
|
||||
html.append(
|
||||
String.format(
|
||||
Locale.ROOT,
|
||||
"<div><strong>Date:</strong> %s</div>%n",
|
||||
"<div><strong>Date:</strong> %s</div>\n",
|
||||
PdfAttachmentHandler.formatEmailDate(content.getDate())));
|
||||
} else if (content.getDateString() != null && !content.getDateString().trim().isEmpty()) {
|
||||
html.append(
|
||||
String.format(
|
||||
Locale.ROOT,
|
||||
"<div><strong>Date:</strong> %s</div>%n",
|
||||
"<div><strong>Date:</strong> %s</div>\n",
|
||||
sanitizeText(content.getDateString(), customHtmlSanitizer)));
|
||||
}
|
||||
|
||||
html.append(String.format(Locale.ROOT, "</div></div>%n"));
|
||||
html.append("</div></div>\n");
|
||||
|
||||
html.append(String.format(Locale.ROOT, "<div class=\"email-body\">%n"));
|
||||
html.append("<div class=\"email-body\">\n");
|
||||
if (content.getHtmlBody() != null && !content.getHtmlBody().trim().isEmpty()) {
|
||||
String processedHtml =
|
||||
processEmailHtmlBody(content.getHtmlBody(), content, customHtmlSanitizer);
|
||||
@@ -216,17 +187,17 @@ public class EmlProcessingUtils {
|
||||
} else {
|
||||
html.append("<div class=\"no-content\"><p><em>No content available</em></p></div>");
|
||||
}
|
||||
html.append(String.format(Locale.ROOT, "</div>%n"));
|
||||
html.append("</div>\n");
|
||||
|
||||
if (content.getAttachmentCount() > 0 || !content.getAttachments().isEmpty()) {
|
||||
appendAttachmentsSection(html, content, request);
|
||||
appendAttachmentsSection(html, content, request, customHtmlSanitizer);
|
||||
}
|
||||
|
||||
html.append(String.format(Locale.ROOT, "</div>%n</body></html>"));
|
||||
html.append("</div>\n</body></html>");
|
||||
return html.toString();
|
||||
}
|
||||
|
||||
public String processEmailHtmlBody(
|
||||
public static String processEmailHtmlBody(
|
||||
String htmlBody,
|
||||
EmlParser.EmailContent emailContent,
|
||||
CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
@@ -253,7 +224,8 @@ public class EmlProcessingUtils {
|
||||
return processed;
|
||||
}
|
||||
|
||||
public String convertTextToHtml(String textBody, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
public static String convertTextToHtml(
|
||||
String textBody, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
if (textBody == null) return "";
|
||||
|
||||
String html =
|
||||
@@ -283,25 +255,129 @@ public class EmlProcessingUtils {
|
||||
return html;
|
||||
}
|
||||
|
||||
private void appendEnhancedStyles(StringBuilder html) {
|
||||
html.append(
|
||||
private static void appendEnhancedStyles(StringBuilder html) {
|
||||
String css =
|
||||
String.format(
|
||||
Locale.ROOT,
|
||||
"""
|
||||
:root {
|
||||
--font-family: %s;
|
||||
--font-size: %dpx;
|
||||
--line-height: %s;
|
||||
--text-color: %s;
|
||||
--bg-color: %s;
|
||||
--border-color: %s;
|
||||
--header-font-size: %dpx;
|
||||
--meta-font-size: %dpx;
|
||||
--attachment-bg: %s;
|
||||
--attachment-border: %s;
|
||||
--attachment-header-size: %dpx;
|
||||
--attachment-detail-size: %dpx;
|
||||
--note-font-size: %dpx;
|
||||
body {
|
||||
font-family: %s;
|
||||
font-size: %dpx;
|
||||
line-height: %s;
|
||||
color: %s;
|
||||
margin: 0;
|
||||
padding: 16px;
|
||||
background-color: %s;
|
||||
}
|
||||
|
||||
.email-container {
|
||||
width: 100%%;
|
||||
max-width: 100%%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.email-header {
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid %s;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.email-header h1 {
|
||||
margin: 0 0 10px 0;
|
||||
font-size: %dpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.email-meta div {
|
||||
margin-bottom: 2px;
|
||||
font-size: %dpx;
|
||||
}
|
||||
|
||||
.email-body {
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.attachment-section {
|
||||
margin-top: 15px;
|
||||
padding: 10px;
|
||||
background-color: %s;
|
||||
border: 1px solid %s;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.attachment-section h3 {
|
||||
margin: 0 0 8px 0;
|
||||
font-size: %dpx;
|
||||
}
|
||||
|
||||
.attachment-item {
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.attachment-icon {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.attachment-details, .attachment-type {
|
||||
font-size: %dpx;
|
||||
color: #555555;
|
||||
}
|
||||
|
||||
.attachment-inclusion-note, .attachment-info-note {
|
||||
margin-top: 8px;
|
||||
padding: 6px;
|
||||
font-size: %dpx;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.attachment-inclusion-note {
|
||||
background-color: #e6ffed;
|
||||
border: 1px solid #d4f7dc;
|
||||
color: #006420;
|
||||
}
|
||||
|
||||
.attachment-info-note {
|
||||
background-color: #fff9e6;
|
||||
border: 1px solid #fff0c2;
|
||||
color: #664d00;
|
||||
}
|
||||
|
||||
.attachment-link-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
background-color: #f8f9fa;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 4px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.attachment-link-container:hover {
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
|
||||
.attachment-note {
|
||||
font-size: %dpx;
|
||||
color: #6c757d;
|
||||
font-style: italic;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.no-content {
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.text-body {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%%;
|
||||
height: auto;
|
||||
display: block;
|
||||
}
|
||||
""",
|
||||
DEFAULT_FONT_FAMILY,
|
||||
@@ -310,70 +386,29 @@ public class EmlProcessingUtils {
|
||||
DEFAULT_TEXT_COLOR,
|
||||
DEFAULT_BACKGROUND_COLOR,
|
||||
DEFAULT_BORDER_COLOR,
|
||||
DEFAULT_FONT_SIZE + 6,
|
||||
DEFAULT_FONT_SIZE,
|
||||
DEFAULT_FONT_SIZE + 4,
|
||||
DEFAULT_FONT_SIZE - 1,
|
||||
ATTACHMENT_BACKGROUND_COLOR,
|
||||
ATTACHMENT_BORDER_COLOR,
|
||||
DEFAULT_FONT_SIZE + 2,
|
||||
DEFAULT_FONT_SIZE - 1,
|
||||
DEFAULT_FONT_SIZE - 1));
|
||||
DEFAULT_FONT_SIZE + 1,
|
||||
DEFAULT_FONT_SIZE - 2,
|
||||
DEFAULT_FONT_SIZE - 2,
|
||||
DEFAULT_FONT_SIZE - 3);
|
||||
|
||||
html.append(loadEmailStyles());
|
||||
html.append(css);
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
private String loadEmailStyles() {
|
||||
if (cachedCssContent != null) {
|
||||
return cachedCssContent;
|
||||
}
|
||||
|
||||
try {
|
||||
ClassPathResource resource = new ClassPathResource(CSS_RESOURCE_PATH);
|
||||
try (InputStream inputStream = resource.getInputStream()) {
|
||||
cachedCssContent = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
return cachedCssContent;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.warn("Failed to load email CSS from resource, using fallback: {}", e.getMessage());
|
||||
cachedCssContent = getFallbackStyles(); // Cache fallback to avoid repeated attempts
|
||||
return cachedCssContent;
|
||||
}
|
||||
}
|
||||
|
||||
private String getFallbackStyles() {
|
||||
return """
|
||||
/* Minimal fallback - main CSS resource failed to load */
|
||||
body {
|
||||
font-family: var(--font-family, Helvetica, sans-serif);
|
||||
font-size: var(--font-size, 12px);
|
||||
line-height: var(--line-height, 1.4);
|
||||
color: var(--text-color, #202124);
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.email-container { max-width: 100%; }
|
||||
.email-header { border-bottom: 1px solid #ccc; margin-bottom: 16px; padding-bottom: 12px; }
|
||||
.email-header h1 { margin: 0 0 8px 0; font-size: 18px; }
|
||||
.email-meta { font-size: 12px; color: #666; }
|
||||
.email-body { line-height: 1.6; }
|
||||
.attachment-section { margin-top: 20px; padding: 12px; background: #f5f5f5; border-radius: 4px; }
|
||||
.attachment-item { padding: 6px 0; border-bottom: 1px solid #ddd; }
|
||||
.no-content { padding: 20px; text-align: center; color: #888; font-style: italic; }
|
||||
img { max-width: 100%; height: auto; }
|
||||
""";
|
||||
}
|
||||
|
||||
private void appendAttachmentsSection(
|
||||
StringBuilder html, EmlParser.EmailContent content, EmlToPdfRequest request) {
|
||||
html.append(String.format(Locale.ROOT, "<div class=\"attachment-section\">%n"));
|
||||
private static void appendAttachmentsSection(
|
||||
StringBuilder html,
|
||||
EmlParser.EmailContent content,
|
||||
EmlToPdfRequest request,
|
||||
CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
html.append("<div class=\"attachment-section\">\n");
|
||||
int displayedAttachmentCount =
|
||||
content.getAttachmentCount() > 0
|
||||
? content.getAttachmentCount()
|
||||
: content.getAttachments().size();
|
||||
html.append(
|
||||
String.format(
|
||||
Locale.ROOT, "<h3>Attachments (%d)</h3>%n", displayedAttachmentCount));
|
||||
html.append("<h3>Attachments (").append(displayedAttachmentCount).append(")</h3>\n");
|
||||
|
||||
if (!content.getAttachments().isEmpty()) {
|
||||
for (int i = 0; i < content.getAttachments().size(); i++) {
|
||||
@@ -426,10 +461,10 @@ public class EmlProcessingUtils {
|
||||
</div>
|
||||
""");
|
||||
}
|
||||
html.append(String.format(Locale.ROOT, "</div>%n"));
|
||||
html.append("</div>\n");
|
||||
}
|
||||
|
||||
public HTMLToPdfRequest createHtmlRequest(EmlToPdfRequest request) {
|
||||
public static HTMLToPdfRequest createHtmlRequest(EmlToPdfRequest request) {
|
||||
HTMLToPdfRequest htmlRequest = new HTMLToPdfRequest();
|
||||
|
||||
if (request != null) {
|
||||
@@ -440,7 +475,7 @@ public class EmlProcessingUtils {
|
||||
return htmlRequest;
|
||||
}
|
||||
|
||||
public String detectMimeType(String filename, String existingMimeType) {
|
||||
public static String detectMimeType(String filename, String existingMimeType) {
|
||||
if (existingMimeType != null && !existingMimeType.isEmpty()) {
|
||||
return existingMimeType;
|
||||
}
|
||||
@@ -457,7 +492,7 @@ public class EmlProcessingUtils {
|
||||
return MediaType.IMAGE_PNG_VALUE; // Default MIME type
|
||||
}
|
||||
|
||||
public String decodeUrlEncoded(String encoded) {
|
||||
public static String decodeUrlEncoded(String encoded) {
|
||||
try {
|
||||
return java.net.URLDecoder.decode(encoded, StandardCharsets.UTF_8);
|
||||
} catch (Exception e) {
|
||||
@@ -465,7 +500,7 @@ public class EmlProcessingUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public String decodeMimeHeader(String encodedText) {
|
||||
public static String decodeMimeHeader(String encodedText) {
|
||||
if (encodedText == null || encodedText.trim().isEmpty()) {
|
||||
return encodedText;
|
||||
}
|
||||
@@ -531,7 +566,7 @@ public class EmlProcessingUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private String decodeQuotedPrintable(String encodedText, String charset) {
|
||||
private static String decodeQuotedPrintable(String encodedText, String charset) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (int i = 0; i < encodedText.length(); i++) {
|
||||
char c = encodedText.charAt(i);
|
||||
@@ -574,7 +609,7 @@ public class EmlProcessingUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public String escapeHtml(String text) {
|
||||
public static String escapeHtml(String text) {
|
||||
if (text == null) return "";
|
||||
return text.replace("&", "&")
|
||||
.replace("<", "<")
|
||||
@@ -583,7 +618,7 @@ public class EmlProcessingUtils {
|
||||
.replace("'", "'");
|
||||
}
|
||||
|
||||
public String sanitizeText(String text, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
public static String sanitizeText(String text, CustomHtmlSanitizer customHtmlSanitizer) {
|
||||
if (customHtmlSanitizer != null) {
|
||||
return customHtmlSanitizer.sanitize(text);
|
||||
} else {
|
||||
@@ -591,7 +626,7 @@ public class EmlProcessingUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public String simplifyHtmlContent(String htmlContent) {
|
||||
public static String simplifyHtmlContent(String htmlContent) {
|
||||
String simplified =
|
||||
RegexPatternUtils.getInstance()
|
||||
.getScriptTagPattern()
|
||||
|
||||
@@ -360,6 +360,8 @@ public class PDFToFile {
|
||||
Path inputFile, Path outputFile, String outputFormat, String libreOfficeFilter) {
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add(runtimePathConfig.getUnoConvertPath());
|
||||
command.add("--port");
|
||||
command.add("2003");
|
||||
command.add("--convert-to");
|
||||
command.add(outputFormat);
|
||||
if (libreOfficeFilter != null && !libreOfficeFilter.isBlank()) {
|
||||
|
||||
@@ -6,12 +6,9 @@ import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -29,15 +26,11 @@ public class ProcessExecutor {
|
||||
|
||||
private static final Map<Processes, ProcessExecutor> instances = new ConcurrentHashMap<>();
|
||||
private static ApplicationProperties applicationProperties = new ApplicationProperties();
|
||||
private static volatile UnoServerPool unoServerPool;
|
||||
private final Semaphore semaphore;
|
||||
private final boolean liveUpdates;
|
||||
private long timeoutDuration;
|
||||
private final Processes processType;
|
||||
|
||||
private ProcessExecutor(
|
||||
Processes processType, int semaphoreLimit, boolean liveUpdates, long timeout) {
|
||||
this.processType = processType;
|
||||
private ProcessExecutor(int semaphoreLimit, boolean liveUpdates, long timeout) {
|
||||
this.semaphore = new Semaphore(semaphoreLimit);
|
||||
this.liveUpdates = liveUpdates;
|
||||
this.timeoutDuration = timeout;
|
||||
@@ -180,15 +173,10 @@ public class ProcessExecutor {
|
||||
.getTimeoutMinutes()
|
||||
.getFfmpegTimeoutMinutes();
|
||||
};
|
||||
return new ProcessExecutor(
|
||||
processType, semaphoreLimit, liveUpdates, timeoutMinutes);
|
||||
return new ProcessExecutor(semaphoreLimit, liveUpdates, timeoutMinutes);
|
||||
});
|
||||
}
|
||||
|
||||
public static void setUnoServerPool(UnoServerPool pool) {
|
||||
unoServerPool = pool;
|
||||
}
|
||||
|
||||
public ProcessExecutorResult runCommandWithOutputHandling(List<String> command)
|
||||
throws IOException, InterruptedException {
|
||||
return runCommandWithOutputHandling(command, null);
|
||||
@@ -198,22 +186,11 @@ public class ProcessExecutor {
|
||||
List<String> command, File workingDirectory) throws IOException, InterruptedException {
|
||||
String messages = "";
|
||||
int exitCode = 1;
|
||||
UnoServerPool.UnoServerLease unoLease = null;
|
||||
boolean useSemaphore = true;
|
||||
List<String> commandToRun = command;
|
||||
if (shouldUseUnoServerPool(command)) {
|
||||
unoLease = unoServerPool.acquireEndpoint();
|
||||
commandToRun = applyUnoServerEndpoint(command, unoLease.getEndpoint());
|
||||
useSemaphore = false;
|
||||
}
|
||||
if (useSemaphore) {
|
||||
semaphore.acquire();
|
||||
}
|
||||
semaphore.acquire();
|
||||
try {
|
||||
|
||||
validateCommand(commandToRun);
|
||||
log.info("Running command: {}", String.join(" ", commandToRun));
|
||||
ProcessBuilder processBuilder = new ProcessBuilder(commandToRun);
|
||||
log.info("Running command: {}", String.join(" ", command));
|
||||
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
||||
|
||||
// Use the working directory if it's set
|
||||
if (workingDirectory != null) {
|
||||
@@ -291,9 +268,7 @@ public class ProcessExecutor {
|
||||
outputReaderThread.join();
|
||||
|
||||
boolean isQpdf =
|
||||
commandToRun != null
|
||||
&& !commandToRun.isEmpty()
|
||||
&& commandToRun.get(0).contains("qpdf");
|
||||
command != null && !command.isEmpty() && command.get(0).contains("qpdf");
|
||||
|
||||
if (!outputLines.isEmpty()) {
|
||||
String outputMessage = String.join("\n", outputLines);
|
||||
@@ -334,195 +309,11 @@ public class ProcessExecutor {
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (useSemaphore) {
|
||||
semaphore.release();
|
||||
}
|
||||
if (unoLease != null) {
|
||||
unoLease.close();
|
||||
}
|
||||
semaphore.release();
|
||||
}
|
||||
return new ProcessExecutorResult(exitCode, messages);
|
||||
}
|
||||
|
||||
private boolean shouldUseUnoServerPool(List<String> command) {
|
||||
if (processType != Processes.LIBRE_OFFICE || unoServerPool == null) {
|
||||
return false;
|
||||
}
|
||||
if (unoServerPool.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
if (command == null || command.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if this is a UNO conversion by looking for unoconvert executable
|
||||
String executable = command.get(0);
|
||||
if (executable != null) {
|
||||
// Extract basename from path for matching
|
||||
String basename = executable;
|
||||
int lastSlash = Math.max(executable.lastIndexOf('/'), executable.lastIndexOf('\\'));
|
||||
if (lastSlash >= 0) {
|
||||
basename = executable.substring(lastSlash + 1);
|
||||
}
|
||||
// Strip .exe extension on Windows
|
||||
if (basename.toLowerCase(java.util.Locale.ROOT).endsWith(".exe")) {
|
||||
basename = basename.substring(0, basename.length() - 4);
|
||||
}
|
||||
// Match common unoconvert variants (but NOT soffice)
|
||||
String lowerBasename = basename.toLowerCase(java.util.Locale.ROOT);
|
||||
if (lowerBasename.contains("unoconvert") || lowerBasename.equals("unoconv")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private List<String> applyUnoServerEndpoint(
|
||||
List<String> command,
|
||||
ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint) {
|
||||
if (endpoint == null || command == null || command.isEmpty()) {
|
||||
return command;
|
||||
}
|
||||
List<String> updated = stripUnoEndpointArgs(command);
|
||||
String host = endpoint.getHost();
|
||||
int port = endpoint.getPort();
|
||||
String hostLocation = endpoint.getHostLocation();
|
||||
String protocol = endpoint.getProtocol();
|
||||
|
||||
// Normalize and validate host
|
||||
if (host == null || host.isBlank()) {
|
||||
host = "127.0.0.1";
|
||||
}
|
||||
|
||||
// Normalize and validate port
|
||||
if (port <= 0) {
|
||||
port = 2003;
|
||||
}
|
||||
|
||||
// Normalize and validate hostLocation (only auto|local|remote allowed)
|
||||
if (hostLocation == null) {
|
||||
hostLocation = "auto";
|
||||
} else {
|
||||
hostLocation = hostLocation.trim().toLowerCase(java.util.Locale.ROOT);
|
||||
if (!Set.of("auto", "local", "remote").contains(hostLocation)) {
|
||||
log.warn(
|
||||
"Invalid hostLocation '{}' for endpoint {}:{}, defaulting to 'auto'",
|
||||
hostLocation,
|
||||
host,
|
||||
port);
|
||||
hostLocation = "auto";
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize and validate protocol (only http|https allowed)
|
||||
if (protocol == null) {
|
||||
protocol = "http";
|
||||
} else {
|
||||
protocol = protocol.trim().toLowerCase(java.util.Locale.ROOT);
|
||||
if (!Set.of("http", "https").contains(protocol)) {
|
||||
log.warn(
|
||||
"Invalid protocol '{}' for endpoint {}:{}, defaulting to 'http'",
|
||||
protocol,
|
||||
host,
|
||||
port);
|
||||
protocol = "http";
|
||||
}
|
||||
}
|
||||
|
||||
int insertIndex = Math.min(1, updated.size());
|
||||
updated.add(insertIndex++, "--host");
|
||||
updated.add(insertIndex++, host);
|
||||
updated.add(insertIndex++, "--port");
|
||||
updated.add(insertIndex++, String.valueOf(port));
|
||||
|
||||
// Only inject --host-location if non-default (for compatibility with older unoconvert)
|
||||
if (!"auto".equals(hostLocation)) {
|
||||
updated.add(insertIndex++, "--host-location");
|
||||
updated.add(insertIndex++, hostLocation);
|
||||
}
|
||||
|
||||
// Only inject --protocol if non-default (for compatibility with older unoconvert)
|
||||
if (!"http".equals(protocol)) {
|
||||
updated.add(insertIndex++, "--protocol");
|
||||
updated.add(insertIndex, protocol);
|
||||
}
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
private List<String> stripUnoEndpointArgs(List<String> command) {
|
||||
List<String> stripped = new ArrayList<>(command.size());
|
||||
for (int i = 0; i < command.size(); i++) {
|
||||
String arg = command.get(i);
|
||||
if ("--host".equals(arg)
|
||||
|| "--port".equals(arg)
|
||||
|| "--host-location".equals(arg)
|
||||
|| "--protocol".equals(arg)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if (arg != null
|
||||
&& (arg.startsWith("--host=")
|
||||
|| arg.startsWith("--port=")
|
||||
|| arg.startsWith("--host-location=")
|
||||
|| arg.startsWith("--protocol="))) {
|
||||
continue;
|
||||
}
|
||||
stripped.add(arg);
|
||||
}
|
||||
return stripped;
|
||||
}
|
||||
|
||||
private void validateCommand(List<String> command) {
|
||||
if (command == null || command.isEmpty()) {
|
||||
throw new IllegalArgumentException("Command must not be empty");
|
||||
}
|
||||
|
||||
// Validate all arguments for null bytes and newlines (actual security concerns)
|
||||
for (String arg : command) {
|
||||
if (arg == null) {
|
||||
throw new IllegalArgumentException("Command contains null argument");
|
||||
}
|
||||
if (arg.indexOf('\0') >= 0 || arg.indexOf('\n') >= 0 || arg.indexOf('\r') >= 0) {
|
||||
throw new IllegalArgumentException("Command contains invalid characters");
|
||||
}
|
||||
}
|
||||
|
||||
// Validate executable (first argument)
|
||||
String executable = command.get(0);
|
||||
if (executable == null || executable.isBlank()) {
|
||||
throw new IllegalArgumentException("Command executable must not be empty");
|
||||
}
|
||||
|
||||
// Check for path traversal in executable
|
||||
if (executable.contains("..")) {
|
||||
throw new IllegalArgumentException(
|
||||
"Command executable contains path traversal: " + executable);
|
||||
}
|
||||
|
||||
// For absolute paths, verify the file exists and is executable
|
||||
if (executable.contains("/") || executable.contains("\\")) {
|
||||
Path execPath;
|
||||
try {
|
||||
execPath = Path.of(executable);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException("Invalid executable path: " + executable, e);
|
||||
}
|
||||
|
||||
if (!Files.exists(execPath)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Command executable does not exist: " + executable);
|
||||
}
|
||||
|
||||
if (!Files.isRegularFile(execPath)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Command executable is not a regular file: " + executable);
|
||||
}
|
||||
}
|
||||
// For relative paths, trust that PATH resolution will work or fail appropriately
|
||||
}
|
||||
|
||||
public enum Processes {
|
||||
LIBRE_OFFICE,
|
||||
PDFTOHTML,
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
package stirling.software.common.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
|
||||
public class UnoServerPool {
|
||||
|
||||
private final List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints;
|
||||
private final BlockingQueue<Integer> availableIndices;
|
||||
|
||||
public UnoServerPool(List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints) {
|
||||
if (endpoints == null || endpoints.isEmpty()) {
|
||||
this.endpoints = Collections.emptyList();
|
||||
this.availableIndices = new LinkedBlockingQueue<>();
|
||||
} else {
|
||||
this.endpoints = new ArrayList<>(endpoints);
|
||||
this.availableIndices = new LinkedBlockingQueue<>();
|
||||
// Initialize queue with all endpoint indices
|
||||
for (int i = 0; i < this.endpoints.size(); i++) {
|
||||
this.availableIndices.offer(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return endpoints.isEmpty();
|
||||
}
|
||||
|
||||
public UnoServerLease acquireEndpoint() throws InterruptedException {
|
||||
if (endpoints.isEmpty()) {
|
||||
return new UnoServerLease(defaultEndpoint(), null, this);
|
||||
}
|
||||
|
||||
// Block until an endpoint index becomes available
|
||||
Integer index = availableIndices.take();
|
||||
return new UnoServerLease(endpoints.get(index), index, this);
|
||||
}
|
||||
|
||||
private void releaseEndpoint(Integer index) {
|
||||
if (index != null) {
|
||||
availableIndices.offer(index);
|
||||
}
|
||||
}
|
||||
|
||||
private static ApplicationProperties.ProcessExecutor.UnoServerEndpoint defaultEndpoint() {
|
||||
return new ApplicationProperties.ProcessExecutor.UnoServerEndpoint();
|
||||
}
|
||||
|
||||
public static class UnoServerLease implements AutoCloseable {
|
||||
private final ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint;
|
||||
private final Integer index;
|
||||
private final UnoServerPool pool;
|
||||
private final AtomicBoolean closed = new AtomicBoolean(false);
|
||||
|
||||
public UnoServerLease(
|
||||
ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint,
|
||||
Integer index,
|
||||
UnoServerPool pool) {
|
||||
this.endpoint = endpoint;
|
||||
this.index = index;
|
||||
this.pool = pool;
|
||||
}
|
||||
|
||||
public ApplicationProperties.ProcessExecutor.UnoServerEndpoint getEndpoint() {
|
||||
return endpoint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
// Idempotent close: only release once even if close() called multiple times
|
||||
if (!closed.compareAndSet(false, true)) {
|
||||
return;
|
||||
}
|
||||
if (pool != null && index != null) {
|
||||
pool.releaseEndpoint(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
*, *::before, *::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: var(--font-family, 'Helvetica, sans-serif');
|
||||
font-size: var(--font-size, 12px);
|
||||
line-height: var(--line-height, 1.4);
|
||||
color: var(--text-color, #202124);
|
||||
margin: 0;
|
||||
padding: 20px 24px;
|
||||
background-color: var(--bg-color, #ffffff);
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
hyphens: auto;
|
||||
}
|
||||
|
||||
.email-container {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.email-header {
|
||||
padding-bottom: 16px;
|
||||
border-bottom: 2px solid var(--border-color, #e8eaed);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.email-header h1 {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: var(--header-font-size, 18px);
|
||||
font-weight: 600;
|
||||
color: #1a1a1a;
|
||||
line-height: 1.3;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.email-meta {
|
||||
font-size: var(--meta-font-size, 12px);
|
||||
color: #5f6368;
|
||||
}
|
||||
|
||||
.email-meta div {
|
||||
margin-bottom: 4px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.email-meta strong {
|
||||
color: #3c4043;
|
||||
font-weight: 600;
|
||||
min-width: 50px;
|
||||
display: inline-block;
|
||||
}
|
||||
.email-body {
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.email-body p {
|
||||
margin: 0 0 1em 0;
|
||||
}
|
||||
|
||||
.email-body a {
|
||||
color: #1a73e8;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.email-body table {
|
||||
border-collapse: collapse;
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
margin: 8px 0;
|
||||
}
|
||||
|
||||
.email-body td,
|
||||
.email-body th {
|
||||
padding: 8px 12px;
|
||||
vertical-align: top;
|
||||
border: 1px solid #e0e0e0;
|
||||
}
|
||||
.email-body ul,
|
||||
.email-body ol {
|
||||
margin: 0.5em 0;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.email-body li {
|
||||
margin-bottom: 0.25em;
|
||||
}
|
||||
.email-body blockquote {
|
||||
margin: 1em 0;
|
||||
padding: 0 0 0 16px;
|
||||
border-left: 3px solid #dadce0;
|
||||
color: #5f6368;
|
||||
}
|
||||
.email-body pre,
|
||||
.email-body code {
|
||||
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
||||
font-size: 0.9em;
|
||||
background-color: #f8f9fa;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.email-body pre {
|
||||
padding: 12px;
|
||||
overflow-x: auto;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.email-body code {
|
||||
padding: 2px 6px;
|
||||
}
|
||||
.email-body hr {
|
||||
border: none;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
margin: 1.5em 0;
|
||||
}
|
||||
.attachment-section {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background-color: var(--attachment-bg, #f9f9f9);
|
||||
border: 1px solid var(--attachment-border, #eeeeee);
|
||||
border-radius: 6px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.attachment-section h3 {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: var(--attachment-header-size, 14px);
|
||||
font-weight: 600;
|
||||
color: #3c4043;
|
||||
}
|
||||
|
||||
.attachment-item {
|
||||
padding: 8px 0;
|
||||
border-bottom: 1px solid #eeeeee;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.attachment-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.attachment-icon {
|
||||
margin-right: 8px;
|
||||
font-weight: bold;
|
||||
color: #5f6368;
|
||||
}
|
||||
|
||||
.attachment-name {
|
||||
font-weight: 500;
|
||||
color: #1a1a1a;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.attachment-details,
|
||||
.attachment-type {
|
||||
font-size: var(--attachment-detail-size, 11px);
|
||||
color: #5f6368;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.attachment-info-note {
|
||||
margin-top: 12px;
|
||||
padding: 10px 12px;
|
||||
font-size: var(--note-font-size, 11px);
|
||||
border-radius: 4px;
|
||||
background-color: #e8f0fe;
|
||||
border: 1px solid #d2e3fc;
|
||||
color: #1967d2;
|
||||
}
|
||||
|
||||
.attachment-info-note p {
|
||||
margin: 0;
|
||||
}
|
||||
.no-content {
|
||||
padding: 32px 20px;
|
||||
text-align: center;
|
||||
color: #80868b;
|
||||
font-style: italic;
|
||||
background-color: #f8f9fa;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.text-body {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
font-family: inherit;
|
||||
line-height: 1.6;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
margin: 8px 0;
|
||||
}
|
||||
@media print {
|
||||
body {
|
||||
padding: 0;
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
.email-header {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
|
||||
.attachment-section {
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
.email-body div[class*="signature"],
|
||||
.email-body table[class*="signature"] {
|
||||
margin-top: 1.5em;
|
||||
padding-top: 1em;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
font-size: 0.95em;
|
||||
color: #5f6368;
|
||||
}
|
||||
|
||||
@@ -439,7 +439,9 @@ class EmlToPdfTest {
|
||||
"binary data");
|
||||
|
||||
testEmailConversion(
|
||||
emlContent, new String[] {"Attachment Only Test", "data.bin"}, true);
|
||||
emlContent,
|
||||
new String[] {"Attachment Only Test", "data.bin", "No content available"},
|
||||
true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -467,13 +469,10 @@ class EmlToPdfTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Should accept ISO-8859-1 charset declaration without errors")
|
||||
@DisplayName("Should handle non-standard but valid character sets like ISO-8859-1")
|
||||
void handleIso88591Charset() throws IOException {
|
||||
// Note: Uses ASCII content to test charset header parsing without
|
||||
// platform-dependent encoding issues. Actual charset decoding is
|
||||
// handled by Simple Java Mail library which is thoroughly tested upstream.
|
||||
String subject = "Subject with ISO-8859-1 charset";
|
||||
String body = "Body content encoded in ISO-8859-1";
|
||||
String subject = "Subject with special characters: ñ é ü";
|
||||
String body = "Body with special characters: ñ é ü";
|
||||
|
||||
String emlContent =
|
||||
createSimpleTextEmailWithCharset(
|
||||
@@ -489,13 +488,8 @@ class EmlToPdfTest {
|
||||
String htmlResult = EmlToPdf.convertEmlToHtml(emlBytes, request);
|
||||
|
||||
assertNotNull(htmlResult);
|
||||
// Verify the core subject text is present (charset should be decoded properly)
|
||||
assertTrue(
|
||||
htmlResult.contains("Subject with ISO-8859-1 charset"),
|
||||
"HTML should contain subject text");
|
||||
assertTrue(
|
||||
htmlResult.contains("Body content encoded in ISO-8859-1"),
|
||||
"HTML should contain body text");
|
||||
assertTrue(htmlResult.contains(subject));
|
||||
assertTrue(htmlResult.contains(body));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -37,50 +37,21 @@ public class ProcessExecutorTest {
|
||||
|
||||
@Test
|
||||
public void testRunCommandWithOutputHandling_Error() {
|
||||
// Test with a command that will fail to execute (non-existent command)
|
||||
// Mock the command to execute
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("nonexistent-command-that-does-not-exist");
|
||||
command.add("nonexistent-command");
|
||||
|
||||
// Execute the command and expect an IOException (command not found)
|
||||
assertThrows(
|
||||
IOException.class, () -> processExecutor.runCommandWithOutputHandling(command));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunCommandWithOutputHandling_PathTraversal() {
|
||||
// Test that path traversal is blocked
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("../../../etc/passwd");
|
||||
|
||||
// Execute the command and expect an IllegalArgumentException
|
||||
IllegalArgumentException thrown =
|
||||
// Execute the command and expect an IOException
|
||||
IOException thrown =
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
IOException.class,
|
||||
() -> processExecutor.runCommandWithOutputHandling(command));
|
||||
|
||||
// Check the exception message
|
||||
// Check the exception message to ensure it indicates the command was not found
|
||||
String errorMessage = thrown.getMessage();
|
||||
assertTrue(
|
||||
errorMessage.contains("path traversal"),
|
||||
"Unexpected error message: " + errorMessage);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunCommandWithOutputHandling_NullByte() {
|
||||
// Test that null bytes are blocked
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("test\0command");
|
||||
|
||||
// Execute the command and expect an IllegalArgumentException
|
||||
IllegalArgumentException thrown =
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
() -> processExecutor.runCommandWithOutputHandling(command));
|
||||
|
||||
// Check the exception message
|
||||
String errorMessage = thrown.getMessage();
|
||||
assertTrue(
|
||||
errorMessage.contains("invalid characters"),
|
||||
errorMessage.contains("error=2")
|
||||
|| errorMessage.contains("No such file or directory"),
|
||||
"Unexpected error message: " + errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
package stirling.software.common.util;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
|
||||
public class UnoServerPoolTest {
|
||||
|
||||
@Test
|
||||
void testEmptyPool() throws InterruptedException {
|
||||
UnoServerPool pool = new UnoServerPool(Collections.emptyList());
|
||||
assertTrue(pool.isEmpty(), "Pool with empty list should be empty");
|
||||
|
||||
UnoServerPool.UnoServerLease lease = pool.acquireEndpoint();
|
||||
assertNotNull(lease, "Should return a default lease for empty pool");
|
||||
assertNotNull(lease.getEndpoint(), "Default lease should have an endpoint");
|
||||
lease.close(); // Should not throw
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSingleEndpointAcquireRelease() throws InterruptedException {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints =
|
||||
createEndpoints(1);
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
assertFalse(pool.isEmpty(), "Pool should not be empty");
|
||||
|
||||
UnoServerPool.UnoServerLease lease = pool.acquireEndpoint();
|
||||
assertNotNull(lease, "Should acquire endpoint");
|
||||
assertEquals("127.0.0.1", lease.getEndpoint().getHost());
|
||||
assertEquals(2003, lease.getEndpoint().getPort());
|
||||
|
||||
lease.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMultipleEndpointsDistribution() throws InterruptedException {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints =
|
||||
createEndpoints(3);
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
|
||||
List<Integer> portsUsed = new ArrayList<>();
|
||||
|
||||
// Acquire all endpoints
|
||||
try (UnoServerPool.UnoServerLease lease1 = pool.acquireEndpoint();
|
||||
UnoServerPool.UnoServerLease lease2 = pool.acquireEndpoint();
|
||||
UnoServerPool.UnoServerLease lease3 = pool.acquireEndpoint()) {
|
||||
|
||||
portsUsed.add(lease1.getEndpoint().getPort());
|
||||
portsUsed.add(lease2.getEndpoint().getPort());
|
||||
portsUsed.add(lease3.getEndpoint().getPort());
|
||||
|
||||
// All three endpoints should be in use (different ports)
|
||||
assertEquals(3, portsUsed.stream().distinct().count(), "Should use all 3 endpoints");
|
||||
}
|
||||
// All released after try-with-resources
|
||||
}
|
||||
|
||||
@Test
|
||||
void testConcurrentAccess() throws InterruptedException {
|
||||
int endpointCount = 3;
|
||||
int threadCount = 10;
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints =
|
||||
createEndpoints(endpointCount);
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
|
||||
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
|
||||
CountDownLatch startLatch = new CountDownLatch(1);
|
||||
CountDownLatch doneLatch = new CountDownLatch(threadCount);
|
||||
AtomicInteger successCount = new AtomicInteger(0);
|
||||
|
||||
for (int i = 0; i < threadCount; i++) {
|
||||
executor.submit(
|
||||
() -> {
|
||||
try {
|
||||
startLatch.await(); // Wait for all threads to be ready
|
||||
UnoServerPool.UnoServerLease lease = pool.acquireEndpoint();
|
||||
assertNotNull(lease, "Should acquire endpoint");
|
||||
Thread.sleep(10); // Simulate work
|
||||
lease.close();
|
||||
successCount.incrementAndGet();
|
||||
} catch (Exception e) {
|
||||
fail("Thread failed: " + e.getMessage());
|
||||
} finally {
|
||||
doneLatch.countDown();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
startLatch.countDown(); // Start all threads
|
||||
boolean finished = doneLatch.await(5, TimeUnit.SECONDS);
|
||||
executor.shutdown();
|
||||
|
||||
assertTrue(finished, "All threads should complete within timeout");
|
||||
assertEquals(
|
||||
threadCount, successCount.get(), "All threads should successfully acquire/release");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBlockingBehavior() throws InterruptedException {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints =
|
||||
createEndpoints(2);
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
|
||||
// Acquire both endpoints
|
||||
UnoServerPool.UnoServerLease lease1 = pool.acquireEndpoint();
|
||||
UnoServerPool.UnoServerLease lease2 = pool.acquireEndpoint();
|
||||
|
||||
AtomicInteger acquired = new AtomicInteger(0);
|
||||
CountDownLatch acquireLatch = new CountDownLatch(1);
|
||||
|
||||
// Try to acquire a third endpoint in separate thread (should block)
|
||||
Thread blockingThread =
|
||||
new Thread(
|
||||
() -> {
|
||||
try {
|
||||
acquireLatch.countDown(); // Signal we're about to block
|
||||
UnoServerPool.UnoServerLease lease3 = pool.acquireEndpoint();
|
||||
acquired.incrementAndGet();
|
||||
lease3.close();
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
});
|
||||
|
||||
blockingThread.start();
|
||||
acquireLatch.await(); // Wait for thread to start
|
||||
Thread.sleep(100); // Give it time to block
|
||||
|
||||
// Should still be 0 because thread is blocked
|
||||
assertEquals(0, acquired.get(), "Third acquire should be blocked");
|
||||
|
||||
// Release one endpoint
|
||||
lease1.close();
|
||||
Thread.sleep(100); // Give blocked thread time to acquire
|
||||
|
||||
// Now the third acquire should succeed
|
||||
assertEquals(1, acquired.get(), "Third acquire should succeed after release");
|
||||
|
||||
lease2.close();
|
||||
blockingThread.join(1000);
|
||||
assertFalse(blockingThread.isAlive(), "Thread should complete");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testEndpointReuse() throws InterruptedException {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints =
|
||||
createEndpoints(1);
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
|
||||
int port1, port2;
|
||||
|
||||
try (UnoServerPool.UnoServerLease lease1 = pool.acquireEndpoint()) {
|
||||
port1 = lease1.getEndpoint().getPort();
|
||||
}
|
||||
|
||||
try (UnoServerPool.UnoServerLease lease2 = pool.acquireEndpoint()) {
|
||||
port2 = lease2.getEndpoint().getPort();
|
||||
}
|
||||
|
||||
assertEquals(port1, port2, "Should reuse the same endpoint after release");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHostLocationAndProtocol() throws InterruptedException {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints = new ArrayList<>();
|
||||
ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint =
|
||||
new ApplicationProperties.ProcessExecutor.UnoServerEndpoint();
|
||||
endpoint.setHost("remote.server");
|
||||
endpoint.setPort(8080);
|
||||
endpoint.setHostLocation("remote");
|
||||
endpoint.setProtocol("https");
|
||||
endpoints.add(endpoint);
|
||||
|
||||
UnoServerPool pool = new UnoServerPool(endpoints);
|
||||
|
||||
try (UnoServerPool.UnoServerLease lease = pool.acquireEndpoint()) {
|
||||
assertEquals("remote.server", lease.getEndpoint().getHost());
|
||||
assertEquals(8080, lease.getEndpoint().getPort());
|
||||
assertEquals("remote", lease.getEndpoint().getHostLocation());
|
||||
assertEquals("https", lease.getEndpoint().getProtocol());
|
||||
}
|
||||
}
|
||||
|
||||
private List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> createEndpoints(
|
||||
int count) {
|
||||
List<ApplicationProperties.ProcessExecutor.UnoServerEndpoint> endpoints = new ArrayList<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
ApplicationProperties.ProcessExecutor.UnoServerEndpoint endpoint =
|
||||
new ApplicationProperties.ProcessExecutor.UnoServerEndpoint();
|
||||
endpoint.setHost("127.0.0.1");
|
||||
endpoint.setPort(2003 + (i * 2));
|
||||
endpoints.add(endpoint);
|
||||
}
|
||||
return endpoints;
|
||||
}
|
||||
}
|
||||
+1
-10
@@ -59,11 +59,10 @@ dependencies {
|
||||
implementation project(':common')
|
||||
implementation 'org.springframework.boot:spring-boot-starter-jetty'
|
||||
implementation 'com.posthog.java:posthog:1.2.0'
|
||||
implementation 'org.telegram:telegrambots:6.9.7.1'
|
||||
implementation 'commons-io:commons-io:2.21.0'
|
||||
implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
|
||||
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
|
||||
implementation 'io.micrometer:micrometer-core:1.16.1'
|
||||
implementation 'io.micrometer:micrometer-core:1.16.0'
|
||||
implementation 'com.google.zxing:core:3.5.4'
|
||||
implementation "org.commonmark:commonmark:$commonmarkVersion" // https://mvnrepository.com/artifact/org.commonmark/commonmark
|
||||
implementation "org.commonmark:commonmark-ext-gfm-tables:$commonmarkVersion"
|
||||
@@ -208,14 +207,6 @@ tasks.register('npmInstall', Exec) {
|
||||
println "node_modules not found, will install..."
|
||||
return true
|
||||
}
|
||||
|
||||
// if required devDependency is missing, reinstall
|
||||
def iconifyPkg = new File(frontendDir, 'node_modules/@iconify-json/material-symbols/package.json')
|
||||
if (!iconifyPkg.exists()) {
|
||||
println "@iconify-json/material-symbols missing, will reinstall..."
|
||||
return true
|
||||
}
|
||||
|
||||
def packageJson = new File(frontendDir, 'package.json')
|
||||
def packageLock = new File(frontendDir, 'package-lock.json')
|
||||
def isOutdated = nodeModules.lastModified() < packageJson.lastModified() ||
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package stirling.software.SPDF.config;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.telegram.telegrambots.meta.TelegramBotsApi;
|
||||
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
|
||||
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnProperty(prefix = "telegram", name = "enabled", havingValue = "true")
|
||||
public class TelegramBotConfig {
|
||||
|
||||
@Bean
|
||||
public TelegramBotsApi telegramBotsApi() throws TelegramApiException {
|
||||
return new TelegramBotsApi(DefaultBotSession.class);
|
||||
}
|
||||
}
|
||||
+4
-7
@@ -32,19 +32,16 @@ public class SettingsController {
|
||||
|
||||
@AutoJobPostMapping("/update-enable-analytics")
|
||||
@Hidden
|
||||
public ResponseEntity<Map<String, Object>> updateApiKey(@RequestParam Boolean enabled)
|
||||
throws IOException {
|
||||
public ResponseEntity<String> updateApiKey(@RequestParam Boolean enabled) throws IOException {
|
||||
if (applicationProperties.getSystem().getEnableAnalytics() != null) {
|
||||
return ResponseEntity.status(HttpStatus.ALREADY_REPORTED)
|
||||
.body(
|
||||
Map.of(
|
||||
"message",
|
||||
"Setting has already been set, To adjust please edit "
|
||||
+ InstallationPathConfig.getSettingsPath()));
|
||||
"Setting has already been set, To adjust please edit "
|
||||
+ InstallationPathConfig.getSettingsPath());
|
||||
}
|
||||
GeneralUtils.saveKeyToSettings("system.enableAnalytics", enabled);
|
||||
applicationProperties.getSystem().setEnableAnalytics(enabled);
|
||||
return ResponseEntity.ok(Map.of("message", "Updated"));
|
||||
return ResponseEntity.ok("Updated");
|
||||
}
|
||||
|
||||
@GetMapping("/get-endpoints-status")
|
||||
|
||||
@@ -191,7 +191,7 @@ public class UIDataController {
|
||||
}
|
||||
|
||||
private List<String> getAvailableTesseractLanguages() {
|
||||
String tessdataDir = runtimePathConfig.getTessDataPath();
|
||||
String tessdataDir = applicationProperties.getSystem().getTessdataDir();
|
||||
java.io.File[] files = new java.io.File(tessdataDir).listFiles();
|
||||
if (files == null) {
|
||||
return Collections.emptyList();
|
||||
|
||||
+24
-28
@@ -10,7 +10,6 @@ import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.util.HtmlUtils;
|
||||
|
||||
import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@@ -42,12 +41,12 @@ public class ConvertEmlToPDF {
|
||||
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/eml/pdf")
|
||||
@StandardPdfResponse
|
||||
@Operation(
|
||||
summary = "Convert EML/MSG to PDF",
|
||||
summary = "Convert EML to PDF",
|
||||
description =
|
||||
"This endpoint converts EML (email) and MSG (Outlook) files to PDF format"
|
||||
+ " with extensive customization options. Features include font settings,"
|
||||
+ " image constraints, display modes, attachment handling, and HTML debug"
|
||||
+ " output. Input: EML or MSG file, Output: PDF or HTML file. Type: SISO")
|
||||
"This endpoint converts EML (email) files to PDF format with extensive"
|
||||
+ " customization options. Features include font settings, image"
|
||||
+ " constraints, display modes, attachment handling, and HTML debug output."
|
||||
+ " Input: EML file, Output: PDF or HTML file. Type: SISO")
|
||||
public ResponseEntity<byte[]> convertEmlToPdf(@ModelAttribute EmlToPdfRequest request) {
|
||||
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
@@ -55,7 +54,7 @@ public class ConvertEmlToPDF {
|
||||
|
||||
// Validate input
|
||||
if (inputFile.isEmpty()) {
|
||||
log.error("No file provided for EML/MSG to PDF conversion.");
|
||||
log.error("No file provided for EML to PDF conversion.");
|
||||
return ResponseEntity.badRequest()
|
||||
.body("No file provided".getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
@@ -66,12 +65,12 @@ public class ConvertEmlToPDF {
|
||||
.body("Please provide a valid filename".getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
// Validate file type - support EML and MSG (Outlook) files
|
||||
// Validate file type - support EML
|
||||
String lowerFilename = originalFilename.toLowerCase(Locale.ROOT);
|
||||
if (!lowerFilename.endsWith(".eml") && !lowerFilename.endsWith(".msg")) {
|
||||
log.error("Invalid file type for EML/MSG to PDF: {}", originalFilename);
|
||||
if (!lowerFilename.endsWith(".eml")) {
|
||||
log.error("Invalid file type for EML to PDF: {}", originalFilename);
|
||||
return ResponseEntity.badRequest()
|
||||
.body("Please upload a valid EML or MSG file".getBytes(StandardCharsets.UTF_8));
|
||||
.body("Please upload a valid EML file".getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
String baseFilename = Filenames.toSimpleFileName(originalFilename); // Use Filenames utility
|
||||
@@ -82,7 +81,7 @@ public class ConvertEmlToPDF {
|
||||
if (request.isDownloadHtml()) {
|
||||
try {
|
||||
String htmlContent = EmlToPdf.convertEmlToHtml(fileBytes, request);
|
||||
log.info("Successfully converted email to HTML: {}", originalFilename);
|
||||
log.info("Successfully converted EML to HTML: {}", originalFilename);
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
htmlContent.getBytes(StandardCharsets.UTF_8),
|
||||
baseFilename + ".html",
|
||||
@@ -96,11 +95,12 @@ public class ConvertEmlToPDF {
|
||||
}
|
||||
}
|
||||
|
||||
// Convert EML/MSG to PDF with enhanced options
|
||||
// Convert EML to PDF with enhanced options
|
||||
try {
|
||||
byte[] pdfBytes =
|
||||
EmlToPdf.convertEmlToPdf(
|
||||
runtimePathConfig.getWeasyPrintPath(),
|
||||
runtimePathConfig
|
||||
.getWeasyPrintPath(), // Use configured WeasyPrint path
|
||||
request,
|
||||
fileBytes,
|
||||
originalFilename,
|
||||
@@ -115,19 +115,19 @@ public class ConvertEmlToPDF {
|
||||
"PDF conversion failed - empty output"
|
||||
.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
log.info("Successfully converted email to PDF: {}", originalFilename);
|
||||
log.info("Successfully converted EML to PDF: {}", originalFilename);
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
pdfBytes, baseFilename + ".pdf", MediaType.APPLICATION_PDF);
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
log.error("Email to PDF conversion was interrupted for {}", originalFilename, e);
|
||||
log.error("EML to PDF conversion was interrupted for {}", originalFilename, e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body("Conversion was interrupted".getBytes(StandardCharsets.UTF_8));
|
||||
} catch (IllegalArgumentException e) {
|
||||
String errorMessage = buildErrorMessage(e, originalFilename);
|
||||
log.error(
|
||||
"Email to PDF conversion failed for {}: {}",
|
||||
"EML to PDF conversion failed for {}: {}",
|
||||
originalFilename,
|
||||
errorMessage,
|
||||
e);
|
||||
@@ -136,7 +136,7 @@ public class ConvertEmlToPDF {
|
||||
} catch (RuntimeException e) {
|
||||
String errorMessage = buildErrorMessage(e, originalFilename);
|
||||
log.error(
|
||||
"Email to PDF conversion failed for {}: {}",
|
||||
"EML to PDF conversion failed for {}: {}",
|
||||
originalFilename,
|
||||
errorMessage,
|
||||
e);
|
||||
@@ -145,31 +145,27 @@ public class ConvertEmlToPDF {
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("File processing error for email to PDF: {}", originalFilename, e);
|
||||
log.error("File processing error for EML to PDF: {}", originalFilename, e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body("File processing error".getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
|
||||
private static @NotNull String buildErrorMessage(Exception e, String originalFilename) {
|
||||
String safeFilename = HtmlUtils.htmlEscape(originalFilename);
|
||||
String exceptionMessage = e.getMessage();
|
||||
String safeExceptionMessage =
|
||||
exceptionMessage == null ? "Unknown error" : HtmlUtils.htmlEscape(exceptionMessage);
|
||||
String errorMessage;
|
||||
if (exceptionMessage != null && exceptionMessage.contains("Invalid EML")) {
|
||||
if (e.getMessage() != null && e.getMessage().contains("Invalid EML")) {
|
||||
errorMessage =
|
||||
"Invalid EML file format. Please ensure you've uploaded a valid email"
|
||||
+ " file ("
|
||||
+ safeFilename
|
||||
+ originalFilename
|
||||
+ ").";
|
||||
} else if (exceptionMessage != null && exceptionMessage.contains("WeasyPrint")) {
|
||||
} else if (e.getMessage() != null && e.getMessage().contains("WeasyPrint")) {
|
||||
errorMessage =
|
||||
"PDF generation failed for "
|
||||
+ safeFilename
|
||||
+ originalFilename
|
||||
+ ". This may be due to complex email formatting.";
|
||||
} else {
|
||||
errorMessage = "Conversion failed for " + safeFilename + ": " + safeExceptionMessage;
|
||||
errorMessage = "Conversion failed for " + originalFilename + ": " + e.getMessage();
|
||||
}
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
+2
@@ -97,6 +97,8 @@ public class ConvertOfficeController {
|
||||
// Unoconvert: schreibe direkt in outputPath innerhalb des workDir
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add(runtimePathConfig.getUnoConvertPath());
|
||||
command.add("--port");
|
||||
command.add("2003");
|
||||
command.add("--convert-to");
|
||||
command.add("pdf");
|
||||
command.add(inputPath.toString());
|
||||
|
||||
+1
-16
@@ -75,25 +75,10 @@ public class ConfigController {
|
||||
String frontendUrl = applicationProperties.getSystem().getFrontendUrl();
|
||||
configData.put("frontendUrl", frontendUrl != null ? frontendUrl : "");
|
||||
|
||||
// Add mobile scanner settings
|
||||
// Add mobile scanner setting
|
||||
configData.put(
|
||||
"enableMobileScanner",
|
||||
applicationProperties.getSystem().isEnableMobileScanner());
|
||||
configData.put(
|
||||
"mobileScannerConvertToPdf",
|
||||
applicationProperties.getSystem().getMobileScannerSettings().isConvertToPdf());
|
||||
configData.put(
|
||||
"mobileScannerImageResolution",
|
||||
applicationProperties
|
||||
.getSystem()
|
||||
.getMobileScannerSettings()
|
||||
.getImageResolution());
|
||||
configData.put(
|
||||
"mobileScannerPageFormat",
|
||||
applicationProperties.getSystem().getMobileScannerSettings().getPageFormat());
|
||||
configData.put(
|
||||
"mobileScannerStretchToFit",
|
||||
applicationProperties.getSystem().getMobileScannerSettings().isStretchToFit());
|
||||
|
||||
// Extract values from ApplicationProperties
|
||||
configData.put("appNameNavbar", applicationProperties.getUi().getAppNameNavbar());
|
||||
|
||||
+1
-59
@@ -31,7 +31,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.service.MobileScannerService;
|
||||
import stirling.software.common.service.MobileScannerService.FileMetadata;
|
||||
|
||||
@@ -52,31 +51,9 @@ import stirling.software.common.service.MobileScannerService.FileMetadata;
|
||||
public class MobileScannerController {
|
||||
|
||||
private final MobileScannerService mobileScannerService;
|
||||
private final ApplicationProperties applicationProperties;
|
||||
|
||||
public MobileScannerController(
|
||||
MobileScannerService mobileScannerService,
|
||||
ApplicationProperties applicationProperties) {
|
||||
public MobileScannerController(MobileScannerService mobileScannerService) {
|
||||
this.mobileScannerService = mobileScannerService;
|
||||
this.applicationProperties = applicationProperties;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if mobile scanner feature is enabled
|
||||
*
|
||||
* @return Error response if disabled, null if enabled
|
||||
*/
|
||||
private ResponseEntity<Map<String, Object>> checkFeatureEnabled() {
|
||||
if (!applicationProperties.getSystem().isEnableMobileScanner()) {
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Mobile scanner feature is not enabled",
|
||||
"enabled",
|
||||
false));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,16 +71,10 @@ public class MobileScannerController {
|
||||
description = "Session created successfully",
|
||||
content = @Content(schema = @Schema(implementation = SessionInfoResponse.class)))
|
||||
@ApiResponse(responseCode = "400", description = "Invalid session ID")
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
public ResponseEntity<Map<String, Object>> createSession(
|
||||
@Parameter(description = "Session ID for QR code", required = true) @PathVariable
|
||||
String sessionId) {
|
||||
|
||||
ResponseEntity<Map<String, Object>> featureCheck = checkFeatureEnabled();
|
||||
if (featureCheck != null) {
|
||||
return featureCheck;
|
||||
}
|
||||
|
||||
try {
|
||||
MobileScannerService.SessionInfo sessionInfo =
|
||||
mobileScannerService.createSession(sessionId);
|
||||
@@ -138,16 +109,10 @@ public class MobileScannerController {
|
||||
description = "Session is valid",
|
||||
content = @Content(schema = @Schema(implementation = SessionInfoResponse.class)))
|
||||
@ApiResponse(responseCode = "404", description = "Session not found or expired")
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
public ResponseEntity<Map<String, Object>> validateSession(
|
||||
@Parameter(description = "Session ID to validate", required = true) @PathVariable
|
||||
String sessionId) {
|
||||
|
||||
ResponseEntity<Map<String, Object>> featureCheck = checkFeatureEnabled();
|
||||
if (featureCheck != null) {
|
||||
return featureCheck;
|
||||
}
|
||||
|
||||
MobileScannerService.SessionInfo sessionInfo =
|
||||
mobileScannerService.validateSession(sessionId);
|
||||
|
||||
@@ -182,7 +147,6 @@ public class MobileScannerController {
|
||||
description = "Files uploaded successfully",
|
||||
content = @Content(schema = @Schema(implementation = UploadResponse.class)))
|
||||
@ApiResponse(responseCode = "400", description = "Invalid session ID or files")
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
@ApiResponse(responseCode = "500", description = "Upload failed")
|
||||
public ResponseEntity<Map<String, Object>> uploadFiles(
|
||||
@Parameter(description = "Session ID from QR code", required = true) @PathVariable
|
||||
@@ -190,11 +154,6 @@ public class MobileScannerController {
|
||||
@Parameter(description = "Files to upload", required = true) @RequestParam("files")
|
||||
List<MultipartFile> files) {
|
||||
|
||||
ResponseEntity<Map<String, Object>> featureCheck = checkFeatureEnabled();
|
||||
if (featureCheck != null) {
|
||||
return featureCheck;
|
||||
}
|
||||
|
||||
try {
|
||||
if (files == null || files.isEmpty()) {
|
||||
return ResponseEntity.badRequest().body(Map.of("error", "No files provided"));
|
||||
@@ -235,16 +194,10 @@ public class MobileScannerController {
|
||||
responseCode = "200",
|
||||
description = "File list retrieved",
|
||||
content = @Content(schema = @Schema(implementation = FileListResponse.class)))
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
public ResponseEntity<Map<String, Object>> getSessionFiles(
|
||||
@Parameter(description = "Session ID", required = true) @PathVariable
|
||||
String sessionId) {
|
||||
|
||||
ResponseEntity<Map<String, Object>> featureCheck = checkFeatureEnabled();
|
||||
if (featureCheck != null) {
|
||||
return featureCheck;
|
||||
}
|
||||
|
||||
List<FileMetadata> files = mobileScannerService.getSessionFiles(sessionId);
|
||||
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
@@ -268,17 +221,12 @@ public class MobileScannerController {
|
||||
description =
|
||||
"Download a file that was uploaded to a session. File is automatically deleted after download.")
|
||||
@ApiResponse(responseCode = "200", description = "File downloaded successfully")
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
@ApiResponse(responseCode = "404", description = "File or session not found")
|
||||
public ResponseEntity<Resource> downloadFile(
|
||||
@Parameter(description = "Session ID", required = true) @PathVariable String sessionId,
|
||||
@Parameter(description = "Filename to download", required = true) @PathVariable
|
||||
String filename) {
|
||||
|
||||
if (!applicationProperties.getSystem().isEnableMobileScanner()) {
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
|
||||
}
|
||||
|
||||
try {
|
||||
Path filePath = mobileScannerService.getFile(sessionId, filename);
|
||||
|
||||
@@ -320,16 +268,10 @@ public class MobileScannerController {
|
||||
summary = "Delete a session",
|
||||
description = "Manually delete a session and all its uploaded files")
|
||||
@ApiResponse(responseCode = "200", description = "Session deleted successfully")
|
||||
@ApiResponse(responseCode = "403", description = "Mobile scanner feature not enabled")
|
||||
public ResponseEntity<Map<String, Object>> deleteSession(
|
||||
@Parameter(description = "Session ID to delete", required = true) @PathVariable
|
||||
String sessionId) {
|
||||
|
||||
ResponseEntity<Map<String, Object>> featureCheck = checkFeatureEnabled();
|
||||
if (featureCheck != null) {
|
||||
return featureCheck;
|
||||
}
|
||||
|
||||
mobileScannerService.deleteSession(sessionId);
|
||||
|
||||
return ResponseEntity.ok(
|
||||
|
||||
@@ -204,65 +204,11 @@ public class VeraPDFService {
|
||||
detectedFlavours = detectionParser.getFlavours();
|
||||
}
|
||||
|
||||
// For PDF/A flavours, we need to validate first to check if PDF/A identification exists in
|
||||
// XMP
|
||||
// If declaredFlavour is PDF/A, do a quick validation to check for PDF/A identification
|
||||
// schema
|
||||
boolean hasValidPdfaMetadata = false;
|
||||
if (isPdfaFlavour(declaredFlavour)) {
|
||||
try (PDFAParser quickParser =
|
||||
Foundries.defaultInstance()
|
||||
.createParser(new ByteArrayInputStream(pdfBytes), declaredFlavour)) {
|
||||
PDFAValidator quickValidator =
|
||||
Foundries.defaultInstance().createValidator(declaredFlavour, false);
|
||||
ValidationResult quickResult = quickValidator.validate(quickParser);
|
||||
|
||||
// Check if the document has the PDF/A Identification extension schema (clause
|
||||
// 6.7.11, test 1)
|
||||
// OR if it lacks XMP metadata entirely (clause 6.7.2, test 1)
|
||||
// If either of these errors is present, the document is NOT a declared PDF/A
|
||||
hasValidPdfaMetadata = true;
|
||||
for (TestAssertion assertion : quickResult.getTestAssertions()) {
|
||||
if (assertion.getStatus() == TestAssertion.Status.FAILED
|
||||
&& assertion.getRuleId() != null) {
|
||||
String clause = assertion.getRuleId().getClause();
|
||||
int testNumber = assertion.getRuleId().getTestNumber();
|
||||
|
||||
// Missing XMP metadata entirely (clause 6.7.2, test 1)
|
||||
if ("6.7.2".equals(clause) && testNumber == 1) {
|
||||
hasValidPdfaMetadata = false;
|
||||
log.debug(
|
||||
"Document lacks XMP metadata (6.7.2): {}",
|
||||
assertion.getMessage());
|
||||
break;
|
||||
}
|
||||
|
||||
// Missing PDF/A identification schema in XMP (clause 6.7.11, test 1)
|
||||
if ("6.7.11".equals(clause) && testNumber == 1) {
|
||||
hasValidPdfaMetadata = false;
|
||||
log.debug(
|
||||
"Document lacks PDF/A identification in XMP (6.7.11): {}",
|
||||
assertion.getMessage());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.debug("Error checking for PDF/A identification: {}", e.getMessage());
|
||||
hasValidPdfaMetadata = false;
|
||||
}
|
||||
}
|
||||
|
||||
List<PDFAFlavour> flavoursToValidate = new ArrayList<>();
|
||||
boolean hasPdfaDeclaration = isPdfaFlavour(declaredFlavour) && hasValidPdfaMetadata;
|
||||
boolean hasPdfaDeclaration = isPdfaFlavour(declaredFlavour);
|
||||
|
||||
if (declaredFlavour != null) {
|
||||
boolean isDeclaredPdfa = isPdfaFlavour(declaredFlavour);
|
||||
if (isDeclaredPdfa && hasPdfaDeclaration) {
|
||||
flavoursToValidate.add(declaredFlavour);
|
||||
} else if (!isDeclaredPdfa) {
|
||||
flavoursToValidate.add(declaredFlavour);
|
||||
}
|
||||
flavoursToValidate.add(declaredFlavour);
|
||||
}
|
||||
|
||||
for (PDFAFlavour flavour : detectedFlavours) {
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package stirling.software.SPDF.service.telegram;
|
||||
|
||||
/**
|
||||
* Enumeration representing different feedback types for Telegram service.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
public enum FeedbackEnum {
|
||||
/** Indicates that the provided document is not valid. */
|
||||
NO_VALID_DOCUMENT,
|
||||
|
||||
/** Represents a generic error message. */
|
||||
ERROR_MESSAGE,
|
||||
|
||||
/** Indicates that an error occurred during processing. */
|
||||
ERROR_PROCESSING,
|
||||
|
||||
/** Indicates that processing is ongoing. */
|
||||
PROCESSING
|
||||
}
|
||||
-524
@@ -1,524 +0,0 @@
|
||||
package stirling.software.SPDF.service.telegram;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
|
||||
import org.telegram.telegrambots.meta.TelegramBotsApi;
|
||||
import org.telegram.telegrambots.meta.api.methods.GetFile;
|
||||
import org.telegram.telegrambots.meta.api.methods.send.SendDocument;
|
||||
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
|
||||
import org.telegram.telegrambots.meta.api.objects.Chat;
|
||||
import org.telegram.telegrambots.meta.api.objects.Document;
|
||||
import org.telegram.telegrambots.meta.api.objects.File;
|
||||
import org.telegram.telegrambots.meta.api.objects.InputFile;
|
||||
import org.telegram.telegrambots.meta.api.objects.Message;
|
||||
import org.telegram.telegrambots.meta.api.objects.Update;
|
||||
import org.telegram.telegrambots.meta.api.objects.User;
|
||||
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.configuration.RuntimePathConfig;
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
|
||||
/**
|
||||
* Telegram bot that processes incoming files through a defined pipeline.
|
||||
*
|
||||
* @since 2.2.x
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@ConditionalOnProperty(prefix = "telegram", name = "enabled", havingValue = "true")
|
||||
public class TelegramPipelineBot extends TelegramLongPollingBot {
|
||||
|
||||
private static final String CHAT_PRIVATE = "private";
|
||||
private static final String CHAT_GROUP = "group";
|
||||
private static final String CHAT_SUPERGROUP = "supergroup";
|
||||
private static final String CHAT_CHANNEL = "channel";
|
||||
|
||||
private static final Set<String> SUPPORTED_CHAT_TYPES =
|
||||
Set.of(CHAT_PRIVATE, CHAT_GROUP, CHAT_SUPERGROUP, CHAT_CHANNEL);
|
||||
|
||||
private static final Set<String> ALLOWED_MIME_TYPES = Set.of("application/pdf");
|
||||
|
||||
private final Object pipelinePollMonitor = new Object();
|
||||
|
||||
private final ApplicationProperties.Telegram telegramProperties;
|
||||
private final RuntimePathConfig runtimePathConfig;
|
||||
private final TelegramBotsApi telegramBotsApi;
|
||||
|
||||
public TelegramPipelineBot(
|
||||
ApplicationProperties applicationProperties,
|
||||
RuntimePathConfig runtimePathConfig,
|
||||
TelegramBotsApi telegramBotsApi) {
|
||||
|
||||
super(applicationProperties.getTelegram().getBotToken());
|
||||
this.telegramProperties = applicationProperties.getTelegram();
|
||||
this.runtimePathConfig = runtimePathConfig;
|
||||
this.telegramBotsApi = telegramBotsApi;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void register() {
|
||||
if (StringUtils.isAnyBlank(getBotUsername(), getBotToken())) {
|
||||
log.warn("Telegram bot disabled because botToken or botUsername is not configured");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
telegramBotsApi.registerBot(this);
|
||||
log.info("Telegram pipeline bot registered as {}", getBotUsername());
|
||||
} catch (TelegramApiException e) {
|
||||
log.error("Failed to register Telegram bot", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdateReceived(Update update) {
|
||||
Message message = extractMessage(update);
|
||||
if (message == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Chat chat = message.getChat();
|
||||
if (chat == null || !isSupportedChatType(chat.getType())) {
|
||||
log.info(
|
||||
"Ignoring message {}, unsupported chat type {}",
|
||||
message.getMessageId(),
|
||||
chat != null ? chat.getType() : "null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isAuthorized(message, chat)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (update.hasMessage() && update.getMessage().hasText()) {
|
||||
String messageText = update.getMessage().getText();
|
||||
long chatId = update.getMessage().getChatId();
|
||||
if ("/start".equals(messageText)) {
|
||||
sendMessage(
|
||||
chatId,
|
||||
"""
|
||||
Welcome to the SPDF Telegram Bot!
|
||||
|
||||
To get started, please send me a PDF document that you would like to process.
|
||||
Make sure the document is in PDF format.
|
||||
|
||||
Once I receive your document, I'll begin processing it through the pipeline.
|
||||
""");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (message.hasDocument()) {
|
||||
handleIncomingFile(message);
|
||||
return;
|
||||
}
|
||||
if (feedback(FeedbackEnum.NO_VALID_DOCUMENT, chat.getType())) {
|
||||
sendMessage(
|
||||
chat.getId(),
|
||||
"No valid file found in the message. Please send a document to process.");
|
||||
}
|
||||
}
|
||||
|
||||
private boolean feedback(FeedbackEnum feedbackEnum, String chatType) {
|
||||
return switch (feedbackEnum) {
|
||||
case NO_VALID_DOCUMENT ->
|
||||
switch (chatType) {
|
||||
case CHAT_CHANNEL ->
|
||||
telegramProperties.getFeedback().getChannel().getNoValidDocument();
|
||||
case CHAT_PRIVATE ->
|
||||
telegramProperties.getFeedback().getUser().getNoValidDocument();
|
||||
default -> true;
|
||||
};
|
||||
case ERROR_MESSAGE ->
|
||||
switch (chatType) {
|
||||
case CHAT_CHANNEL ->
|
||||
telegramProperties.getFeedback().getChannel().getErrorMessage();
|
||||
case CHAT_PRIVATE ->
|
||||
telegramProperties.getFeedback().getUser().getErrorMessage();
|
||||
default -> true;
|
||||
};
|
||||
case ERROR_PROCESSING ->
|
||||
switch (chatType) {
|
||||
case CHAT_CHANNEL ->
|
||||
telegramProperties.getFeedback().getChannel().getErrorProcessing();
|
||||
case CHAT_PRIVATE ->
|
||||
telegramProperties.getFeedback().getUser().getErrorProcessing();
|
||||
default -> true;
|
||||
};
|
||||
case PROCESSING ->
|
||||
switch (chatType) {
|
||||
case CHAT_CHANNEL ->
|
||||
telegramProperties.getFeedback().getChannel().getProcessing();
|
||||
case CHAT_PRIVATE ->
|
||||
telegramProperties.getFeedback().getUser().getProcessing();
|
||||
default -> true;
|
||||
};
|
||||
default -> true;
|
||||
};
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Message Extraction / Chat Type
|
||||
// ---------------------------
|
||||
|
||||
private Message extractMessage(Update update) {
|
||||
if (update.hasMessage()) return update.getMessage();
|
||||
if (update.hasChannelPost()) return update.getChannelPost();
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean isSupportedChatType(String type) {
|
||||
return type != null && SUPPORTED_CHAT_TYPES.contains(type);
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Authorization
|
||||
// ---------------------------
|
||||
|
||||
private boolean isAuthorized(Message message, Chat chat) {
|
||||
if (!(telegramProperties.getEnableAllowUserIDs()
|
||||
|| telegramProperties.getEnableAllowChannelIDs())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return switch (chat.getType()) {
|
||||
case CHAT_CHANNEL -> checkChannelAccess(message, chat);
|
||||
case CHAT_PRIVATE -> checkUserAccess(message, chat);
|
||||
case CHAT_GROUP, CHAT_SUPERGROUP -> true; // groups allowed by default
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
|
||||
private boolean checkUserAccess(Message message, Chat chat) {
|
||||
if (!telegramProperties.getEnableAllowUserIDs()) return true;
|
||||
|
||||
User from = message.getFrom();
|
||||
List<Long> allow = telegramProperties.getAllowUserIDs();
|
||||
|
||||
if (allow.isEmpty()) {
|
||||
log.warn("No allowed user IDs configured - allowing all users.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (from == null || !allow.contains(from.getId())) {
|
||||
log.info(
|
||||
"Rejecting user {} in private chat {}",
|
||||
from != null ? from.getId() : "unknown",
|
||||
chat.getId());
|
||||
if (feedback(FeedbackEnum.ERROR_MESSAGE, chat.getType())) {
|
||||
sendMessage(chat.getId(), "You are not authorized to use this bot.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean checkChannelAccess(Message message, Chat chat) {
|
||||
if (!telegramProperties.getEnableAllowChannelIDs()) return true;
|
||||
|
||||
Chat senderChat = message.getSenderChat();
|
||||
List<Long> allow = telegramProperties.getAllowChannelIDs();
|
||||
|
||||
if (allow.isEmpty()) {
|
||||
log.warn("No allowed channel IDs configured - allowing all channels.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (senderChat == null || !allow.contains(senderChat.getId())) {
|
||||
log.info(
|
||||
"Rejecting channel {} in chat {}",
|
||||
senderChat != null ? senderChat.getId() : "unknown",
|
||||
chat.getId());
|
||||
if (feedback(FeedbackEnum.ERROR_MESSAGE, chat.getType())) {
|
||||
sendMessage(chat.getId(), "This channel is not authorized to use this bot.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// File Handling
|
||||
// ---------------------------
|
||||
|
||||
private void handleIncomingFile(Message message) {
|
||||
Long chatId = message.getChatId();
|
||||
Document doc = message.getDocument();
|
||||
String chatType = message.getChat().getType();
|
||||
|
||||
if (doc == null) {
|
||||
if (feedback(FeedbackEnum.NO_VALID_DOCUMENT, chatType)) {
|
||||
sendMessage(chatId, "No document found.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (doc.getMimeType() != null
|
||||
&& !ALLOWED_MIME_TYPES.contains(doc.getMimeType().toLowerCase())) {
|
||||
if (feedback(FeedbackEnum.NO_VALID_DOCUMENT, chatType)) {
|
||||
sendMessage(
|
||||
chatId,
|
||||
"Unsupported MIME type: "
|
||||
+ doc.getMimeType()
|
||||
+ "\nAllowed: "
|
||||
+ String.join(", ", ALLOWED_MIME_TYPES));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!hasJsonConfig(chatId)) {
|
||||
if (feedback(FeedbackEnum.ERROR_PROCESSING, chatType)) {
|
||||
sendMessage(
|
||||
chatId,
|
||||
"No JSON configuration file found in the pipeline inbox folder. Please"
|
||||
+ " contact the administrator.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!CHAT_CHANNEL.equalsIgnoreCase(chatType)
|
||||
&& feedback(FeedbackEnum.PROCESSING, chatType)) {
|
||||
sendMessage(chatId, "File received. Starting processing...");
|
||||
}
|
||||
|
||||
PipelineFileInfo info = downloadMessageFile(message);
|
||||
List<Path> outputs = waitForPipelineOutputs(info);
|
||||
|
||||
if (outputs.isEmpty()) {
|
||||
if (feedback(FeedbackEnum.ERROR_PROCESSING, chatType)) {
|
||||
sendMessage(
|
||||
chatId,
|
||||
"No results were found in the pipeline output folder. Check"
|
||||
+ " configuration.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (Path file : outputs) {
|
||||
SendDocument out = new SendDocument();
|
||||
out.setChatId(chatId);
|
||||
out.setDocument(new InputFile(file.toFile(), file.getFileName().toString()));
|
||||
execute(out);
|
||||
}
|
||||
|
||||
} catch (TelegramApiException e) {
|
||||
log.error("Telegram API error", e);
|
||||
if (feedback(FeedbackEnum.ERROR_MESSAGE, chatType)) {
|
||||
sendMessage(chatId, "Telegram API error occurred.");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("IO error", e);
|
||||
if (feedback(FeedbackEnum.ERROR_MESSAGE, chatType)) {
|
||||
sendMessage(chatId, "An IO error occurred.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Unexpected error", e);
|
||||
if (feedback(FeedbackEnum.ERROR_MESSAGE, chatType)) {
|
||||
sendMessage(chatId, "Unexpected error occurred.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PipelineFileInfo downloadMessageFile(Message message)
|
||||
throws TelegramApiException, IOException {
|
||||
Document document = message.getDocument();
|
||||
String filename = document.getFileName();
|
||||
String name =
|
||||
StringUtils.isNotBlank(filename) ? filename : document.getFileUniqueId() + ".bin";
|
||||
|
||||
return downloadFile(document.getFileId(), name, message);
|
||||
}
|
||||
|
||||
private PipelineFileInfo downloadFile(String fileId, String originalName, Message message)
|
||||
throws TelegramApiException, IOException {
|
||||
|
||||
Long chatId = message.getChatId();
|
||||
|
||||
Path inboxFolder = getInboxFolder(chatId);
|
||||
|
||||
GetFile getFile = new GetFile(fileId);
|
||||
File tgFile = execute(getFile);
|
||||
|
||||
if (tgFile == null || StringUtils.isBlank(tgFile.getFilePath())) {
|
||||
throw new IOException("Telegram did not return a file path.");
|
||||
}
|
||||
|
||||
URL url = buildDownloadUrl(tgFile.getFilePath());
|
||||
|
||||
String base = FilenameUtils.getBaseName(originalName) + "-" + UUID.randomUUID();
|
||||
String ext = FilenameUtils.getExtension(originalName);
|
||||
String outFile = ext.isBlank() ? base : base + "." + ext;
|
||||
|
||||
Path targetFile = inboxFolder.resolve(outFile);
|
||||
|
||||
try (InputStream in = url.openStream()) {
|
||||
Files.copy(in, targetFile);
|
||||
}
|
||||
|
||||
log.info("Saved Telegram file {} to {}", originalName, targetFile);
|
||||
return new PipelineFileInfo(targetFile, base, Instant.now());
|
||||
}
|
||||
|
||||
private URL buildDownloadUrl(String filePath) throws MalformedURLException {
|
||||
try {
|
||||
URI uri =
|
||||
new URI(
|
||||
"https",
|
||||
"api.telegram.org",
|
||||
"/file/bot" + getBotToken() + "/" + filePath,
|
||||
null);
|
||||
return uri.toURL();
|
||||
} catch (URISyntaxException e) {
|
||||
throw new MalformedURLException("Failed to build Telegram download URL");
|
||||
} catch (MalformedURLException e) {
|
||||
MalformedURLException sanitized =
|
||||
new MalformedURLException("Failed to build Telegram download URL");
|
||||
sanitized.initCause(e);
|
||||
throw sanitized;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Inbox-Ordner & JSON-Check
|
||||
// ---------------------------
|
||||
|
||||
private Path getInboxFolder(Long chatId) throws IOException {
|
||||
Path baseInbox =
|
||||
Paths.get(
|
||||
runtimePathConfig.getPipelineWatchedFoldersPath(),
|
||||
telegramProperties.getPipelineInboxFolder());
|
||||
|
||||
Files.createDirectories(baseInbox);
|
||||
|
||||
Path inboxFolder =
|
||||
telegramProperties.getCustomFolderSuffix()
|
||||
? baseInbox.resolve(chatId.toString())
|
||||
: baseInbox;
|
||||
|
||||
Files.createDirectories(inboxFolder);
|
||||
|
||||
return inboxFolder;
|
||||
}
|
||||
|
||||
private boolean hasJsonConfig(Long chatId) {
|
||||
try {
|
||||
Path inboxFolder = getInboxFolder(chatId);
|
||||
try (Stream<Path> s = Files.list(inboxFolder)) {
|
||||
return s.anyMatch(p -> p.toString().endsWith(".json"));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("Failed to check JSON config for chat {}", chatId, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Pipeline polling
|
||||
// ---------------------------
|
||||
|
||||
private List<Path> waitForPipelineOutputs(PipelineFileInfo info) throws IOException {
|
||||
|
||||
Path finishedDir = Paths.get(runtimePathConfig.getPipelineFinishedFoldersPath());
|
||||
Files.createDirectories(finishedDir);
|
||||
|
||||
Instant start = info.savedAt();
|
||||
Duration timeout = Duration.ofSeconds(telegramProperties.getProcessingTimeoutSeconds());
|
||||
Duration poll = Duration.ofMillis(telegramProperties.getPollingIntervalMillis());
|
||||
List<Path> results = new ArrayList<>();
|
||||
|
||||
while (Duration.between(start, Instant.now()).compareTo(timeout) <= 0) {
|
||||
try (Stream<Path> s = Files.list(finishedDir)) {
|
||||
results =
|
||||
s.filter(Files::isRegularFile)
|
||||
.filter(path -> matchesBaseName(info.uniqueBaseName(), path))
|
||||
.filter(path -> isNewerThan(path, start))
|
||||
.sorted(Comparator.comparing(Path::toString))
|
||||
.toList();
|
||||
}
|
||||
|
||||
if (!results.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
synchronized (pipelinePollMonitor) {
|
||||
try {
|
||||
pipelinePollMonitor.wait(poll.toMillis());
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
private boolean matchesBaseName(String base, Path file) {
|
||||
return file.getFileName().toString().contains(base);
|
||||
}
|
||||
|
||||
private boolean isNewerThan(Path path, Instant since) {
|
||||
try {
|
||||
return Files.getLastModifiedTime(path).toInstant().isAfter(since);
|
||||
} catch (IOException e) {
|
||||
log.info("Could not read modification time for {}", path);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Messaging
|
||||
// ---------------------------
|
||||
|
||||
private void sendMessage(Long chatId, String text) {
|
||||
if (chatId == null) return;
|
||||
|
||||
SendMessage msg = new SendMessage();
|
||||
msg.setChatId(chatId);
|
||||
msg.setText(text);
|
||||
try {
|
||||
execute(msg);
|
||||
} catch (TelegramApiException e) {
|
||||
log.warn("Failed to send message to {}", chatId, e);
|
||||
}
|
||||
}
|
||||
|
||||
private record PipelineFileInfo(Path originalFile, String uniqueBaseName, Instant savedAt) {}
|
||||
|
||||
@Override
|
||||
public String getBotUsername() {
|
||||
return telegramProperties.getBotUsername();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBotToken() {
|
||||
return telegramProperties.getBotToken();
|
||||
}
|
||||
}
|
||||
@@ -16,30 +16,30 @@ security:
|
||||
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
||||
loginMethod: all # Accepts values like 'all' and 'normal'(only Login with Username/Password), 'oauth2'(only Login with OAuth2) or 'saml2'(only Login with SAML2)
|
||||
initialLogin:
|
||||
username: "" # initial username for the first login
|
||||
password: "" # initial password for the first login
|
||||
username: '' # initial username for the first login
|
||||
password: '' # initial password for the first login
|
||||
oauth2:
|
||||
enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
||||
client:
|
||||
keycloak:
|
||||
issuer: "" # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
||||
clientId: "" # client ID for Keycloak OAuth2
|
||||
clientSecret: "" # client secret for Keycloak OAuth2
|
||||
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. Available options are: [email | name | given_name | family_name | preferred_name]
|
||||
google:
|
||||
clientId: "" # client ID for Google OAuth2
|
||||
clientSecret: "" # client secret for Google OAuth2
|
||||
clientId: '' # client ID for Google OAuth2
|
||||
clientSecret: '' # client secret for Google OAuth2
|
||||
scopes: email, profile # scopes for Google OAuth2
|
||||
useAsUsername: email # field to use as the username for Google OAuth2. Available options are: [email | name | given_name | family_name]
|
||||
github:
|
||||
clientId: "" # client ID for GitHub OAuth2
|
||||
clientSecret: "" # client secret for GitHub OAuth2
|
||||
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. Available options are: [email | login | name]
|
||||
issuer: "" # set to any Provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint
|
||||
clientId: "" # client ID from your Provider
|
||||
clientSecret: "" # client secret from your Provider
|
||||
issuer: '' # set to any Provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint
|
||||
clientId: '' # client ID from your Provider
|
||||
clientSecret: '' # client secret from your Provider
|
||||
autoCreateUser: true # set to 'true' to allow auto-creation of non-existing users
|
||||
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
|
||||
useAsUsername: email # default is 'email'; custom fields can be used as the username
|
||||
@@ -47,14 +47,14 @@ security:
|
||||
provider: google # set this to your OAuth Provider's name, e.g., 'google' or 'keycloak'
|
||||
saml2:
|
||||
enabled: false # Only enabled for paid enterprise clients (enterpriseEdition.enabled must be true)
|
||||
provider: "" # The name of your Provider
|
||||
provider: '' # The name of your Provider
|
||||
autoCreateUser: true # set to 'true' to allow auto-creation of non-existing users
|
||||
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
|
||||
registrationId: stirling # The name of your Service Provider (SP) app name. Should match the name in the path for your SSO & SLO URLs
|
||||
idpMetadataUri: https://dev-XXXXXXXX.okta.com/app/externalKey/sso/saml/metadata # The uri for your Provider's metadata
|
||||
idpSingleLoginUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml # The URL for initiating SSO. Provided by your Provider
|
||||
idpSingleLogoutUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml # The URL for initiating SLO. Provided by your Provider
|
||||
idpIssuer: "" # The ID of your Provider
|
||||
idpIssuer: '' # The ID of your Provider
|
||||
idpCert: classpath:okta.cert # The certificate your Provider will use to authenticate your app's SAML authentication requests. Provided by your Provider
|
||||
privateKey: classpath:saml-private-key.key # Your private key. Generated from your keypair
|
||||
spCert: classpath:saml-public-cert.crt # Your signing certificate. Generated from your keypair
|
||||
@@ -110,45 +110,21 @@ mail:
|
||||
enableInvites: false # set to 'true' to enable email invites for user management (requires mail.enabled and security.enableLogin)
|
||||
host: smtp.example.com # SMTP server hostname
|
||||
port: 587 # SMTP server port
|
||||
username: "" # SMTP server username
|
||||
password: "" # SMTP server password
|
||||
from: "" # sender email address
|
||||
username: '' # SMTP server username
|
||||
password: '' # SMTP server password
|
||||
from: '' # sender email address
|
||||
startTlsEnable: true # enable STARTTLS (explicit TLS upgrade after connecting) when supported by the SMTP server
|
||||
startTlsRequired: false # require STARTTLS; connection fails if the upgrade command is not supported
|
||||
sslEnable: false # enable SSL/TLS wrapper for implicit TLS (typically used with port 465)
|
||||
sslTrust: "" # optional trusted host override, e.g. "smtp.example.com" or "*"; defaults to "*" (trust all) when empty
|
||||
sslTrust: '' # optional trusted host override, e.g. "smtp.example.com" or "*"; defaults to "*" (trust all) when empty
|
||||
sslCheckServerIdentity: false # enable hostname verification when using SSL/TLS
|
||||
|
||||
telegram:
|
||||
enabled: false # set to 'true' to enable Telegram bot integration
|
||||
botToken: "" # Telegram bot token obtained from BotFather
|
||||
botUsername: "" # Telegram bot username (without @)
|
||||
pipelineInboxFolder: telegram # Name of the pipeline inbox folder for Telegram uploads
|
||||
customFolderSuffix: true # set to 'true' to allow users to specify custom target folders via UserID
|
||||
enableAllowUserIDs: true # set to 'true' to restrict access to specific Telegram user IDs
|
||||
allowUserIDs: [] # List of allowed Telegram user IDs (e.g. [123456789, 987654321]). Leave empty to allow all users.
|
||||
enableAllowChannelIDs: true # set to 'true' to restrict access to specific Telegram channel IDs
|
||||
allowChannelIDs: [] # List of allowed Telegram channel IDs (e.g. [-1001234567890, -1009876543210]). Leave empty to allow all channels.
|
||||
processingTimeoutSeconds: 180 # Maximum time in seconds to wait for processing a Telegram request
|
||||
pollingIntervalMillis: 2000 # Interval in milliseconds between polling for new messages
|
||||
feedback:
|
||||
channel:
|
||||
noValidDocument: true # set to 'false' to hide/suppress feedback messages in channels (to avoid spam)
|
||||
errorProcessing: true # set to 'false' to hide/suppress feedback messages in channels (to avoid spam)
|
||||
errorMessage: true # set to 'false' to hide/suppress error messages in channels (to avoid spam)
|
||||
processing: true # set to 'false' to hide/suppress processing messages in channels (to avoid spam)
|
||||
user:
|
||||
noValidDocument: true # set to 'false' to hide/suppress feedback messages to users (to avoid spam)
|
||||
errorProcessing: true # set to 'false' to hide/suppress feedback messages to users (to avoid spam)
|
||||
errorMessage: true # set to 'false' to hide/suppress error messages to users (to avoid spam)
|
||||
processing: true # set to 'false' to hide/suppress processing messages to users (to avoid spam)
|
||||
|
||||
legal:
|
||||
termsAndConditions: https://www.stirling.com/legal/terms-of-service # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
|
||||
privacyPolicy: https://www.stirling.com/legal/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
|
||||
accessibilityStatement: "" # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
|
||||
cookiePolicy: "" # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder
|
||||
impressum: "" # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder
|
||||
accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
|
||||
cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder
|
||||
impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder
|
||||
|
||||
system:
|
||||
defaultLocale: en-US # set the default language (e.g. 'de-DE', 'fr-FR', etc)
|
||||
@@ -167,14 +143,9 @@ system:
|
||||
disableSanitize: false # set to true to disable Sanitize HTML; (can lead to injections in HTML)
|
||||
maxDPI: 500 # Maximum allowed DPI for PDF to image conversion
|
||||
corsAllowedOrigins: [] # List of allowed origins for CORS (e.g. ['http://localhost:5173', 'https://app.example.com']). Leave empty to disable CORS. For local development with frontend on port 5173, add 'http://localhost:5173'
|
||||
backendUrl: "" # Backend base URL for SAML/OAuth/API callbacks (e.g. 'http://localhost:8080' for dev, 'https://api.example.com' for production). REQUIRED for SSO authentication to work correctly. This is where your IdP will send SAML responses and OAuth callbacks. Leave empty to default to 'http://localhost:8080' in development.
|
||||
frontendUrl: "" # Frontend URL for invite email links (e.g. 'https://app.example.com'). Optional - if not set, will use backendUrl. This is the URL users click in invite emails.
|
||||
backendUrl: '' # Backend base URL for SAML/OAuth/API callbacks (e.g. 'http://localhost:8080' for dev, 'https://api.example.com' for production). REQUIRED for SSO authentication to work correctly. This is where your IdP will send SAML responses and OAuth callbacks. Leave empty to default to 'http://localhost:8080' in development.
|
||||
frontendUrl: '' # Frontend URL for invite email links (e.g. 'https://app.example.com'). Optional - if not set, will use backendUrl. This is the URL users click in invite emails.
|
||||
enableMobileScanner: false # Enable mobile phone QR code upload feature. Requires frontendUrl to be configured.
|
||||
mobileScannerSettings:
|
||||
convertToPdf: true # Automatically convert uploaded images to PDF format. If false, images are kept as-is.
|
||||
imageResolution: full # Image resolution for mobile uploads: 'full' (original size) or 'reduced' (max 1200px on longest side). Only applies when convertToPdf is true.
|
||||
pageFormat: A4 # Page format for converted PDFs: 'keep' (original image dimensions), 'A4' (A4 page size), or 'letter' (US Letter page size). Only applies when convertToPdf is true.
|
||||
stretchToFit: false # Whether to stretch images to fill the entire page (may distort aspect ratio). If false, images are centered with preserved aspect ratio. Only applies when convertToPdf is true.
|
||||
serverCertificate:
|
||||
enabled: true # Enable server-side certificate for "Sign with Stirling-PDF" option
|
||||
organizationName: Stirling-PDF # Organization name for generated certificates
|
||||
@@ -186,14 +157,14 @@ system:
|
||||
level: MEDIUM # Security level: MAX (whitelist only), MEDIUM (block internal networks), OFF (no restrictions)
|
||||
allowedDomains: [] # Whitelist of allowed domains (e.g. ['cdn.example.com', 'images.google.com'])
|
||||
blockedDomains: [] # Additional domains to block (e.g. ['evil.com', 'malicious.org'])
|
||||
internalTlds: [".local", ".internal", ".corp", ".home"] # Block domains with these TLD patterns
|
||||
internalTlds: ['.local', '.internal', '.corp', '.home'] # Block domains with these TLD patterns
|
||||
blockPrivateNetworks: true # Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)
|
||||
blockLocalhost: true # Block localhost and loopback addresses (127.x.x.x, ::1)
|
||||
blockLinkLocal: true # Block link-local addresses (169.254.x.x, fe80::/10)
|
||||
blockCloudMetadata: true # Block cloud provider metadata endpoints (169.254.169.254)
|
||||
datasource:
|
||||
enableCustomDatabase: false # Enterprise users ONLY, set this property to 'true' if you would like to use your own custom database configuration
|
||||
customDatabaseUrl: "" # eg jdbc:postgresql://localhost:5432/postgres, set the url for your own custom database connection. If provided, the type, hostName, port and name are not necessary and will not be used
|
||||
customDatabaseUrl: '' # eg jdbc:postgresql://localhost:5432/postgres, set the url for your own custom database connection. If provided, the type, hostName, port and name are not necessary and will not be used
|
||||
username: postgres # set the database username
|
||||
password: postgres # set the database password
|
||||
type: postgresql # the type of the database to set (e.g. 'h2', 'postgresql')
|
||||
@@ -202,29 +173,29 @@ system:
|
||||
name: postgres # set the name of your database. Should match the name of the database you create
|
||||
customPaths:
|
||||
pipeline:
|
||||
watchedFoldersDir: "" # Defaults to /pipeline/watchedFolders
|
||||
finishedFoldersDir: "" # Defaults to /pipeline/finishedFolders
|
||||
watchedFoldersDir: '' # Defaults to /pipeline/watchedFolders
|
||||
finishedFoldersDir: '' # Defaults to /pipeline/finishedFolders
|
||||
operations:
|
||||
weasyprint: "" # Defaults to /opt/venv/bin/weasyprint
|
||||
unoconvert: "" # Defaults to /opt/venv/bin/unoconvert
|
||||
calibre: "" # Defaults to /usr/bin/ebook-convert
|
||||
ocrmypdf: "" # Defaults to /usr/bin/ocrmypdf
|
||||
soffice: "" # Defaults to /usr/bin/soffice
|
||||
fileUploadLimit: "" # Defaults to "". No limit when string is empty. Set a number, between 0 and 999, followed by one of the following strings to set a limit. "KB", "MB", "GB".
|
||||
weasyprint: '' # Defaults to /opt/venv/bin/weasyprint
|
||||
unoconvert: '' # Defaults to /opt/venv/bin/unoconvert
|
||||
calibre: '' # Defaults to /usr/bin/ebook-convert
|
||||
ocrmypdf: '' # Defaults to /usr/bin/ocrmypdf
|
||||
soffice: '' # Defaults to /usr/bin/soffice
|
||||
fileUploadLimit: '' # Defaults to "". No limit when string is empty. Set a number, between 0 and 999, followed by one of the following strings to set a limit. "KB", "MB", "GB".
|
||||
tempFileManagement:
|
||||
baseTmpDir: "" # Defaults to java.io.tmpdir/stirling-pdf
|
||||
libreofficeDir: "" # Defaults to tempFileManagement.baseTmpDir/libreoffice
|
||||
systemTempDir: "" # Only used if cleanupSystemTemp is true
|
||||
baseTmpDir: '' # Defaults to java.io.tmpdir/stirling-pdf
|
||||
libreofficeDir: '' # Defaults to tempFileManagement.baseTmpDir/libreoffice
|
||||
systemTempDir: '' # Only used if cleanupSystemTemp is true
|
||||
prefix: stirling-pdf- # Prefix for temp file names
|
||||
maxAgeHours: 24 # Maximum age in hours before temp files are cleaned up
|
||||
cleanupIntervalMinutes: 30 # How often to run cleanup (in minutes)
|
||||
startupCleanup: true # Clean up old temp files on startup
|
||||
cleanupSystemTemp: false # Whether to clean broader system temp directory
|
||||
databaseBackup:
|
||||
cron: "0 0 0 * * ?" # Cron expression for automatic database backups "0 0 0 * * ?" daily at midnight
|
||||
cron: '0 0 0 * * ?' # Cron expression for automatic database backups "0 0 0 * * ?" daily at midnight
|
||||
|
||||
ui:
|
||||
appNameNavbar: "" # name displayed on the navigation bar
|
||||
appNameNavbar: '' # name displayed on the navigation bar
|
||||
logoStyle: classic # Options: 'classic' (default - classic S icon) or 'modern' (minimalist logo)
|
||||
languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled.
|
||||
|
||||
@@ -242,20 +213,8 @@ AutomaticallyGenerated:
|
||||
appVersion: 0.35.0
|
||||
|
||||
processExecutor:
|
||||
autoUnoServer: true # true: use local pool based on libreOfficeSessionLimit; false: use unoServerEndpoints
|
||||
unoServerEndpoints: [] # Used when autoUnoServer is false
|
||||
# Example manual endpoints (uncomment to use):
|
||||
# unoServerEndpoints:
|
||||
# - host: "127.0.0.1"
|
||||
# port: 2003
|
||||
# hostLocation: "auto" # auto|local|remote (use "remote" for port-forwarded servers)
|
||||
# protocol: "http" # http|https
|
||||
# - host: "remote-server.local"
|
||||
# port: 8080
|
||||
# hostLocation: "remote"
|
||||
# protocol: "https"
|
||||
sessionLimit: # Process executor instances limits
|
||||
libreOfficeSessionLimit: 1 # Each additional uno server adds ~50MB idle RAM
|
||||
libreOfficeSessionLimit: 1
|
||||
pdfToHtmlSessionLimit: 1
|
||||
qpdfSessionLimit: 4
|
||||
tesseractSessionLimit: 1
|
||||
|
||||
@@ -7,13 +7,6 @@
|
||||
"moduleLicense": "GNU Lesser General Public License",
|
||||
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "ch.qos.logback:logback-classic",
|
||||
"moduleUrl": "http://www.qos.ch",
|
||||
"moduleVersion": "1.5.23",
|
||||
"moduleLicense": "GNU Lesser General Public License",
|
||||
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "ch.qos.logback:logback-core",
|
||||
"moduleUrl": "http://www.qos.ch",
|
||||
@@ -21,13 +14,6 @@
|
||||
"moduleLicense": "GNU Lesser General Public License",
|
||||
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "ch.qos.logback:logback-core",
|
||||
"moduleUrl": "http://www.qos.ch",
|
||||
"moduleVersion": "1.5.23",
|
||||
"moduleLicense": "GNU Lesser General Public License",
|
||||
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.adobe.xmp:xmpcore",
|
||||
"moduleUrl": "https://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html",
|
||||
@@ -112,20 +98,6 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
|
||||
"moduleUrl": "https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-base",
|
||||
"moduleVersion": "2.19.2",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider",
|
||||
"moduleUrl": "https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-json-provider",
|
||||
"moduleVersion": "2.19.2",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations",
|
||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-base",
|
||||
@@ -133,13 +105,6 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
|
||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-base",
|
||||
"moduleVersion": "2.19.2",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names",
|
||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names",
|
||||
@@ -167,20 +132,6 @@
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.github.bbottema:jetbrains-runtime-annotations",
|
||||
"moduleUrl": "https://github.com/bbottema/jetbrains-runtime-nullability-annotations",
|
||||
"moduleVersion": "1.0.2",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.github.bbottema:rtf-to-html",
|
||||
"moduleUrl": "http:///github.com/bbottema/rtf-to-html",
|
||||
"moduleVersion": "1.1.1",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.github.ben-manes.caffeine:caffeine",
|
||||
"moduleUrl": "https://github.com/ben-manes/caffeine",
|
||||
@@ -221,6 +172,13 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.google.code.gson:gson",
|
||||
"moduleUrl": "https://github.com/google/gson",
|
||||
"moduleVersion": "2.13.2",
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.google.errorprone:error_prone_annotations",
|
||||
"moduleUrl": "https://errorprone.info/error_prone_annotations",
|
||||
@@ -228,6 +186,13 @@
|
||||
"moduleLicense": "Apache 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.google.errorprone:error_prone_annotations",
|
||||
"moduleUrl": "https://errorprone.info/error_prone_annotations",
|
||||
"moduleVersion": "2.41.0",
|
||||
"moduleLicense": "Apache 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.google.guava:failureaccess",
|
||||
"moduleUrl": "https://github.com/google/guava/",
|
||||
@@ -258,7 +223,7 @@
|
||||
{
|
||||
"moduleName": "com.google.zxing:core",
|
||||
"moduleUrl": "https://github.com/zxing/zxing/core",
|
||||
"moduleVersion": "3.5.4",
|
||||
"moduleVersion": "3.5.3",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
@@ -330,13 +295,6 @@
|
||||
"moduleLicense": "Apache 2",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.pivovarit:throwing-function",
|
||||
"moduleUrl": "https://github.com/pivovarit/throwing-function",
|
||||
"moduleVersion": "1.6.1",
|
||||
"moduleLicense": "The Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.posthog.java:posthog",
|
||||
"moduleUrl": "http://github.com/PostHog/posthog-java",
|
||||
@@ -344,20 +302,6 @@
|
||||
"moduleLicense": "MIT License",
|
||||
"moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sanctionco.jmail:jmail",
|
||||
"moduleUrl": "https://github.com/RohanNagar/jmail",
|
||||
"moduleVersion": "1.6.3",
|
||||
"moduleLicense": "MIT License",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/mit-license.php"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.activation:jakarta.activation",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "1.2.2",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.istack:istack-commons-runtime",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
@@ -365,97 +309,69 @@
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.xml.bind:jaxb-core",
|
||||
"moduleUrl": "http://www.oracle.com/",
|
||||
"moduleVersion": "2.3.0.1",
|
||||
"moduleLicense": "CDDL+GPL License",
|
||||
"moduleLicenseUrl": "http://glassfish.java.net/public/CDDL+GPL_1_1.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.xml.bind:jaxb-core",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "4.0.6",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.xml.bind:jaxb-impl",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "2.3.9",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.sun.xml.bind:jaxb-impl",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "4.0.6",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.common:common-image",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.common:common-io",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.common:common-lang",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-batik",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-bmp",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-core",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-jpeg",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-metadata",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-psd",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-tiff",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.twelvemonkeys.imageio:imageio-webp",
|
||||
"moduleVersion": "3.13.0",
|
||||
"moduleVersion": "3.12.0",
|
||||
"moduleLicense": "The BSD License",
|
||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||
},
|
||||
@@ -606,13 +522,6 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "com.zaxxer:SparseBitSet",
|
||||
"moduleUrl": "https://github.com/brettwooldridge/SparseBitSet",
|
||||
"moduleVersion": "1.3",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "commons-beanutils:commons-beanutils",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-beanutils",
|
||||
@@ -651,7 +560,7 @@
|
||||
{
|
||||
"moduleName": "commons-io:commons-io",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-io/",
|
||||
"moduleVersion": "2.21.0",
|
||||
"moduleVersion": "2.20.0",
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
@@ -703,13 +612,6 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "io.micrometer:micrometer-core",
|
||||
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
||||
"moduleVersion": "1.16.1",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "io.micrometer:micrometer-jakarta9",
|
||||
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
||||
@@ -776,42 +678,42 @@
|
||||
{
|
||||
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
|
||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
|
||||
"moduleVersion": "2.2.38",
|
||||
"moduleVersion": "2.2.36",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
|
||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
|
||||
"moduleVersion": "2.2.41",
|
||||
"moduleVersion": "2.2.40",
|
||||
"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.38",
|
||||
"moduleVersion": "2.2.36",
|
||||
"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.41",
|
||||
"moduleVersion": "2.2.40",
|
||||
"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.38",
|
||||
"moduleVersion": "2.2.36",
|
||||
"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.41",
|
||||
"moduleVersion": "2.2.40",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
@@ -913,13 +815,6 @@
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "jakarta.ws.rs:jakarta.ws.rs-api",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.0",
|
||||
"moduleLicense": "GPL-2.0-with-classpath-exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "jakarta.xml.bind:jakarta.xml.bind-api",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
@@ -928,25 +823,32 @@
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "javax.activation:javax.activation-api",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "1.2.0",
|
||||
"moduleLicense": "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/CDDL-1.0"
|
||||
"moduleName": "me.friwi:gluegen-rt",
|
||||
"moduleUrl": "http://jogamp.org/gluegen/www/",
|
||||
"moduleVersion": "v2.4.0-rc-20210111",
|
||||
"moduleLicense": "BSD-4 License",
|
||||
"moduleLicenseUrl": "http://www.spdx.org/licenses/BSD-4-Clause"
|
||||
},
|
||||
{
|
||||
"moduleName": "javax.xml.bind:jaxb-api",
|
||||
"moduleUrl": "http://www.oracle.com/",
|
||||
"moduleVersion": "2.3.1",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://oss.oracle.com/licenses/CDDL+GPL-1.1"
|
||||
"moduleName": "me.friwi:jcef-api",
|
||||
"moduleUrl": "https://bitbucket.org/chromiumembedded/java-cef/",
|
||||
"moduleVersion": "jcef-1770317+cef-132.3.1+g144febe+chromium-132.0.6834.83",
|
||||
"moduleLicense": "BSD License",
|
||||
"moduleLicenseUrl": "https://bitbucket.org/chromiumembedded/java-cef/src/master/LICENSE.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "javax.xml.bind:jaxb-api",
|
||||
"moduleUrl": "http://www.oracle.com/",
|
||||
"moduleVersion": "2.4.0-b180830.0359",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://oss.oracle.com/licenses/CDDL+GPL-1.1"
|
||||
"moduleName": "me.friwi:jcefmaven",
|
||||
"moduleUrl": "https://github.com/jcefmaven/jcefmaven/",
|
||||
"moduleVersion": "132.3.1",
|
||||
"moduleLicense": "Apache-2.0 License",
|
||||
"moduleLicenseUrl": "https://github.com/jcefmaven/jcefmaven/blob/master/LICENSE"
|
||||
},
|
||||
{
|
||||
"moduleName": "me.friwi:jogl-all",
|
||||
"moduleUrl": "http://jogamp.org/jogl/www/",
|
||||
"moduleVersion": "v2.4.0-rc-20210111",
|
||||
"moduleLicense": "Ubuntu Font Licence 1.0",
|
||||
"moduleLicenseUrl": "http://font.ubuntu.com/ufl/ubuntu-font-licence-1.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "net.bytebuddy:byte-buddy",
|
||||
@@ -954,13 +856,6 @@
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "net.java.dev.stax-utils:stax-utils",
|
||||
"moduleUrl": "http://java.net/projects/stax-utils/",
|
||||
"moduleVersion": "20070216",
|
||||
"moduleLicense": "BSD",
|
||||
"moduleLicenseUrl": "http://www.opensource.org/licenses/bsd-license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "net.minidev:accessors-smart",
|
||||
"moduleUrl": "https://urielch.github.io/",
|
||||
@@ -991,14 +886,14 @@
|
||||
{
|
||||
"moduleName": "org.apache.commons:commons-collections4",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-collections/",
|
||||
"moduleVersion": "4.4",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleVersion": "4.5.0",
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.commons:commons-collections4",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-collections/",
|
||||
"moduleVersion": "4.5.0",
|
||||
"moduleName": "org.apache.commons:commons-compress",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-compress/",
|
||||
"moduleVersion": "1.27.1",
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
@@ -1019,17 +914,10 @@
|
||||
{
|
||||
"moduleName": "org.apache.commons:commons-lang3",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-lang/",
|
||||
"moduleVersion": "3.20.0",
|
||||
"moduleVersion": "3.19.0",
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.commons:commons-math3",
|
||||
"moduleUrl": "http://commons.apache.org/proper/commons-math/",
|
||||
"moduleVersion": "3.6.1",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.commons:commons-text",
|
||||
"moduleUrl": "https://commons.apache.org/proper/commons-text",
|
||||
@@ -1058,13 +946,6 @@
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.httpcomponents:httpmime",
|
||||
"moduleUrl": "http://hc.apache.org/httpcomponents-client-ga",
|
||||
"moduleVersion": "4.5.14",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.logging.log4j:log4j-api",
|
||||
"moduleVersion": "2.24.3",
|
||||
@@ -1118,20 +999,6 @@
|
||||
"moduleLicense": "Apache-2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.poi:poi",
|
||||
"moduleUrl": "https://poi.apache.org/",
|
||||
"moduleVersion": "5.2.5",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.poi:poi-scratchpad",
|
||||
"moduleUrl": "https://poi.apache.org/",
|
||||
"moduleVersion": "5.2.5",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.apache.santuario:xmlsec",
|
||||
"moduleUrl": "https://www.apache.org/",
|
||||
@@ -1190,14 +1057,14 @@
|
||||
{
|
||||
"moduleName": "org.bouncycastle:bcpkix-jdk18on",
|
||||
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
|
||||
"moduleVersion": "1.83",
|
||||
"moduleVersion": "1.82",
|
||||
"moduleLicense": "Bouncy Castle Licence",
|
||||
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.bouncycastle:bcprov-jdk18on",
|
||||
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
|
||||
"moduleVersion": "1.83",
|
||||
"moduleVersion": "1.82",
|
||||
"moduleLicense": "Bouncy Castle Licence",
|
||||
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
|
||||
},
|
||||
@@ -1211,7 +1078,7 @@
|
||||
{
|
||||
"moduleName": "org.bouncycastle:bcutil-jdk18on",
|
||||
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
|
||||
"moduleVersion": "1.83",
|
||||
"moduleVersion": "1.82",
|
||||
"moduleLicense": "Bouncy Castle Licence",
|
||||
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
|
||||
},
|
||||
@@ -1444,62 +1311,6 @@
|
||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.grizzly:grizzly-framework",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "4.0.2",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.grizzly:grizzly-http",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "4.0.2",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.grizzly:grizzly-http-server",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "4.0.2",
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.hk2.external:aopalliance-repackaged",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "3.0.6",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.hk2:hk2-api",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "3.0.6",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.hk2:hk2-locator",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "3.0.6",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.hk2:hk2-utils",
|
||||
"moduleUrl": "http://www.oracle.com",
|
||||
"moduleVersion": "3.0.6",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.hk2:osgi-resource-locator",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "1.0.3",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jaxb:jaxb-core",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
@@ -1521,55 +1332,6 @@
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.containers:jersey-container-grizzly2-http",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.core:jersey-client",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.core:jersey-common",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.core:jersey-server",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.ext:jersey-entity-filtering",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.inject:jersey-hk2",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.glassfish.jersey.media:jersey-media-json-jackson",
|
||||
"moduleUrl": "https://www.eclipse.org/org/foundation/",
|
||||
"moduleVersion": "3.1.11",
|
||||
"moduleLicense": "jQuery license",
|
||||
"moduleLicenseUrl": "jquery.org/license"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.hdrhistogram:HdrHistogram",
|
||||
"moduleUrl": "http://hdrhistogram.github.io/HdrHistogram/",
|
||||
@@ -1598,13 +1360,6 @@
|
||||
"moduleLicense": "Apache License 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.javassist:javassist",
|
||||
"moduleUrl": "https://www.javassist.org/",
|
||||
"moduleVersion": "3.30.2-GA",
|
||||
"moduleLicense": "MPL 1.1",
|
||||
"moduleLicenseUrl": "https://www.mozilla.org/en-US/MPL/1.1/"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.jboss.logging:jboss-logging",
|
||||
"moduleUrl": "http://www.jboss.org",
|
||||
@@ -1646,13 +1401,6 @@
|
||||
"moduleLicense": "Eclipse Public License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://github.com/locationtech/jts/blob/master/LICENSE_EPLv2.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.mozilla:rhino",
|
||||
"moduleUrl": "https://developer.mozilla.org/en/Rhino",
|
||||
"moduleVersion": "1.7.13",
|
||||
"moduleLicense": "Mozilla Public License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.mozilla.org/MPL/2.0/index.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.openjfx:javafx-base",
|
||||
"moduleVersion": "21",
|
||||
@@ -1777,31 +1525,6 @@
|
||||
"moduleLicense": "BSD-2-Clause",
|
||||
"moduleLicenseUrl": "https://jdbc.postgresql.org/about/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.simplejavamail:core-module",
|
||||
"moduleVersion": "8.12.6",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.simplejavamail:outlook-message-parser",
|
||||
"moduleUrl": "https://github.com/bbottema/outlook-message-parser",
|
||||
"moduleVersion": "1.14.1",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.simplejavamail:outlook-module",
|
||||
"moduleVersion": "8.12.6",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.simplejavamail:simple-java-mail",
|
||||
"moduleVersion": "8.12.6",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.slf4j:jul-to-slf4j",
|
||||
"moduleUrl": "http://www.slf4j.org",
|
||||
@@ -1825,19 +1548,19 @@
|
||||
},
|
||||
{
|
||||
"moduleName": "org.springdoc:springdoc-openapi-starter-common",
|
||||
"moduleVersion": "2.8.14",
|
||||
"moduleVersion": "2.8.13",
|
||||
"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.8.14",
|
||||
"moduleVersion": "2.8.13",
|
||||
"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.8.14",
|
||||
"moduleVersion": "2.8.13",
|
||||
"moduleLicense": "The Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
@@ -1960,6 +1683,13 @@
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
|
||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||
"moduleVersion": "3.5.7",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.springframework.boot:spring-boot-starter-validation",
|
||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||
@@ -2142,20 +1872,6 @@
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.telegram:telegrambots",
|
||||
"moduleUrl": "https://github.com/rubenlagus/TelegramBots",
|
||||
"moduleVersion": "6.9.7.1",
|
||||
"moduleLicense": "MIT License",
|
||||
"moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.telegram:telegrambots-meta",
|
||||
"moduleUrl": "https://github.com/rubenlagus/TelegramBots",
|
||||
"moduleVersion": "6.9.7.1",
|
||||
"moduleLicense": "MIT License",
|
||||
"moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.thymeleaf.extras:thymeleaf-extras-springsecurity5",
|
||||
"moduleVersion": "3.1.3.RELEASE",
|
||||
@@ -2174,6 +1890,12 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.thymeleaf:thymeleaf-spring6",
|
||||
"moduleVersion": "3.1.3.RELEASE",
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.unbescape:unbescape",
|
||||
"moduleUrl": "http://www.unbescape.org",
|
||||
@@ -2181,53 +1903,10 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:core",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:feature-reporting",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:metadata-fixer",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:parser",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:pdf-model",
|
||||
"moduleUrl": "https://github.com/veraPDF/veraPDF-model/",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:validation-model",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.verapdf:verapdf-xmp-core",
|
||||
"moduleVersion": "1.28.2",
|
||||
"moduleLicense": "Mozilla Public License 2.0 (MPL-2.0)",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/MPL-2.0"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.webjars:swagger-ui",
|
||||
"moduleUrl": "https://www.webjars.org",
|
||||
"moduleVersion": "5.30.1",
|
||||
"moduleVersion": "5.28.1",
|
||||
"moduleLicense": "Apache-2.0"
|
||||
},
|
||||
{
|
||||
|
||||
+1
-5
@@ -169,10 +169,7 @@ public class ProprietaryUIDataController {
|
||||
|
||||
OAUTH2 oauth = securityProps.getOauth2();
|
||||
|
||||
// Only add OAuth2 providers if loginMethod allows it
|
||||
if (oauth != null
|
||||
&& oauth.getEnabled()
|
||||
&& securityProps.isOauth2Active()) { // This checks loginMethod
|
||||
if (oauth != null && oauth.getEnabled()) {
|
||||
if (oauth.isSettingsValid()) {
|
||||
String firstChar = String.valueOf(oauth.getProvider().charAt(0));
|
||||
String clientName =
|
||||
@@ -204,7 +201,6 @@ public class ProprietaryUIDataController {
|
||||
}
|
||||
|
||||
SAML2 saml2 = securityProps.getSaml2();
|
||||
// Only add SAML2 providers if loginMethod allows it
|
||||
if (securityProps.isSaml2Active() && applicationProperties.getPremium().isEnabled()) {
|
||||
String samlIdp = saml2.getProvider();
|
||||
String saml2AuthenticationPath = "/saml2/authenticate/" + saml2.getRegistrationId();
|
||||
|
||||
+1
@@ -37,6 +37,7 @@ import stirling.software.proprietary.service.SignatureService;
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/proprietary/signatures")
|
||||
@RequiredArgsConstructor
|
||||
@PreAuthorize("isAuthenticated()")
|
||||
public class SignatureController {
|
||||
|
||||
private final SignatureService signatureService;
|
||||
|
||||
+30
-62
@@ -163,13 +163,12 @@ public class AdminSettingsController {
|
||||
responseCode = "500",
|
||||
description = "Failed to save settings to configuration file")
|
||||
})
|
||||
public ResponseEntity<Map<String, Object>> updateSettings(
|
||||
public ResponseEntity<String> updateSettings(
|
||||
@Valid @RequestBody UpdateSettingsRequest request) {
|
||||
try {
|
||||
Map<String, Object> settings = request.getSettings();
|
||||
if (settings == null || settings.isEmpty()) {
|
||||
return ResponseEntity.badRequest()
|
||||
.body(Map.of("error", "No settings provided to update"));
|
||||
return ResponseEntity.badRequest().body("No settings provided to update");
|
||||
}
|
||||
|
||||
int updatedCount = 0;
|
||||
@@ -179,11 +178,7 @@ public class AdminSettingsController {
|
||||
|
||||
if (!isValidSettingKey(key)) {
|
||||
return ResponseEntity.badRequest()
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Invalid setting key format: "
|
||||
+ HtmlUtils.htmlEscape(key)));
|
||||
.body("Invalid setting key format: " + HtmlUtils.htmlEscape(key));
|
||||
}
|
||||
|
||||
log.info("Admin updating setting: {} = {}", key, value);
|
||||
@@ -196,26 +191,22 @@ public class AdminSettingsController {
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(
|
||||
Map.of(
|
||||
"message",
|
||||
String.format(
|
||||
"Successfully updated %d setting(s). Changes will take effect on"
|
||||
+ " application restart.",
|
||||
updatedCount)));
|
||||
String.format(
|
||||
"Successfully updated %d setting(s). Changes will take effect on"
|
||||
+ " application restart.",
|
||||
updatedCount));
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("Failed to save settings to file: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Map.of("error", GENERIC_FILE_ERROR));
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(GENERIC_FILE_ERROR);
|
||||
|
||||
} catch (IllegalArgumentException e) {
|
||||
log.error("Invalid setting key or value: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", GENERIC_INVALID_SETTING));
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(GENERIC_INVALID_SETTING);
|
||||
} catch (Exception e) {
|
||||
log.error("Unexpected error while updating settings: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Map.of("error", GENERIC_SERVER_ERROR));
|
||||
.body(GENERIC_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,23 +283,20 @@ public class AdminSettingsController {
|
||||
description = "Access denied - Admin role required"),
|
||||
@ApiResponse(responseCode = "500", description = "Failed to save settings")
|
||||
})
|
||||
public ResponseEntity<Map<String, Object>> updateSettingsSection(
|
||||
public ResponseEntity<String> updateSettingsSection(
|
||||
@PathVariable String sectionName, @Valid @RequestBody Map<String, Object> sectionData) {
|
||||
try {
|
||||
if (sectionData == null || sectionData.isEmpty()) {
|
||||
return ResponseEntity.badRequest()
|
||||
.body(Map.of("error", "No section data provided to update"));
|
||||
return ResponseEntity.badRequest().body("No section data provided to update");
|
||||
}
|
||||
|
||||
if (!isValidSectionName(sectionName)) {
|
||||
return ResponseEntity.badRequest()
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Invalid section name: "
|
||||
+ HtmlUtils.htmlEscape(sectionName)
|
||||
+ ". Valid sections: "
|
||||
+ String.join(", ", VALID_SECTION_NAMES)));
|
||||
"Invalid section name: "
|
||||
+ HtmlUtils.htmlEscape(sectionName)
|
||||
+ ". Valid sections: "
|
||||
+ String.join(", ", VALID_SECTION_NAMES));
|
||||
}
|
||||
|
||||
// Auto-enable premium features if license key is provided
|
||||
@@ -329,11 +317,7 @@ public class AdminSettingsController {
|
||||
|
||||
if (!isValidSettingKey(fullKey)) {
|
||||
return ResponseEntity.badRequest()
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Invalid setting key format: "
|
||||
+ HtmlUtils.htmlEscape(fullKey)));
|
||||
.body("Invalid setting key format: " + HtmlUtils.htmlEscape(fullKey));
|
||||
}
|
||||
|
||||
log.info("Admin updating section setting: {} = {}", fullKey, value);
|
||||
@@ -347,25 +331,21 @@ public class AdminSettingsController {
|
||||
|
||||
String escapedSectionName = HtmlUtils.htmlEscape(sectionName);
|
||||
return ResponseEntity.ok(
|
||||
Map.of(
|
||||
"message",
|
||||
String.format(
|
||||
"Successfully updated %d setting(s) in section '%s'. Changes will take"
|
||||
+ " effect on application restart.",
|
||||
updatedCount, escapedSectionName)));
|
||||
String.format(
|
||||
"Successfully updated %d setting(s) in section '%s'. Changes will take"
|
||||
+ " effect on application restart.",
|
||||
updatedCount, escapedSectionName));
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("Failed to save section settings to file: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Map.of("error", GENERIC_FILE_ERROR));
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(GENERIC_FILE_ERROR);
|
||||
} catch (IllegalArgumentException e) {
|
||||
log.error("Invalid section data: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", GENERIC_INVALID_SECTION));
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(GENERIC_INVALID_SECTION);
|
||||
} catch (Exception e) {
|
||||
log.error("Unexpected error while updating section settings: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Map.of("error", GENERIC_SERVER_ERROR));
|
||||
.body(GENERIC_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -473,7 +453,7 @@ public class AdminSettingsController {
|
||||
description = "Access denied - Admin role required"),
|
||||
@ApiResponse(responseCode = "500", description = "Failed to initiate restart")
|
||||
})
|
||||
public ResponseEntity<Map<String, Object>> restartApplication() {
|
||||
public ResponseEntity<String> restartApplication() {
|
||||
try {
|
||||
log.warn("Admin initiated application restart");
|
||||
|
||||
@@ -485,18 +465,13 @@ public class AdminSettingsController {
|
||||
log.error("Cannot restart: not running from JAR (likely development mode)");
|
||||
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Restart not available in development mode. Please restart the application manually."));
|
||||
"Restart not available in development mode. Please restart the application manually.");
|
||||
}
|
||||
|
||||
if (helperJar == null || !Files.isRegularFile(helperJar)) {
|
||||
log.error("Cannot restart: restart-helper.jar not found at expected location");
|
||||
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Restart helper not found. Cannot perform application restart."));
|
||||
.body("Restart helper not found. Please restart the application manually.");
|
||||
}
|
||||
|
||||
// Get current application arguments
|
||||
@@ -551,17 +526,12 @@ public class AdminSettingsController {
|
||||
.start();
|
||||
|
||||
return ResponseEntity.ok(
|
||||
Map.of(
|
||||
"message",
|
||||
"Application restart initiated. The server will be back online shortly."));
|
||||
"Application restart initiated. The server will be back online shortly.");
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to initiate restart: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Failed to initiate application restart: " + e.getMessage()));
|
||||
.body("Failed to initiate application restart: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +551,6 @@ public class AdminSettingsController {
|
||||
case "processexecutor", "processExecutor" -> applicationProperties.getProcessExecutor();
|
||||
case "autopipeline", "autoPipeline" -> applicationProperties.getAutoPipeline();
|
||||
case "legal" -> applicationProperties.getLegal();
|
||||
case "telegram" -> applicationProperties.getTelegram();
|
||||
default -> null;
|
||||
};
|
||||
}
|
||||
@@ -603,8 +572,7 @@ public class AdminSettingsController {
|
||||
"processexecutor",
|
||||
"autoPipeline",
|
||||
"autopipeline",
|
||||
"legal",
|
||||
"telegram");
|
||||
"legal");
|
||||
|
||||
// Pattern to validate safe property paths - only alphanumeric, dots, and underscores
|
||||
private static final Pattern SAFE_KEY_PATTERN =
|
||||
|
||||
-13
@@ -21,7 +21,6 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.proprietary.audit.AuditEventType;
|
||||
import stirling.software.proprietary.audit.AuditLevel;
|
||||
import stirling.software.proprietary.audit.Audited;
|
||||
@@ -45,7 +44,6 @@ public class AuthController {
|
||||
private final JwtServiceInterface jwtService;
|
||||
private final CustomUserDetailsService userDetailsService;
|
||||
private final LoginAttemptService loginAttemptService;
|
||||
private final ApplicationProperties.Security securityProperties;
|
||||
|
||||
/**
|
||||
* Login endpoint - replaces Supabase signInWithPassword
|
||||
@@ -62,17 +60,6 @@ public class AuthController {
|
||||
HttpServletRequest httpRequest,
|
||||
HttpServletResponse response) {
|
||||
try {
|
||||
// Check if username/password authentication is allowed
|
||||
if (!securityProperties.isUserPass()) {
|
||||
log.warn(
|
||||
"Username/password login attempted but not allowed by current login method configuration");
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"Username/password authentication is not enabled. Please use the configured authentication method."));
|
||||
}
|
||||
|
||||
// Validate input parameters
|
||||
if (request.getUsername() == null || request.getUsername().trim().isEmpty()) {
|
||||
log.warn("Login attempt with null or empty username");
|
||||
|
||||
+8
-12
@@ -741,35 +741,31 @@ public class UserController {
|
||||
|
||||
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
||||
@PostMapping("/get-api-key")
|
||||
public ResponseEntity<Map<String, String>> getApiKey(Principal principal) {
|
||||
public ResponseEntity<String> getApiKey(Principal principal) {
|
||||
if (principal == null) {
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN)
|
||||
.body(Map.of("error", "User not authenticated."));
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated.");
|
||||
}
|
||||
String username = principal.getName();
|
||||
String apiKey = userService.getApiKeyForUser(username);
|
||||
if (apiKey == null) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", "API key not found for user."));
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("API key not found for user.");
|
||||
}
|
||||
return ResponseEntity.ok(Map.of("apiKey", apiKey));
|
||||
return ResponseEntity.ok(apiKey);
|
||||
}
|
||||
|
||||
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
||||
@PostMapping("/update-api-key")
|
||||
public ResponseEntity<Map<String, String>> updateApiKey(Principal principal) {
|
||||
public ResponseEntity<String> updateApiKey(Principal principal) {
|
||||
if (principal == null) {
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN)
|
||||
.body(Map.of("error", "User not authenticated."));
|
||||
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated.");
|
||||
}
|
||||
String username = principal.getName();
|
||||
User user = userService.refreshApiKeyForUser(username);
|
||||
String apiKey = user.getApiKey();
|
||||
if (apiKey == null) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", "API key not found for user."));
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("API key not found for user.");
|
||||
}
|
||||
return ResponseEntity.ok(Map.of("apiKey", apiKey));
|
||||
return ResponseEntity.ok(apiKey);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+9
-123
@@ -14,8 +14,6 @@ plugins {
|
||||
import com.github.jk1.license.render.*
|
||||
import groovy.json.JsonOutput
|
||||
import groovy.json.JsonSlurper
|
||||
import groovy.xml.XmlSlurper
|
||||
import org.gradle.api.tasks.testing.Test
|
||||
|
||||
ext {
|
||||
springBootVersion = "3.5.7"
|
||||
@@ -62,7 +60,7 @@ repositories {
|
||||
|
||||
allprojects {
|
||||
group = 'stirling.software'
|
||||
version = '2.3.0'
|
||||
version = '2.2.0'
|
||||
|
||||
configurations.configureEach {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
@@ -185,142 +183,30 @@ subprojects {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("compileJava", JavaCompile).configure {
|
||||
options.compilerArgs.add("-parameters")
|
||||
compileJava {
|
||||
options.compilerArgs << "-parameters"
|
||||
}
|
||||
|
||||
def jacocoReport = tasks.named("jacocoTestReport")
|
||||
|
||||
tasks.withType(Test).configureEach {
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
finalizedBy(jacocoReport)
|
||||
finalizedBy jacocoTestReport
|
||||
}
|
||||
|
||||
jacocoReport.configure {
|
||||
dependsOn(tasks.named("test"))
|
||||
jacocoTestReport {
|
||||
dependsOn test
|
||||
reports {
|
||||
xml.required.set(true)
|
||||
csv.required.set(false)
|
||||
html.required.set(true)
|
||||
}
|
||||
doLast {
|
||||
def xmlReport = reports.xml.outputLocation.get().asFile
|
||||
if (!xmlReport.exists()) {
|
||||
logger.lifecycle("Jacoco coverage report not found at ${xmlReport}")
|
||||
return
|
||||
}
|
||||
|
||||
def xmlContent = xmlReport.getText("UTF-8")
|
||||
xmlContent = xmlContent.replaceFirst('(?s)<!DOCTYPE.*?>', '')
|
||||
def report = new XmlSlurper(false, false).parseText(xmlContent)
|
||||
def counters = report.counter.collectEntries { counter ->
|
||||
def type = counter.@type.text()
|
||||
def covered = counter.@covered.text() as BigDecimal
|
||||
def missed = counter.@missed.text() as BigDecimal
|
||||
[(type): [covered: covered, missed: missed]]
|
||||
}
|
||||
|
||||
def thresholds = [
|
||||
LINE : 0.16,
|
||||
INSTRUCTION: 0.14,
|
||||
BRANCH : 0.09
|
||||
]
|
||||
|
||||
def types = ["LINE", "INSTRUCTION", "BRANCH"]
|
||||
def headers = ["Metric", "Coverage", "Covered/Total", "Status", "Target"]
|
||||
|
||||
def rows = types.collect { String type ->
|
||||
def data = counters[type]
|
||||
if (!data) {
|
||||
return [type, "—", "—", "No data", ""]
|
||||
}
|
||||
|
||||
def total = data.covered + data.missed
|
||||
if (total == 0) {
|
||||
return [type, "—", "0/${total.toBigInteger()}", "No executions", ""]
|
||||
}
|
||||
|
||||
def ratio = data.covered / total * 100
|
||||
def coverageText = String.format(Locale.ROOT, "%.2f%%", ratio)
|
||||
def coveredText = String.format(Locale.ROOT, "%d/%d",
|
||||
data.covered.toBigInteger(),
|
||||
total.toBigInteger())
|
||||
|
||||
def threshold = thresholds[type]
|
||||
def thresholdPercent = threshold != null ? threshold * 100 : null
|
||||
def targetText = thresholdPercent != null ?
|
||||
String.format(Locale.ROOT, ">= %.2f%%", thresholdPercent) : ""
|
||||
def passed = thresholdPercent != null ? ratio >= thresholdPercent : null
|
||||
def statusText = passed == null ? "" : (passed ? "PASS" : "FAIL")
|
||||
|
||||
return [type, coverageText, coveredText, statusText, targetText]
|
||||
}
|
||||
|
||||
def columnIndexes = (0..<headers.size())
|
||||
def columnWidths = columnIndexes.collect { idx ->
|
||||
Math.max(headers[idx].length(), rows.collect { row ->
|
||||
row[idx] != null ? row[idx].toString().length() : 0
|
||||
}.max() ?: 0)
|
||||
}
|
||||
|
||||
def formatRow = { List<String> values ->
|
||||
columnIndexes.collect { idx ->
|
||||
def value = values[idx] ?: ""
|
||||
value.padRight(columnWidths[idx])
|
||||
}.join(" | ")
|
||||
}
|
||||
|
||||
def separator = columnIndexes.collect { idx ->
|
||||
''.padRight(columnWidths[idx], '-')
|
||||
}.join("-+-")
|
||||
|
||||
logger.lifecycle("")
|
||||
logger.lifecycle("==== JaCoCo Coverage Summary ====")
|
||||
logger.lifecycle(formatRow(headers))
|
||||
logger.lifecycle(separator)
|
||||
rows.each { row ->
|
||||
logger.lifecycle(formatRow(row))
|
||||
}
|
||||
logger.lifecycle(separator)
|
||||
|
||||
def htmlReport = reports.html.outputLocation.get().asFile
|
||||
logger.lifecycle("Detailed HTML report available at: ${htmlReport}")
|
||||
if (rows.any { it[3] == "FAIL" }) {
|
||||
logger.lifecycle("Some coverage targets were missed. Please review the detailed report above.")
|
||||
} else if (rows.any { it[3] == "PASS" }) {
|
||||
logger.lifecycle("Great job! All tracked coverage metrics meet their targets.")
|
||||
}
|
||||
logger.lifecycle("=================================\n")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("build") {
|
||||
dependsOn jacocoReport
|
||||
}
|
||||
|
||||
jacocoTestCoverageVerification {
|
||||
dependsOn jacocoReport
|
||||
dependsOn jacocoTestReport
|
||||
violationRules {
|
||||
rule {
|
||||
enabled = true
|
||||
element = 'BUNDLE'
|
||||
// Bytecode-Anweisungen abgedeckt
|
||||
limit {
|
||||
counter = 'INSTRUCTION'
|
||||
value = 'COVEREDRATIO'
|
||||
minimum = 0.14
|
||||
}
|
||||
// wie viele Quellcode-Zeilen abgedeckt
|
||||
limit {
|
||||
counter = 'LINE'
|
||||
value = 'COVEREDRATIO'
|
||||
minimum = 0.16
|
||||
}
|
||||
// Verzweigungen (if/else, switch) abgedeckt; misst Logik-Abdeckung
|
||||
limit {
|
||||
counter = 'BRANCH'
|
||||
value = 'COVEREDRATIO'
|
||||
minimum = 0.09
|
||||
minimum = 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Supports MODE parameter: BOTH (default), FRONTEND, BACKEND
|
||||
|
||||
# Stage 1: Build Frontend
|
||||
FROM node:20-alpine@sha256:658d0f63e501824d6c23e06d4bb95c71e7d704537c9d9272f488ac03a370d448 AS frontend-build
|
||||
FROM node:20-alpine AS frontend-build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -15,7 +15,7 @@ COPY frontend .
|
||||
RUN DISABLE_ADDITIONAL_FEATURES=false VITE_API_BASE_URL=/ npm run build
|
||||
|
||||
# Stage 2: Build Backend (server-only JAR - no UI)
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS backend-build
|
||||
FROM gradle:8.14-jdk21 AS backend-build
|
||||
|
||||
COPY build.gradle .
|
||||
COPY settings.gradle .
|
||||
@@ -35,7 +35,7 @@ RUN DISABLE_ADDITIONAL_FEATURES=false \
|
||||
./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube
|
||||
|
||||
# Stage 3: Final unified image
|
||||
FROM alpine:3.22.1@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1
|
||||
FROM alpine:3.22.1
|
||||
|
||||
ARG VERSION_TAG
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Supports MODE parameter: BOTH (default), FRONTEND, BACKEND
|
||||
|
||||
# Stage 1: Build Frontend
|
||||
FROM node:20-alpine@sha256:658d0f63e501824d6c23e06d4bb95c71e7d704537c9d9272f488ac03a370d448 AS frontend-build
|
||||
FROM node:20-alpine AS frontend-build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -15,7 +15,7 @@ COPY frontend .
|
||||
RUN DISABLE_ADDITIONAL_FEATURES=true VITE_API_BASE_URL=/ npm run build
|
||||
|
||||
# Stage 2: Build Backend
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS backend-build
|
||||
FROM gradle:8.14-jdk21 AS backend-build
|
||||
|
||||
COPY build.gradle .
|
||||
COPY settings.gradle .
|
||||
@@ -34,7 +34,7 @@ RUN DISABLE_ADDITIONAL_FEATURES=true \
|
||||
./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube
|
||||
|
||||
# Stage 3: Final unified ultra-lite image
|
||||
FROM alpine:3.22.1@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1
|
||||
FROM alpine:3.22.1
|
||||
|
||||
ARG VERSION_TAG
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# ========================================
|
||||
# STAGE 1: Build stage - Alpine with Gradle
|
||||
# ========================================
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
COPY build.gradle .
|
||||
COPY settings.gradle .
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# ========================================
|
||||
# STAGE 1: Build stage - Gradle
|
||||
# ========================================
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
COPY build.gradle .
|
||||
COPY settings.gradle .
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# ========================================
|
||||
# STAGE 1: Build stage - Gradle
|
||||
# ========================================
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
COPY build.gradle .
|
||||
COPY settings.gradle .
|
||||
@@ -27,7 +27,7 @@ RUN DISABLE_ADDITIONAL_FEATURES=true \
|
||||
# ========================================
|
||||
# STAGE 2: Runtime stage - Alpine minimal
|
||||
# ========================================
|
||||
FROM alpine:3.23.2@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
|
||||
FROM alpine:3.22.2@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412
|
||||
|
||||
ARG VERSION_TAG
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Single JAR contains both frontend and backend
|
||||
|
||||
# Stage 1: Build application with embedded frontend
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
# Install Node.js and npm for frontend build
|
||||
RUN apt-get update && apt-get install -y \
|
||||
@@ -37,14 +37,11 @@ RUN DISABLE_ADDITIONAL_FEATURES=false \
|
||||
|
||||
# Stage 2: Runtime image based on Debian stable-slim
|
||||
# Contains Java runtime + LibreOffice + Calibre + all PDF tools
|
||||
FROM debian:stable-slim@sha256:f6681102cd18b4c0c4720a77b602498f4bdcf701c8fc02776dfb0d4c350c381f
|
||||
FROM debian:stable-slim@sha256:1c25564b03942d874bf6a2b71f2062b71af8bc1475aa873c523e6f7c8fa29e60
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8
|
||||
|
||||
ENV TESS_BASE_PATH=/usr/share/tesseract-ocr/5/tessdata
|
||||
|
||||
# Install core runtime dependencies + tools required by Stirling-PDF features
|
||||
@@ -52,14 +49,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates tzdata tini bash fontconfig \
|
||||
openjdk-21-jre-headless \
|
||||
ffmpeg poppler-utils ocrmypdf imagemagick fontforge ghostscript \
|
||||
fonts-dejavu \
|
||||
fonts-liberation fonts-liberation2 \
|
||||
fonts-crosextra-caladea fonts-crosextra-carlito \
|
||||
fonts-linuxlibertine \
|
||||
fonts-noto-core fonts-noto-cjk fonts-noto-mono fonts-noto-ui-core \
|
||||
fonts-noto-color-emoji \
|
||||
ttf-wqy-zenhei \
|
||||
fonts-arphic-ukai fonts-arphic-uming \
|
||||
libreoffice-nogui libreoffice-java-common \
|
||||
python3 python3-venv python3-uno \
|
||||
tesseract-ocr tesseract-ocr-eng tesseract-ocr-deu tesseract-ocr-fra \
|
||||
tesseract-ocr-por tesseract-ocr-chi-sim \
|
||||
@@ -85,15 +75,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
&& apt-get autoremove -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN set -eux; \
|
||||
. /etc/os-release; \
|
||||
echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" > /etc/apt/sources.list.d/backports.list; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends -t ${VERSION_CODENAME}-backports \
|
||||
libreoffice libreoffice-java-common; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
libreoffice --version
|
||||
|
||||
# Make ebook-convert available in PATH
|
||||
RUN ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert \
|
||||
&& /opt/calibre/ebook-convert --version
|
||||
@@ -159,7 +140,6 @@ ENV VERSION_TAG=$VERSION_TAG \
|
||||
PGID=${PGID} \
|
||||
UMASK=022 \
|
||||
UNO_PATH=/usr/lib/libreoffice/program \
|
||||
LIBREOFFICE_BIN_PATH=/usr/lib/libreoffice/program/soffice.bin \
|
||||
STIRLING_TEMPFILES_DIRECTORY=/tmp/stirling-pdf \
|
||||
TMPDIR=/tmp/stirling-pdf \
|
||||
TEMP=/tmp/stirling-pdf \
|
||||
@@ -173,9 +153,8 @@ RUN python3 -m venv /opt/venv --system-site-packages \
|
||||
&& /opt/venv/bin/python -c "import cv2; print('OpenCV version:', cv2.__version__)"
|
||||
|
||||
# Separate venv for unoserver (keeps it isolated)
|
||||
ARG UNOSERVER_VERSION=3.6
|
||||
RUN python3 -m venv /opt/unoserver-venv --system-site-packages \
|
||||
&& /opt/unoserver-venv/bin/pip install --no-cache-dir "unoserver==${UNOSERVER_VERSION}"
|
||||
&& /opt/unoserver-venv/bin/pip install --no-cache-dir unoserver
|
||||
|
||||
# Make unoserver tools available in main venv PATH
|
||||
RUN ln -sf /opt/unoserver-venv/bin/unoconvert /opt/venv/bin/unoconvert \
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Single JAR contains both frontend and backend with extra fonts for air-gapped environments
|
||||
|
||||
# Stage 1: Build application with embedded frontend
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
# Install Node.js and npm for frontend build
|
||||
RUN apt-get update && apt-get install -y \
|
||||
@@ -37,14 +37,11 @@ RUN DISABLE_ADDITIONAL_FEATURES=false \
|
||||
|
||||
# Stage 2: Runtime image based on Debian stable-slim
|
||||
# Contains Java runtime + LibreOffice + Calibre + all PDF tools + extra fonts for air-gapped environments
|
||||
FROM debian:stable-slim@sha256:f6681102cd18b4c0c4720a77b602498f4bdcf701c8fc02776dfb0d4c350c381f
|
||||
FROM debian:stable-slim@sha256:1c25564b03942d874bf6a2b71f2062b71af8bc1475aa873c523e6f7c8fa29e60
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8
|
||||
|
||||
ENV TESS_BASE_PATH=/usr/share/tesseract-ocr/5/tessdata
|
||||
|
||||
# Install core runtime dependencies + tools required by Stirling-PDF features + extra fonts for fat version
|
||||
@@ -52,20 +49,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates tzdata tini bash fontconfig \
|
||||
openjdk-21-jre-headless \
|
||||
ffmpeg poppler-utils ocrmypdf imagemagick fontforge ghostscript \
|
||||
fonts-dejavu \
|
||||
fonts-liberation fonts-liberation2 \
|
||||
fonts-crosextra-caladea fonts-crosextra-carlito \
|
||||
fonts-linuxlibertine \
|
||||
fonts-noto-core fonts-noto-cjk fonts-noto-mono fonts-noto-ui-core \
|
||||
fonts-noto-color-emoji \
|
||||
ttf-wqy-zenhei \
|
||||
fonts-arphic-ukai fonts-arphic-uming \
|
||||
fonts-freefont-ttf fonts-terminus \
|
||||
libreoffice-nogui libreoffice-java-common \
|
||||
python3 python3-venv python3-uno \
|
||||
tesseract-ocr tesseract-ocr-eng tesseract-ocr-deu tesseract-ocr-fra \
|
||||
tesseract-ocr-por tesseract-ocr-chi-sim \
|
||||
libcairo2 libpango-1.0-0 libpangoft2-1.0-0 libgdk-pixbuf-2.0-0 \
|
||||
gosu unpaper qpdf \
|
||||
# Extra fonts for fat/air-gapped version
|
||||
fonts-dejavu fonts-liberation fonts-noto fonts-noto-cjk fonts-noto-color-emoji \
|
||||
fonts-freefont-ttf fonts-terminus fonts-linuxlibertine \
|
||||
# AWT headless support (required for some Java graphics operations)
|
||||
libfreetype6 libfontconfig1 libx11-6 libxt6 libxext6 libxrender1 libxtst6 libxi6 \
|
||||
libxinerama1 libxkbcommon0 libxkbfile1 libsm6 libice6 \
|
||||
@@ -86,15 +78,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
&& apt-get autoremove -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN set -eux; \
|
||||
. /etc/os-release; \
|
||||
echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" > /etc/apt/sources.list.d/backports.list; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends -t ${VERSION_CODENAME}-backports \
|
||||
libreoffice libreoffice-java-common; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
libreoffice --version
|
||||
|
||||
# Make ebook-convert available in PATH
|
||||
RUN ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert \
|
||||
&& /opt/calibre/ebook-convert --version
|
||||
@@ -162,7 +145,6 @@ ENV VERSION_TAG=$VERSION_TAG \
|
||||
FAT_DOCKER=true \
|
||||
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
|
||||
UNO_PATH=/usr/lib/libreoffice/program \
|
||||
LIBREOFFICE_BIN_PATH=/usr/lib/libreoffice/program/soffice.bin \
|
||||
STIRLING_TEMPFILES_DIRECTORY=/tmp/stirling-pdf \
|
||||
TMPDIR=/tmp/stirling-pdf \
|
||||
TEMP=/tmp/stirling-pdf \
|
||||
@@ -176,9 +158,8 @@ RUN python3 -m venv /opt/venv --system-site-packages \
|
||||
&& /opt/venv/bin/python -c "import cv2; print('OpenCV version:', cv2.__version__)"
|
||||
|
||||
# Separate venv for unoserver (keeps it isolated)
|
||||
ARG UNOSERVER_VERSION=3.6
|
||||
RUN python3 -m venv /opt/unoserver-venv --system-site-packages \
|
||||
&& /opt/unoserver-venv/bin/pip install --no-cache-dir "unoserver==${UNOSERVER_VERSION}"
|
||||
&& /opt/unoserver-venv/bin/pip install --no-cache-dir unoserver
|
||||
|
||||
# Make unoserver tools available in main venv PATH
|
||||
RUN ln -sf /opt/unoserver-venv/bin/unoconvert /opt/venv/bin/unoconvert \
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Single JAR contains both frontend and backend with minimal dependencies
|
||||
|
||||
# Stage 1: Build application with embedded frontend
|
||||
FROM gradle:8.14-jdk21@sha256:051d9a116793bdc5175a3f97a545718b750489eee85a7da20913c8a53f722a72 AS build
|
||||
FROM gradle:8.14-jdk21 AS build
|
||||
|
||||
# Install Node.js and npm for frontend build
|
||||
RUN apt-get update && apt-get install -y \
|
||||
@@ -36,10 +36,7 @@ RUN DISABLE_ADDITIONAL_FEATURES=true \
|
||||
./gradlew clean build -PbuildWithFrontend=true -x spotlessApply -x spotlessCheck -x test -x sonarqube
|
||||
|
||||
# Stage 2: Runtime image
|
||||
FROM alpine:3.23.2@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
|
||||
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8
|
||||
FROM alpine:3.22.1
|
||||
|
||||
ARG VERSION_TAG
|
||||
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
# Stirling-PDF with Remote UNO Servers
|
||||
|
||||
This docker-compose configuration demonstrates running Stirling-PDF with **separate UNO server containers** for LibreOffice document conversion, enabling horizontal scaling and better resource isolation.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ Stirling-PDF │
|
||||
│ (Main App) │
|
||||
│ │
|
||||
│ Uses BlockingQueue │
|
||||
│ pool to distribute │
|
||||
│ load across servers │
|
||||
└──────┬──────┬───────┘
|
||||
│ │
|
||||
│ │ Remote endpoints
|
||||
│ │ (hostLocation: remote)
|
||||
│ │
|
||||
┌───▼──┐ ┌─▼────┐
|
||||
│ UNO │ │ UNO │
|
||||
│ #1 │ │ #2 │
|
||||
│:2002 │ │:2002 │
|
||||
└──────┘ └──────┘
|
||||
```
|
||||
|
||||
## Key Features Demonstrated
|
||||
|
||||
### 1. Remote UNO Server Configuration
|
||||
- **hostLocation: "remote"** - Required for cross-container communication
|
||||
- **BlockingQueue pool** - Optimal endpoint selection under load
|
||||
- **Health checks** - Each UNO server has `unoping` health check
|
||||
|
||||
### 2. Environment Variable Configuration
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_AUTO_UNO_SERVER: "false" # Disable local servers
|
||||
|
||||
# Define remote endpoints (Spring Boot list syntax)
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_HOST: "unoserver1"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_PORT: "2002"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_HOST_LOCATION: "remote" # Critical!
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_PROTOCOL: "http"
|
||||
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_HOST: "unoserver2"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_PORT: "2002"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_HOST_LOCATION: "remote"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_PROTOCOL: "http"
|
||||
```
|
||||
|
||||
### 3. Session Limit
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT: "2"
|
||||
```
|
||||
Should match endpoint count for optimal concurrency.
|
||||
|
||||
## Usage
|
||||
|
||||
### Start the Stack
|
||||
```bash
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml up -d
|
||||
```
|
||||
|
||||
### Monitor Logs
|
||||
```bash
|
||||
# Watch all services
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml logs -f
|
||||
|
||||
# Watch just UNO servers
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml logs -f unoserver1 unoserver2
|
||||
|
||||
# Watch main app
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml logs -f stirling-pdf
|
||||
```
|
||||
|
||||
### Health Check Status
|
||||
```bash
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml ps
|
||||
```
|
||||
|
||||
Should show all services healthy:
|
||||
```
|
||||
NAME STATUS
|
||||
Stirling-PDF-Security-Remote-UNO Up (healthy)
|
||||
UNO-Server-1 Up (healthy)
|
||||
UNO-Server-2 Up (healthy)
|
||||
```
|
||||
|
||||
### Test Conversion Load Distribution
|
||||
Upload multiple documents for conversion and watch the logs - you'll see requests distributed across both UNO servers via the BlockingQueue pool.
|
||||
|
||||
## Scaling UNO Servers
|
||||
|
||||
### Add More Servers
|
||||
To add a 3rd UNO server:
|
||||
|
||||
1. Add service to compose file:
|
||||
```yaml
|
||||
unoserver3:
|
||||
container_name: UNO-Server-3
|
||||
image: ghcr.io/unoconv/unoserver-docker:0.4.4
|
||||
# ... same config as unoserver1/2
|
||||
```
|
||||
|
||||
2. Add environment variables to stirling-pdf service:
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_2_HOST: "unoserver3"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_2_PORT: "2002"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_2_HOST_LOCATION: "remote"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_2_PROTOCOL: "http"
|
||||
PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT: "3" # Update!
|
||||
```
|
||||
|
||||
3. Add to `depends_on`:
|
||||
```yaml
|
||||
depends_on:
|
||||
unoserver1:
|
||||
condition: service_healthy
|
||||
unoserver2:
|
||||
condition: service_healthy
|
||||
unoserver3:
|
||||
condition: service_healthy
|
||||
```
|
||||
|
||||
### Scale with Docker Compose (Alternative)
|
||||
```bash
|
||||
docker compose -f docker-compose-latest-security-remote-uno.yml up -d --scale unoserver1=3
|
||||
```
|
||||
Note: This requires removing `container_name` and hardcoded ports.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Connection refused" errors
|
||||
- **Cause**: `hostLocation: "auto"` or missing
|
||||
- **Fix**: Set `HOSTLOCATION: "remote"` for all endpoints
|
||||
|
||||
### Conversions using only one server
|
||||
- **Cause**: Session limit too low or not matching endpoint count
|
||||
- **Fix**: Set `PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT` to match endpoint count
|
||||
|
||||
### UNO server not starting
|
||||
- **Check**: `docker compose logs unoserver1`
|
||||
- **Common**: LibreOffice profile corruption
|
||||
- **Fix**: `docker compose down -v` (removes volumes)
|
||||
|
||||
## Comparison: Local vs Remote UNO Servers
|
||||
|
||||
### Local (Auto) Mode
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_AUTO_UNO_SERVER: "true"
|
||||
PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT: "2"
|
||||
# Creates 2 servers on 127.0.0.1:2003, 127.0.0.1:2005 inside container (Stirling-PDF's own servers)
|
||||
```
|
||||
- ✅ Simpler configuration
|
||||
- ✅ Lower latency
|
||||
- ❌ All in one container (resource competition)
|
||||
- ❌ Can't scale independently
|
||||
|
||||
### Remote Mode (This File)
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_AUTO_UNO_SERVER: "false"
|
||||
# Define external endpoints with hostLocation: "remote"
|
||||
```
|
||||
- ✅ Resource isolation (separate containers)
|
||||
- ✅ Independent scaling
|
||||
- ✅ Better resilience (restart one without affecting others)
|
||||
- ❌ Slightly higher network overhead
|
||||
- ❌ More complex configuration
|
||||
|
||||
## Advanced Configuration
|
||||
|
||||
### HTTPS UNO Servers
|
||||
If your UNO servers use HTTPS (e.g., behind a reverse proxy):
|
||||
```yaml
|
||||
PROCESS_EXECUTOR_UNOSERVERENDPOINTS_0_PROTOCOL: "https"
|
||||
```
|
||||
|
||||
### Custom Health Check Interval
|
||||
```yaml
|
||||
unoserver1:
|
||||
healthcheck:
|
||||
interval: 5s # Check more frequently
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
start_period: 60s # Give more startup time
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
To see detailed endpoint selection logs:
|
||||
```yaml
|
||||
environment:
|
||||
LOGGING_LEVEL_STIRLING_SOFTWARE_COMMON_UTIL_PROCESSEXECUTOR: DEBUG
|
||||
```
|
||||
|
||||
## What This Demonstrates
|
||||
|
||||
This configuration showcases all the improvements from the PR reviews:
|
||||
|
||||
1. ✅ **Remote endpoint support** (`hostLocation: "remote"`)
|
||||
2. ✅ **BlockingQueue pool** (optimal endpoint distribution)
|
||||
3. ✅ **Idempotent lease close** (thread-safe)
|
||||
4. ✅ **Robust health checks** (unoping → TCP → PID fallbacks)
|
||||
5. ✅ **Proper validation** (hostLocation/protocol normalized)
|
||||
6. ✅ **Session limit warnings** (logs mismatch if misconfigured)
|
||||
|
||||
## Performance Expectations
|
||||
|
||||
With 2 UNO servers, you can expect:
|
||||
- **2x concurrent conversions** vs single server
|
||||
- **~50% reduction in queue wait time** under load
|
||||
- **Better resilience**: One server failure = 50% capacity, not 0%
|
||||
|
||||
Tested with 100GB+ PDFs - BlockingQueue ensures no endpoint starvation.
|
||||
@@ -1,99 +0,0 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security-Remote-UNO
|
||||
image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest
|
||||
build:
|
||||
context: ../../..
|
||||
dockerfile: docker/embedded/Dockerfile
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"]
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 16
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- ../../../stirling/latest/data:/usr/share/tessdata:rw
|
||||
- ../../../stirling/latest/config:/configs:rw
|
||||
- ../../../stirling/latest/logs:/logs:rw
|
||||
- stirling-tmp:/tmp/stirling-pdf:rw
|
||||
environment:
|
||||
DISABLE_ADDITIONAL_FEATURES: "false"
|
||||
SECURITY_ENABLELOGIN: "false"
|
||||
# Disable auto UNO server (we're using remote servers instead)
|
||||
PROCESS_EXECUTOR_AUTO_UNO_SERVER: "false"
|
||||
# Configure remote UNO server pool
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_HOST: "unoserver1"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_PORT: "2003"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_HOST_LOCATION: "remote"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_0_PROTOCOL: "http"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_HOST: "unoserver2"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_PORT: "2003"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_HOST_LOCATION: "remote"
|
||||
PROCESS_EXECUTOR_UNO_SERVER_ENDPOINTS_1_PROTOCOL: "http"
|
||||
# Session limit should match endpoint count for optimal concurrency
|
||||
PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT: "2"
|
||||
PUID: 1002
|
||||
PGID: 1002
|
||||
UMASK: "022"
|
||||
SYSTEM_DEFAULTLOCALE: en-US
|
||||
UI_APPNAME: Stirling-PDF
|
||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security + Remote UNO Servers
|
||||
UI_APPNAMENAVBAR: Stirling-PDF Latest
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "true"
|
||||
SHOW_SURVEY: "true"
|
||||
depends_on:
|
||||
unoserver1:
|
||||
condition: service_healthy
|
||||
unoserver2:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- stirling-network
|
||||
restart: on-failure:5
|
||||
|
||||
unoserver1:
|
||||
container_name: UNO-Server-1
|
||||
# NOTE: This image needs to be updated to unoserver 3.6 to match Stirling-PDF's client version
|
||||
# Current :latest uses 3.4 which causes API mismatch errors
|
||||
image: ghcr.io/unoconv/unoserver-docker:latest
|
||||
volumes:
|
||||
- stirling-tmp:/tmp/stirling-pdf:rw
|
||||
expose:
|
||||
- "2003"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "timeout 2 bash -c 'cat < /dev/null > /dev/tcp/localhost/2003' || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
networks:
|
||||
- stirling-network
|
||||
restart: on-failure:5
|
||||
|
||||
unoserver2:
|
||||
container_name: UNO-Server-2
|
||||
# NOTE: This image needs to be updated to unoserver 3.6 to match Stirling-PDF's client version
|
||||
# Current :latest uses 3.4 which causes API mismatch errors
|
||||
image: ghcr.io/unoconv/unoserver-docker:latest
|
||||
volumes:
|
||||
- stirling-tmp:/tmp/stirling-pdf:rw
|
||||
expose:
|
||||
- "2003"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "timeout 2 bash -c 'cat < /dev/null > /dev/tcp/localhost/2003' || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
networks:
|
||||
- stirling-network
|
||||
restart: on-failure:5
|
||||
|
||||
networks:
|
||||
stirling-network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
stirling-tmp:
|
||||
@@ -1,35 +0,0 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security
|
||||
image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest
|
||||
build:
|
||||
context: ../../..
|
||||
dockerfile: docker/embedded/Dockerfile
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"]
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 16
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- ../../../stirling/latest/data:/usr/share/tessdata:rw
|
||||
- ../../../stirling/latest/config:/configs:rw
|
||||
- ../../../stirling/latest/logs:/logs:rw
|
||||
environment:
|
||||
DISABLE_ADDITIONAL_FEATURES: "false"
|
||||
SECURITY_ENABLELOGIN: "false"
|
||||
PROCESS_EXECUTOR_AUTO_UNO_SERVER: "true"
|
||||
PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT: "1"
|
||||
PUID: 1002
|
||||
PGID: 1002
|
||||
UMASK: "022"
|
||||
SYSTEM_DEFAULTLOCALE: en-US
|
||||
UI_APPNAME: Stirling-PDF
|
||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security
|
||||
UI_APPNAMENAVBAR: Stirling-PDF Latest
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "true"
|
||||
SHOW_SURVEY: "true"
|
||||
restart: on-failure:5
|
||||
@@ -1,5 +1,5 @@
|
||||
# Frontend Dockerfile - React/Vite application
|
||||
FROM node:25-alpine@sha256:f4769ca6eeb6ebbd15eb9c8233afed856e437b75f486f7fccaa81d7c8ad56007 AS build
|
||||
FROM node:20-alpine AS build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -16,7 +16,7 @@ COPY frontend .
|
||||
RUN npm run build
|
||||
|
||||
# Production stage
|
||||
FROM nginx:alpine@sha256:c083c3799197cfff91fe5c3c558db3d2eea65ccbbfd419fa42a64d2c39a24027
|
||||
FROM nginx:alpine
|
||||
|
||||
# Copy built files from build stage
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
|
||||
@@ -119,11 +119,6 @@ All modes support standard Stirling-PDF environment variables:
|
||||
- `SYSTEM_MAXFILESIZE` - Max upload size (MB)
|
||||
- `TESSERACT_LANGS` - Comma-separated OCR language codes
|
||||
- `JAVA_CUSTOM_OPTS` - Additional JVM options
|
||||
- `PROCESS_EXECUTOR_AUTO_UNO_SERVER` - Overrides `processExecutor.autoUnoServer` (true or false)
|
||||
- `PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT` - Overrides `processExecutor.sessionLimit.libreOfficeSessionLimit`
|
||||
- `UNO_SERVER_AUTO` - Legacy alias for `processExecutor.autoUnoServer`
|
||||
- `UNO_SERVER_COUNT` - Legacy alias for `processExecutor.sessionLimit.libreOfficeSessionLimit`
|
||||
- `UNO_SERVER_HEALTH_INTERVAL` - Seconds between unoserver PID checks (default: 30)
|
||||
|
||||
See full configuration docs at: https://docs.stirlingpdf.com
|
||||
|
||||
|
||||
+17
-220
@@ -14,36 +14,28 @@ echo "==================================="
|
||||
setup_ocr() {
|
||||
echo "Setting up OCR languages..."
|
||||
|
||||
# In Alpine, tesseract uses /usr/share/tessdata
|
||||
TESSDATA_DIR="/usr/share/tessdata"
|
||||
# Copy tessdata
|
||||
mkdir -p /usr/share/tessdata
|
||||
cp -rn /usr/share/tessdata-original/* /usr/share/tessdata 2>/dev/null || true
|
||||
|
||||
# Create tessdata directory
|
||||
mkdir -p "$TESSDATA_DIR"
|
||||
|
||||
# Restore system languages from backup (Dockerfile moved them to tessdata-original)
|
||||
if [ -d /usr/share/tessdata-original ]; then
|
||||
echo "Restoring system tessdata from backup..."
|
||||
cp -rn /usr/share/tessdata-original/* "$TESSDATA_DIR"/ 2>/dev/null || true
|
||||
if [ -d /usr/share/tesseract-ocr/4.00/tessdata ]; then
|
||||
cp -r /usr/share/tesseract-ocr/4.00/tessdata/* /usr/share/tessdata 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Note: If user mounted custom languages to /usr/share/tessdata, they'll be overlaid here.
|
||||
# The cp -rn above won't overwrite user files, just adds missing system files.
|
||||
if [ -d /usr/share/tesseract-ocr/5/tessdata ]; then
|
||||
cp -r /usr/share/tesseract-ocr/5/tessdata/* /usr/share/tessdata 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Install additional languages if specified
|
||||
if [ -n "$TESSERACT_LANGS" ]; then
|
||||
if [[ -n "$TESSERACT_LANGS" ]]; then
|
||||
SPACE_SEPARATED_LANGS=$(echo $TESSERACT_LANGS | tr ',' ' ')
|
||||
pattern='^[a-zA-Z]{2,4}(_[a-zA-Z]{2,4})?$'
|
||||
for LANG in $SPACE_SEPARATED_LANGS; do
|
||||
case "$LANG" in
|
||||
[a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z]_[a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z][a-zA-Z]_[a-zA-Z][a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]_[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z])
|
||||
apk add --no-cache "tesseract-ocr-data-$LANG" 2>/dev/null || true
|
||||
;;
|
||||
esac
|
||||
if [[ $LANG =~ $pattern ]]; then
|
||||
apk add --no-cache "tesseract-ocr-data-$LANG" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Point to the consolidated location
|
||||
export TESSDATA_PREFIX="$TESSDATA_DIR"
|
||||
echo "Using TESSDATA_PREFIX=$TESSDATA_PREFIX"
|
||||
}
|
||||
|
||||
# Function to setup user permissions (from init-without-ocr.sh)
|
||||
@@ -100,201 +92,6 @@ run_as_user() {
|
||||
fi
|
||||
}
|
||||
|
||||
run_with_timeout() {
|
||||
local secs=$1; shift
|
||||
if command -v timeout >/dev/null 2>&1; then
|
||||
timeout "${secs}s" "$@"
|
||||
else
|
||||
"$@"
|
||||
fi
|
||||
}
|
||||
|
||||
run_as_user_with_timeout() {
|
||||
local secs=$1; shift
|
||||
if command -v timeout >/dev/null 2>&1; then
|
||||
run_as_user timeout "${secs}s" "$@"
|
||||
else
|
||||
run_as_user "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
tcp_port_check() {
|
||||
local host=$1
|
||||
local port=$2
|
||||
local timeout_secs=${3:-5}
|
||||
|
||||
# Try nc first (most portable)
|
||||
if command -v nc >/dev/null 2>&1; then
|
||||
run_with_timeout "$timeout_secs" nc -z "$host" "$port" 2>/dev/null
|
||||
return $?
|
||||
fi
|
||||
|
||||
# Fallback to /dev/tcp (bash-specific)
|
||||
if [ -n "${BASH_VERSION:-}" ] && command -v bash >/dev/null 2>&1; then
|
||||
run_with_timeout "$timeout_secs" bash -c "exec 3<>/dev/tcp/${host}/${port}" 2>/dev/null
|
||||
local result=$?
|
||||
exec 3>&- 2>/dev/null || true
|
||||
return $result
|
||||
fi
|
||||
|
||||
# No TCP check method available
|
||||
return 2
|
||||
}
|
||||
|
||||
CONFIG_FILE=${CONFIG_FILE:-/configs/settings.yml}
|
||||
UNOSERVER_PIDS=()
|
||||
UNOSERVER_PORTS=()
|
||||
UNOSERVER_UNO_PORTS=()
|
||||
|
||||
read_setting_value() {
|
||||
local key=$1
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
return
|
||||
fi
|
||||
awk -F: -v key="$key" '
|
||||
$1 ~ "^[[:space:]]*"key"[[:space:]]*$" {
|
||||
val=$2
|
||||
sub(/#.*/, "", val)
|
||||
gsub(/^[[:space:]]+|[[:space:]]+$/, "", val)
|
||||
gsub(/^["'"'"']|["'"'"']$/, "", val)
|
||||
print val
|
||||
exit
|
||||
}
|
||||
' "$CONFIG_FILE"
|
||||
}
|
||||
|
||||
get_unoserver_auto() {
|
||||
if [ -n "${PROCESS_EXECUTOR_AUTO_UNO_SERVER:-}" ]; then
|
||||
echo "$PROCESS_EXECUTOR_AUTO_UNO_SERVER"
|
||||
return
|
||||
fi
|
||||
if [ -n "${UNO_SERVER_AUTO:-}" ]; then
|
||||
echo "$UNO_SERVER_AUTO"
|
||||
return
|
||||
fi
|
||||
read_setting_value "autoUnoServer"
|
||||
}
|
||||
|
||||
get_unoserver_count() {
|
||||
if [ -n "${PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT:-}" ]; then
|
||||
echo "$PROCESS_EXECUTOR_SESSION_LIMIT_LIBRE_OFFICE_SESSION_LIMIT"
|
||||
return
|
||||
fi
|
||||
if [ -n "${UNO_SERVER_COUNT:-}" ]; then
|
||||
echo "$UNO_SERVER_COUNT"
|
||||
return
|
||||
fi
|
||||
read_setting_value "libreOfficeSessionLimit"
|
||||
}
|
||||
|
||||
start_unoserver_instance() {
|
||||
local port=$1
|
||||
local uno_port=$2
|
||||
run_as_user /opt/venv/bin/unoserver --port "$port" --interface 127.0.0.1 --uno-port "$uno_port" &
|
||||
LAST_UNOSERVER_PID=$!
|
||||
}
|
||||
|
||||
start_unoserver_watchdog() {
|
||||
local interval=${UNO_SERVER_HEALTH_INTERVAL:-30}
|
||||
case "$interval" in
|
||||
''|*[!0-9]*) interval=30 ;;
|
||||
esac
|
||||
(
|
||||
while true; do
|
||||
local i=0
|
||||
while [ "$i" -lt "${#UNOSERVER_PIDS[@]}" ]; do
|
||||
local pid=${UNOSERVER_PIDS[$i]}
|
||||
local port=${UNOSERVER_PORTS[$i]}
|
||||
local uno_port=${UNOSERVER_UNO_PORTS[$i]}
|
||||
local needs_restart=false
|
||||
|
||||
# Check 1: PID exists
|
||||
if [ -z "$pid" ] || ! kill -0 "$pid" 2>/dev/null; then
|
||||
echo "unoserver PID ${pid} not found for port ${port}"
|
||||
needs_restart=true
|
||||
else
|
||||
# PID exists, now check if server is actually healthy
|
||||
local health_ok=false
|
||||
|
||||
# Check 2A: Health check with unoping (best - checks actual server health)
|
||||
if command -v unoping >/dev/null 2>&1; then
|
||||
if run_as_user_with_timeout 5 unoping --host 127.0.0.1 --port "$port" >/dev/null 2>&1; then
|
||||
health_ok=true
|
||||
else
|
||||
echo "unoserver health check failed (unoping) for port ${port}, trying TCP fallback"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check 2B: Fallback to TCP port check (verifies service is listening)
|
||||
if [ "$health_ok" = false ]; then
|
||||
tcp_port_check "127.0.0.1" "$port" 5
|
||||
local tcp_rc=$?
|
||||
if [ $tcp_rc -eq 0 ]; then
|
||||
health_ok=true
|
||||
elif [ $tcp_rc -eq 2 ]; then
|
||||
echo "No TCP check available; falling back to PID-only for port ${port}"
|
||||
health_ok=true
|
||||
else
|
||||
echo "unoserver TCP check failed for port ${port}"
|
||||
needs_restart=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$needs_restart" = true ]; then
|
||||
echo "Restarting unoserver on 127.0.0.1:${port} (uno-port ${uno_port})"
|
||||
# Kill the old process if it exists
|
||||
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
||||
kill -TERM "$pid" 2>/dev/null || true
|
||||
sleep 1
|
||||
kill -KILL "$pid" 2>/dev/null || true
|
||||
fi
|
||||
start_unoserver_instance "$port" "$uno_port"
|
||||
UNOSERVER_PIDS[$i]=$LAST_UNOSERVER_PID
|
||||
fi
|
||||
i=$((i + 1))
|
||||
done
|
||||
sleep "$interval"
|
||||
done
|
||||
) &
|
||||
}
|
||||
|
||||
start_unoserver_pool() {
|
||||
local auto
|
||||
auto="$(get_unoserver_auto)"
|
||||
auto="${auto,,}"
|
||||
if [ -z "$auto" ]; then
|
||||
auto="true"
|
||||
fi
|
||||
if [ "$auto" != "true" ]; then
|
||||
echo "Skipping local unoserver pool (autoUnoServer=$auto)"
|
||||
return
|
||||
fi
|
||||
|
||||
local count
|
||||
count="$(get_unoserver_count)"
|
||||
case "$count" in
|
||||
''|*[!0-9]*) count=1 ;;
|
||||
esac
|
||||
if [ "$count" -le 0 ]; then
|
||||
count=1
|
||||
fi
|
||||
|
||||
local i=0
|
||||
while [ "$i" -lt "$count" ]; do
|
||||
local port=$((2003 + (i * 2)))
|
||||
local uno_port=$((2004 + (i * 2)))
|
||||
echo "Starting unoserver on 127.0.0.1:${port} (uno-port ${uno_port})"
|
||||
UNOSERVER_PORTS+=("$port")
|
||||
UNOSERVER_UNO_PORTS+=("$uno_port")
|
||||
start_unoserver_instance "$port" "$uno_port"
|
||||
UNOSERVER_PIDS+=("$LAST_UNOSERVER_PID")
|
||||
i=$((i + 1))
|
||||
done
|
||||
|
||||
start_unoserver_watchdog
|
||||
}
|
||||
|
||||
# Setup OCR and permissions
|
||||
setup_ocr
|
||||
setup_permissions
|
||||
@@ -315,8 +112,9 @@ case "$MODE" in
|
||||
-jar /app.jar" &
|
||||
BACKEND_PID=$!
|
||||
|
||||
# Start unoserver pool for document conversion
|
||||
start_unoserver_pool
|
||||
# Start unoserver for document conversion
|
||||
run_as_user /opt/venv/bin/unoserver --port 2003 --interface 127.0.0.1 &
|
||||
UNO_PID=$!
|
||||
|
||||
# Wait for backend to start
|
||||
sleep 3
|
||||
@@ -359,9 +157,8 @@ case "$MODE" in
|
||||
run_as_user sh -c "java -Dfile.encoding=UTF-8 \
|
||||
-Djava.io.tmpdir=/tmp/stirling-pdf \
|
||||
-Dserver.port=8080 \
|
||||
-jar /app.jar" &
|
||||
-jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 127.0.0.1" &
|
||||
BACKEND_PID=$!
|
||||
start_unoserver_pool
|
||||
|
||||
echo "==================================="
|
||||
echo "✓ Backend API available at: http://localhost:8080/api"
|
||||
|
||||
Generated
+1409
-1162
File diff suppressed because it is too large
Load Diff
@@ -43,13 +43,13 @@
|
||||
"@supabase/supabase-js": "^2.47.13",
|
||||
"@tailwindcss/postcss": "^4.1.13",
|
||||
"@tanstack/react-virtual": "^3.13.12",
|
||||
"@tauri-apps/api": "^2.5.0",
|
||||
"@tauri-apps/api": "^2.9.1",
|
||||
"@tauri-apps/plugin-fs": "^2.4.0",
|
||||
"@tauri-apps/plugin-http": "^2.5.4",
|
||||
"@tauri-apps/plugin-shell": "^2.3.3",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"axios": "^1.12.2",
|
||||
"globals": "^17.0.0",
|
||||
"globals": "^16.4.0",
|
||||
"i18next": "^25.5.2",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
"jszip": "^3.10.1",
|
||||
@@ -129,7 +129,7 @@
|
||||
"@iconify-json/material-symbols": "^1.2.48",
|
||||
"@iconify/utils": "^3.0.2",
|
||||
"@playwright/test": "^1.55.0",
|
||||
"@tauri-apps/cli": "^2.5.0",
|
||||
"@tauri-apps/cli": "^2.9.5",
|
||||
"@testing-library/dom": "^10.4.1",
|
||||
"@testing-library/jest-dom": "^6.8.0",
|
||||
"@testing-library/react": "^16.3.0",
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "لديك تغييرات غير محفوظة على ملف PDF. ماذا تريد أن تفعل؟"
|
||||
pendingRedactionsTitle = "تنقيحات غير مطبّقة"
|
||||
pendingRedactions = "لديك تنقيحات غير مطبّقة ستُفقد."
|
||||
areYouSure = "هل أنت متأكد أنك تريد المغادرة؟"
|
||||
unsavedChangesTitle = "تغييرات غير محفوظة"
|
||||
keepWorking = "واصل العمل"
|
||||
discardChanges = "تجاهل التغييرات"
|
||||
discardRedactions = "تجاهل والمغادرة"
|
||||
applyAndContinue = "تطبيق والمتابعة"
|
||||
exportAndContinue = "تصدير ومتابعة"
|
||||
cancel = "إلغاء"
|
||||
@@ -343,10 +340,6 @@ advance = "متقدم"
|
||||
edit = "عرض وتعديل"
|
||||
popular = "المفضل"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "التفضيلات"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "متقدم"
|
||||
title = "الأمان والمصادقة"
|
||||
security = "الأمان"
|
||||
connections = "الاتصالات"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "الترخيص والتحليلات"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "الإصدار الحالي"
|
||||
latestVersion = "أحدث إصدار"
|
||||
checkForUpdates = "التحقق من التحديثات"
|
||||
viewDetails = "عرض التفاصيل"
|
||||
serverNeedsUpdate = "يحتاج الخادم إلى التحديث من قِبل المسؤول"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "معلومات الإصدار"
|
||||
description = "تفاصيل إصدار سطح المكتب والخادم"
|
||||
desktop = "إصدار سطح المكتب"
|
||||
server = "إصدار الخادم"
|
||||
|
||||
[settings.security]
|
||||
title = "الأمان"
|
||||
description = "حدّث كلمة مرورك للحفاظ على أمان حسابك."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "غيّر كلمة مرورك. سيتم تسجيل خروجك بعد التحديث."
|
||||
required = "جميع الحقول مطلوبة."
|
||||
mismatch = "لا تتطابق كلمتا المرور الجديدتان."
|
||||
error = "تعذّر تحديث كلمة المرور. يرجى التحقق من كلمة المرور الحالية والمحاولة مرة أخرى."
|
||||
success = "تم تحديث كلمة المرور بنجاح. يرجى تسجيل الدخول مجددًا."
|
||||
ssoDisabled = "تتم إدارة تغييرات كلمة المرور بواسطة موفر الهوية لديك."
|
||||
current = "كلمة المرور الحالية"
|
||||
currentPlaceholder = "أدخل كلمة المرور الحالية"
|
||||
new = "كلمة مرور جديدة"
|
||||
newPlaceholder = "أدخل كلمة مرور جديدة"
|
||||
confirm = "تأكيد كلمة المرور الجديدة"
|
||||
confirmPlaceholder = "أعد إدخال كلمة المرور الجديدة"
|
||||
update = "تحديث كلمة المرور"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "اختصارات لوحة المفاتيح"
|
||||
@@ -522,16 +488,11 @@ low = "منخفض"
|
||||
title = "تغيير بيانات الاعتماد"
|
||||
header = "تحديث تفاصيل حسابك"
|
||||
changePassword = "أنت تستخدم بيانات تسجيل الدخول الافتراضية. يرجى إدخال كلمة مرور جديدة"
|
||||
ssoManaged = "يتم إدارة حسابك بواسطة موفر الهوية."
|
||||
newUsername = "اسم المستخدم الجديد"
|
||||
oldPassword = "كلمة المرور الحالية"
|
||||
newPassword = "كلمة المرور الجديدة"
|
||||
confirmNewPassword = "تأكيد كلمة المرور الجديدة"
|
||||
submit = "إرسال التغييرات"
|
||||
credsUpdated = "تم تحديث الحساب"
|
||||
description = "تم حفظ التغييرات. يرجى تسجيل الدخول مجددًا."
|
||||
error = "تعذّر تحديث اسم المستخدم. يرجى التحقق من كلمة المرور والمحاولة مرة أخرى."
|
||||
changeUsername = "حدّث اسم المستخدم. سيتم تسجيل خروجك بعد التحديث."
|
||||
|
||||
[account]
|
||||
title = "إعدادات الحساب"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "إعدادات الحساب"
|
||||
adminSettings = "إعدادات المسؤول - عرض وإضافة المستخدمين"
|
||||
userControlSettings = "إعدادات التحكم في المستخدم"
|
||||
changeUsername = "تغيير اسم المستخدم"
|
||||
changeUsernameDescription = "حدّث اسم المستخدم. سيتم تسجيل خروجك بعد التحديث."
|
||||
newUsernamePlaceholder = "أدخل اسم المستخدم الجديد"
|
||||
newUsername = "اسم المستخدم الجديد"
|
||||
password = "كلمة مرور التأكيد"
|
||||
oldPassword = "كلمة المرور القديمة"
|
||||
@@ -749,11 +708,6 @@ tags = "توقيع،إمضاء"
|
||||
title = "توقيع"
|
||||
desc = "إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة"
|
||||
|
||||
[home.annotate]
|
||||
tags = "تعليق, تمييز, رسم"
|
||||
title = "تعليق"
|
||||
desc = "قم بتمييز ورسم وإضافة ملاحظات وأشكال في العارض"
|
||||
|
||||
[home.flatten]
|
||||
tags = "تبسيط،إزالة،تفاعلي"
|
||||
title = "تسطيح"
|
||||
@@ -964,8 +918,8 @@ desc = "تراكب ملف PDF فوق آخر"
|
||||
title = "تراكب ملفات PDF"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "محرر نصوص PDF"
|
||||
desc = "مراجعة وتحرير صادرات Stirling PDF بصيغة JSON مع تحرير نصوص مجمّعة وإعادة إنشاء PDF"
|
||||
title = "محرر نص PDF"
|
||||
desc = "حرّر النصوص والصور الموجودة داخل ملفات PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "نص,تعليق,تسمية"
|
||||
@@ -976,7 +930,6 @@ desc = "أضف نصاً مخصصاً في أي مكان داخل PDF"
|
||||
addFiles = "إضافة ملفات"
|
||||
uploadFromComputer = "الرفع من الكمبيوتر"
|
||||
openFromComputer = "فتح من الكمبيوتر"
|
||||
mobileUpload = "رفع من الهاتف المحمول"
|
||||
|
||||
[viewPdf]
|
||||
tags = "عرض,قراءة,تعليق,نص,صورة"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "خيارات التحويل من CBZ إلى PDF"
|
||||
optimizeForEbook = "تحسين PDF لقارئات الكتب الإلكترونية (يستخدم Ghostscript)"
|
||||
cbzOutputOptions = "خيارات التحويل من PDF إلى CBZ"
|
||||
cbzDpi = "DPI لعرض الصور"
|
||||
cbrOptions = "خيارات CBR"
|
||||
cbrOutputOptions = "خيارات تحويل PDF إلى CBR"
|
||||
cbrDpi = "DPI لعرض الصور"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "خيارات تحويل الكتب الإلكترونية إلى PDF"
|
||||
ebookOptionsDesc = "خيارات لتحويل الكتب الإلكترونية إلى PDF"
|
||||
embedAllFonts = "تضمين جميع الخطوط"
|
||||
embedAllFontsDesc = "تضمين كل الخطوط من الكتاب الإلكتروني في ملف PDF المُنشأ"
|
||||
includeTableOfContents = "تضمين جدول المحتويات"
|
||||
includeTableOfContentsDesc = "إضافة جدول محتويات مُنشأ إلى ملف PDF الناتج"
|
||||
includePageNumbers = "تضمين أرقام الصفحات"
|
||||
includePageNumbersDesc = "إضافة أرقام صفحات إلى ملف PDF المُنشأ"
|
||||
optimizeForEbookPdf = "تحسين لقارئات الكتب الإلكترونية"
|
||||
optimizeForEbookPdfDesc = "تحسين PDF لقراءة الكتب الإلكترونية (حجم ملف أصغر، عرض أفضل على أجهزة e-Ink)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "خيارات تحويل PDF إلى كتاب إلكتروني"
|
||||
epubOptionsDesc = "خيارات لتحويل PDF إلى EPUB/AZW3"
|
||||
detectChapters = "اكتشاف الفصول"
|
||||
detectChaptersDesc = "اكتشاف العناوين التي تبدو كفصول وإدراج فواصل صفحات EPUB"
|
||||
targetDevice = "الجهاز المستهدف"
|
||||
targetDeviceDesc = "اختر ملف إخراج مُحسّن لجهاز القراءة"
|
||||
outputFormat = "صيغة الإخراج"
|
||||
outputFormatDesc = "اختر صيغة إخراج الكتاب الإلكتروني"
|
||||
tabletPhone = "جهاز لوحي/هاتف (مع صور)"
|
||||
kindleEink = "Kindle e-Ink (تحسين للنص)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "تحويل,صورة,jpg,صورة,صورة فوتوغرافية"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "إضافة مرفق"
|
||||
remove = "إزالة المرفق"
|
||||
embed = "تضمين مرفق"
|
||||
convertToPdfA3b = "تحويل إلى PDF/A-3b"
|
||||
convertToPdfA3bDescription = "ينشئ ملف PDF للأرشفة مع مرفقات مضمنة"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b هو صيغة أرشفة تضمن الحفظ على المدى الطويل. يسمح بتضمين صيغ ملفات عشوائية كمرفقات. يتطلب التحويل استخدام Ghostscript وقد يستغرق وقتًا أطول للملفات الكبيرة."
|
||||
convertToPdfA3bTooltipHeader = "حول تحويل PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "ما الذي يفعله"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "محفوظ"
|
||||
label = "رفع صورة التوقيع"
|
||||
placeholder = "اختر ملف صورة"
|
||||
hint = "ارفع صورة PNG أو JPG لتوقيعك"
|
||||
removeBackground = "إزالة الخلفية البيضاء (جعلها شفافة)"
|
||||
processing = "جارٍ معالجة الصورة..."
|
||||
backgroundRemovalFailedTitle = "فشل إزالة الخلفية"
|
||||
backgroundRemovalFailedMessage = "تعذّر إزالة الخلفية من الصورة. سيتم استخدام الصورة الأصلية بدلًا من ذلك."
|
||||
|
||||
[sign.instructions]
|
||||
title = "كيفية إضافة توقيع"
|
||||
@@ -2434,11 +2351,6 @@ note = "التسطيح يزيل العناصر التفاعلية من PDF وي
|
||||
label = "تسطيح النماذج فقط"
|
||||
desc = "تسطيح حقول النماذج فقط مع إبقاء العناصر التفاعلية الأخرى كما هي"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI العرض (اختياري، يوصى بـ 150 DPI)"
|
||||
help = "اتركه فارغًا لاستخدام الإعداد الافتراضي للنظام. زيادة DPI تحسّن الحدة لكنها تزيد وقت المعالجة وحجم الملف."
|
||||
placeholder = "مثال: 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "نتائج التسطيح"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "اقتصاص PDF"
|
||||
submit = "إرسال"
|
||||
noFileSelected = "حدّد ملف PDF لبدء القص"
|
||||
reset = "إعادة التعيين إلى كامل PDF"
|
||||
autoCrop = "اقتصاص تلقائي للمساحات البيضاء"
|
||||
|
||||
[crop.preview]
|
||||
title = "معاينة منطقة القص"
|
||||
@@ -3244,7 +3155,6 @@ title = "طريقة التنقيح"
|
||||
mode = "الوضع"
|
||||
automatic = "تلقائي"
|
||||
automaticDesc = "تنقيح النص بناءً على مصطلحات البحث"
|
||||
automaticDisabledTooltip = "حدد ملفات في مدير الملفات لتنقيح عدة ملفات دفعة واحدة"
|
||||
manual = "يدوي"
|
||||
manualDesc = "انقر واسحب لتنقيح مناطق محددة"
|
||||
manualComingSoon = "التنقيح اليدوي قريبًا"
|
||||
@@ -3315,35 +3225,8 @@ text = "مطابقة الكلمات الكاملة فقط، وليس المطا
|
||||
title = "التحويل إلى PDF-Image"
|
||||
text = "يحوّل PDF إلى PDF قائم على الصور بعد التنقيح. يضمن إزالة النص خلف صناديق التنقيح تمامًا وعدم إمكانية استعادته."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "عناصر التحكم في التنقيح اليدوي"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "أداة تعليم النص"
|
||||
text = "حدّد نصًا مباشرة على ملف PDF لتمييزه للتنقيح. انقر واسحب لتحديد النص الذي تريد تنقيحه."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "أداة تعليم المنطقة"
|
||||
text = "ارسم مناطق مستطيلة على ملف PDF لتمييز مناطق للتنقيح. مفيد لتنقيح الصور أو التوقيعات أو الأشكال غير المنتظمة."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "تطبيق التنقيحات"
|
||||
text = "بعد تعليم المحتوى، انقر 'تطبيق' لتنقيح جميع المناطق المعلَّمة نهائيًا. يُظهر العداد عدد التنقيحات الجاهزة للتطبيق."
|
||||
bullet1 = "قم بتعليم ما تشاء من مناطق قبل التطبيق"
|
||||
bullet2 = "تُطبَّق جميع التنقيحات المعلّقة دفعة واحدة"
|
||||
bullet3 = "لا يمكن التراجع عن التنقيحات بعد تطبيقها"
|
||||
|
||||
[redact.manual]
|
||||
title = "أدوات التنقيح"
|
||||
instructions = "حدّد نصًا أو ارسم مناطق على ملف PDF لتمييز المحتوى للتنقيح."
|
||||
markText = "تعليم النص"
|
||||
markArea = "تعليم المنطقة"
|
||||
pendingLabel = "معلّق:"
|
||||
applyWarning = "⚠️ تطبيق دائم، لا يمكن التراجع عنه وسيُحذف البيانات الموجودة تحته"
|
||||
apply = "تطبيق"
|
||||
noMarks = "لا توجد علامات تنقيح. استخدم الأدوات أعلاه لتمييز محتوى للتنقيح."
|
||||
header = "تنقيح يدوي"
|
||||
controlsTitle = "عناصر التحكم في التنقيح اليدوي"
|
||||
textBasedRedaction = "تنقيح قائم على النص"
|
||||
pageBasedRedaction = "تنقيح حسب الصفحة"
|
||||
convertPDFToImageLabel = "تحويل PDF إلى PDF-Image (لإزالة النص خلف الصندوق)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "أدخل عدد التقسيمات الأفقية"
|
||||
label = "التقسيمات العمودية"
|
||||
placeholder = "أدخل عدد التقسيمات العمودية"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "وضع التقسيم"
|
||||
description = "اختر كيفية تقسيم الصفحات"
|
||||
splitAll = "تقسيم جميع الصفحات"
|
||||
splitAllExceptFirst = "تقسيم الجميع باستثناء الأولى"
|
||||
splitAllExceptLast = "تقسيم الجميع باستثناء الأخيرة"
|
||||
splitAllExceptFirstAndLast = "تقسيم الجميع باستثناء الأولى والأخيرة"
|
||||
custom = "صفحات مخصصة"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "أرقام صفحات مخصصة"
|
||||
placeholder = "مثال: 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "ختم, إضافة صورة, صورة وسط, علامة مائية, PDF, تضمين, تخصيص"
|
||||
header = "ختم PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "حجم الملف"
|
||||
[compress.grayscale]
|
||||
label = "تطبيق التدرج الرمادي للضغط"
|
||||
|
||||
[compress.linearize]
|
||||
label = "تهيئة PDF خطيًا لعرض سريع على الويب"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "تحويل الصور إلى رسومات خطية"
|
||||
description = "يستخدم ImageMagick لتقليل الصفحات إلى أبيض وأسود عالي التباين لأقصى تقليل للحجم."
|
||||
unavailable = "لم يتم تثبيت ImageMagick على هذا الخادم أو لم يتم تمكينه"
|
||||
detailLevel = "مستوى التفاصيل"
|
||||
edgeEmphasis = "تركيز الحواف"
|
||||
edgeLow = "خفيف"
|
||||
edgeMedium = "متوازن"
|
||||
edgeHigh = "قوي"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "نظرة عامة على إعدادات الضغط"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "القيم المرتفعة تقلّل حجم الملف"
|
||||
title = "تدرّج رمادي"
|
||||
text = "حدد هذا الخيار لتحويل جميع الصور إلى الأبيض والأسود، ما قد يقلّل حجم الملف بشكل ملحوظ خاصة لملفات PDF الممسوحة أو الكثيرة الصور."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "الرسومات الخطية"
|
||||
text = "حوّل الصفحات إلى أبيض وأسود عالي التباين باستخدام ImageMagick. استخدم مستوى التفاصيل للتحكم بكمية المحتوى الذي يصبح أسود، وتركيز الحواف للتحكم في مدى قوة اكتشاف الحواف."
|
||||
|
||||
[compress.error]
|
||||
failed = "حدث خطأ أثناء ضغط PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "حدث خطأ أثناء ضغط PDF."
|
||||
_value = "إعدادات الضغط"
|
||||
1 = "1-3 ضغط PDF،</br> 4-6 ضغط صور خفيف،</br> 7-9 ضغط صور قوي سيقلّل جودة الصور بشكل كبير"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "القيم المنخفضة تحافظ على الجودة لكنها تنتج ملفات أكبر"
|
||||
range4to6 = "ضغط متوسط مع خفض معتدل للجودة"
|
||||
range7to9 = "القيم الأعلى تقلل حجم الملف بشكل كبير لكنها قد تقلل وضوح الصور"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "هذا الملف محمي بكلمة مرور. يرجى إدخال كلمة المرور:"
|
||||
cancelled = "تم إلغاء العملية لـ PDF: {0}"
|
||||
@@ -4027,7 +3875,7 @@ version = "الإصدار الحالي"
|
||||
title = "توثيق API"
|
||||
header = "توثيق API"
|
||||
desc = "عرض واختبار نقاط نهاية Stirling PDF API"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,توثيق,swagger,نقاط النهاية,تطوير"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "كيف نستخدم ملفات تعريف الارتباط"
|
||||
@@ -4065,8 +3913,8 @@ title = "التحليلات"
|
||||
description = "تساعدنا هذه الملفات على فهم كيفية استخدام أدواتنا، كي نركّز على بناء الميزات الأكثر قيمة لمجتمعنا. كن مطمئنًا—Stirling PDF لا يمكنه ولن يتتبع محتوى المستندات التي تعمل عليها."
|
||||
|
||||
[cookieBanner.services]
|
||||
posthog = "PostHog Analytics"
|
||||
scarf = "Scarf Pixel"
|
||||
posthog = "تحليلات PostHog"
|
||||
scarf = "Scarf بكسل"
|
||||
|
||||
[removeMetadata]
|
||||
submit = "إزالة البيانات الوصفية"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "حذف الصفحات المحددة"
|
||||
closePdf = "إغلاق PDF"
|
||||
exportAll = "تصدير PDF"
|
||||
downloadSelected = "تنزيل الملفات المحددة"
|
||||
annotations = "تعليقات"
|
||||
exportSelected = "تصدير الصفحات المحددة"
|
||||
saveChanges = "حفظ التغييرات"
|
||||
downloadAll = "تنزيل الكل"
|
||||
saveAll = "حفظ الكل"
|
||||
toggleTheme = "تبديل السِمة"
|
||||
toggleBookmarks = "تبديل الإشارات المرجعية"
|
||||
language = "اللغة"
|
||||
toggleAnnotations = "تبديل ظهور التعليقات التوضيحية"
|
||||
search = "بحث في PDF"
|
||||
panMode = "وضع السحب"
|
||||
applyRedactionsFirst = "طبّق التنقيحات أولًا"
|
||||
rotateLeft = "تدوير لليسار"
|
||||
rotateRight = "تدوير لليمين"
|
||||
toggleSidebar = "تبديل الشريط الجانبي"
|
||||
toggleBookmarks = "تبديل الإشارات المرجعية"
|
||||
exportSelected = "تصدير الصفحات المحددة"
|
||||
toggleAnnotations = "تبديل ظهور التعليقات التوضيحية"
|
||||
annotationMode = "تبديل وضع التعليقات"
|
||||
print = "طباعة PDF"
|
||||
draw = "رسم"
|
||||
redact = "تنقيح"
|
||||
exitRedaction = "الخروج من وضع التنقيح"
|
||||
save = "حفظ"
|
||||
downloadAll = "تنزيل الكل"
|
||||
saveAll = "حفظ الكل"
|
||||
|
||||
[textAlign]
|
||||
left = "يسار"
|
||||
center = "وسط"
|
||||
right = "يمين"
|
||||
|
||||
[annotation]
|
||||
title = "تعليق"
|
||||
desc = "استخدم التمييز والقلم والنص والملاحظات. تبقى التغييرات مباشرة—لا حاجة للتسطيح."
|
||||
highlight = "تمييز"
|
||||
pen = "قلم"
|
||||
text = "مربع نص"
|
||||
note = "ملاحظة"
|
||||
rectangle = "مستطيل"
|
||||
ellipse = "بيضاوي"
|
||||
select = "تحديد"
|
||||
exit = "الخروج من وضع التعليق"
|
||||
strokeWidth = "العرض"
|
||||
opacity = "العتامة"
|
||||
strokeOpacity = "عتامة الحد"
|
||||
fillOpacity = "عتامة التعبئة"
|
||||
fontSize = "حجم الخط"
|
||||
chooseColor = "اختر اللون"
|
||||
color = "اللون"
|
||||
strokeColor = "لون الحد"
|
||||
fillColor = "لون التعبئة"
|
||||
underline = "تسطير"
|
||||
strikeout = "شطب"
|
||||
squiggly = "خط متعرج"
|
||||
inkHighlighter = "أداة تمييز بخط اليد"
|
||||
freehandHighlighter = "أداة تمييز بخط اليد"
|
||||
square = "مربع"
|
||||
circle = "دائرة"
|
||||
polygon = "مضلع"
|
||||
line = "خط"
|
||||
stamp = "إضافة صورة"
|
||||
textMarkup = "وسم النص"
|
||||
drawing = "رسم"
|
||||
shapes = "أشكال"
|
||||
notesStamps = "ملاحظات وأختام"
|
||||
settings = "الإعدادات"
|
||||
borderOn = "الحد: مفعّل"
|
||||
borderOff = "الحد: معطّل"
|
||||
editInk = "تحرير القلم"
|
||||
editLine = "تحرير الخط"
|
||||
editNote = "تحرير الملاحظة"
|
||||
editText = "تحرير مربع النص"
|
||||
editTextMarkup = "تحرير وسم النص"
|
||||
editSelected = "تحرير التعليق"
|
||||
editSquare = "تحرير المربع"
|
||||
editCircle = "تحرير الدائرة"
|
||||
editPolygon = "تحرير المضلع"
|
||||
unsupportedType = "هذا النوع من التعليقات غير مدعوم بالكامل للتحرير."
|
||||
textAlignment = "محاذاة النص"
|
||||
noteIcon = "أيقونة الملاحظة"
|
||||
imagePreview = "معاينة"
|
||||
contents = "المحتوى"
|
||||
backgroundColor = "لون الخلفية"
|
||||
clearBackground = "إزالة الخلفية"
|
||||
noBackground = "بدون خلفية"
|
||||
stampSettings = "إعدادات الختم"
|
||||
savingCopy = "جارٍ تحضير التنزيل..."
|
||||
saveFailed = "تعذّر حفظ النسخة"
|
||||
saveReady = "التنزيل جاهز"
|
||||
selectAndMove = "تحديد وتحرير"
|
||||
editSelectDescription = "انقر تعليقًا موجودًا لتحرير لونه أو عتامته أو نصه أو حجمه."
|
||||
editStampHint = "لتغيير الصورة، احذف هذا الختم وأضف واحدًا جديدًا."
|
||||
editSwitchToSelect = "بدّل إلى «تحديد وتحرير» لتحرير هذا التعليق."
|
||||
undo = "تراجع"
|
||||
redo = "إعادة"
|
||||
applyChanges = "تطبيق التغييرات"
|
||||
saveChanges = "حفظ التغييرات"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "إعدادات"
|
||||
adminSettings = "إعدادات المشرف"
|
||||
allTools = "كل الأدوات"
|
||||
reader = "القارئ"
|
||||
tours = "جولات"
|
||||
showMeAround = "أرني جولة"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "شاهد الشروحات هنا: جولة الأدوات، جولة التصميم الجديد V2، وجولة المسؤول."
|
||||
user = "شاهد الشروحات هنا: جولة الأدوات وجولة التصميم الجديد V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "جولة الأدوات"
|
||||
toolsTourDesc = "تعرّف على ما تستطيع الأدوات فعله"
|
||||
adminTour = "جولة المسؤول"
|
||||
adminTourDesc = "استكشف إعدادات وميزات المسؤول"
|
||||
whatsNewTour = "اطّلع على الجديد في V2"
|
||||
whatsNewTourDesc = "جولة في التصميم المُحدَّث"
|
||||
|
||||
[admin]
|
||||
error = "خطأ"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "فشل تحميل الإعدادات"
|
||||
saveError = "فشل حفظ الإعدادات"
|
||||
saved = "تم حفظ الإعدادات بنجاح"
|
||||
saveSuccess = "تم حفظ الإعدادات بنجاح"
|
||||
success = "تم حفظ الإعدادات بنجاح"
|
||||
error = "فشل حفظ الإعدادات"
|
||||
save = "حفظ التغييرات"
|
||||
discard = "تجاهل"
|
||||
restartRequired = "مطلوب إعادة تشغيل"
|
||||
@@ -4422,13 +4185,6 @@ description = "المسار إلى ملف WeasyPrint التنفيذي لتحوي
|
||||
label = "ملف unoconvert التنفيذي"
|
||||
description = "المسار إلى LibreOffice unoconvert لتحويل المستندات (اتركه فارغًا للإعداد الافتراضي: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "عنوان URL للواجهة الأمامية"
|
||||
description = "عنوان URL الأساسي للواجهة الأمامية (مثل https://pdf.example.com). يُستخدم لروابط دعوات البريد الإلكتروني وعمليات الرفع عبر رمز QR على الهاتف المحمول. اتركه فارغًا لاستخدام عنوان URL للواجهة الخلفية."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "انقر لعرض تفاصيل الخطة"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "الأمان"
|
||||
description = "تهيئة المصادقة، وسلوك تسجيل الدخول، وسياسات الأمان."
|
||||
@@ -4565,19 +4321,6 @@ connect = "ربط"
|
||||
disconnect = "قطع الاتصال"
|
||||
disconnected = "تم قطع اتصال المزوّد بنجاح"
|
||||
disconnectError = "فشل قطع اتصال المزوّد"
|
||||
mobileScannerConvertToPdf = "تحويل الصور إلى PDF"
|
||||
mobileScannerConvertToPdfDesc = "تحويل الصور المرفوعة تلقائيًا إلى صيغة PDF. إذا تم التعطيل، ستُحفظ الصور كما هي."
|
||||
mobileScannerImageResolution = "دقة الصورة"
|
||||
mobileScannerImageResolutionDesc = "دقة الصور المرفوعة. \"مخفَّضة\" تغيّر حجم الصور إلى حد أقصى 1200px لتقليل حجم الملف."
|
||||
imageResolutionFull = "كاملة (الحجم الأصلي)"
|
||||
imageResolutionReduced = "مخفَّضة (حتى 1200px)"
|
||||
mobileScannerPageFormat = "تنسيق الصفحة"
|
||||
mobileScannerPageFormatDesc = "حجم صفحة PDF للصور المحوَّلة. \"احتفاظ\" يستخدم أبعاد الصورة الأصلية."
|
||||
pageFormatKeep = "احتفاظ (الأبعاد الأصلية)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "تمديد لملء الصفحة"
|
||||
mobileScannerStretchToFitDesc = "مدّ الصور لملء الصفحة كاملة. إذا تم التعطيل، ستتم محاذاة الصور في الوسط مع الحفاظ على نسبة العرض إلى الارتفاع."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "تسجيل دخول تلقائي عبر SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "إنشاء حسابات المستخدمين تلقائيًا ع
|
||||
label = "حظر التسجيل"
|
||||
description = "منع تسجيل المستخدمين الجدد عبر SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "رفع من الهاتف المحمول"
|
||||
enable = "تمكين الرفع عبر رمز QR"
|
||||
description = "السماح للمستخدمين برفع الملفات من الأجهزة المحمولة عبر مسح رمز QR"
|
||||
note = "ملاحظة: يتطلب تكوين عنوان URL للواجهة الأمامية. "
|
||||
link = "الضبط في إعدادات النظام"
|
||||
mobileScannerConvertToPdf = "تحويل الصور إلى PDF"
|
||||
mobileScannerConvertToPdfDesc = "تحويل الصور المرفوعة تلقائيًا إلى صيغة PDF. إذا تم التعطيل، ستُحفظ الصور كما هي."
|
||||
mobileScannerImageResolution = "دقة الصورة"
|
||||
mobileScannerImageResolutionDesc = "دقة الصور المرفوعة. \"مخفَّضة\" تغيّر حجم الصور إلى حد أقصى 1200px لتقليل حجم الملف."
|
||||
imageResolutionFull = "كاملة (الحجم الأصلي)"
|
||||
imageResolutionReduced = "مخفَّضة (حتى 1200px)"
|
||||
mobileScannerPageFormat = "تنسيق الصفحة"
|
||||
mobileScannerPageFormatDesc = "حجم صفحة PDF للصور المحوَّلة. \"احتفاظ\" يستخدم أبعاد الصورة الأصلية."
|
||||
pageFormatKeep = "احتفاظ (الأبعاد الأصلية)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "تمديد لملء الصفحة"
|
||||
mobileScannerStretchToFitDesc = "مدّ الصور لملء الصفحة كاملة. إذا تم التعطيل، ستتم محاذاة الصور في الوسط مع الحفاظ على نسبة العرض إلى الارتفاع."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "روبوت Telegram"
|
||||
description = "اضبط اتصال روبوت Telegram، ضوابط الوصول، وسلوك التغذية الراجعة."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "تمكين روبوت Telegram"
|
||||
description = "السماح للمستخدمين بالتفاعل مع Stirling PDF عبر روبوت Telegram المُكوَّن لديك."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "اسم مستخدم الروبوت"
|
||||
description = "الاسم العام لروبوت Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "رمز الروبوت"
|
||||
description = "رمز API المُقدَّم من BotFather لروبوت Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "مجلد الوارد"
|
||||
description = "مجلد تحت دليل خط المعالجة حيث تُخزَّن ملفات Telegram الواردة."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "استخدام لاحقة مجلد مخصصة"
|
||||
description = "إلحاق معرّف الدردشة بمجلدات الملفات الواردة لعزل الرفع لكل دردشة."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "التحكم بالوصول"
|
||||
description = "تقييد المستخدمين أو القنوات التي يمكنها التفاعل مع الروبوت."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "السماح بمعرفات مستخدم محددة"
|
||||
description = "عند التمكين، يمكن فقط لمعرفات المستخدم المدرجة استخدام الروبوت."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "معرّفات المستخدم المسموح بها"
|
||||
description = "أدخل معرّفات مستخدم Telegram المسموح لها بالتفاعل مع الروبوت."
|
||||
placeholder = "أضف معرّف مستخدم واضغط إدخال"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "السماح بمعرفات قنوات محددة"
|
||||
description = "عند التمكين، يمكن فقط لمعرفات القنوات المدرجة استخدام الروبوت."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "معرّفات القنوات المسموح بها"
|
||||
description = "أدخل معرّفات قنوات Telegram المسموح لها بالتفاعل مع الروبوت."
|
||||
placeholder = "أضف معرّف قناة واضغط إدخال"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "المعالجة"
|
||||
description = "التحكم بفواصل الاستطلاع ومهلات المعالجة لعمليات الرفع عبر Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "مهلة المعالجة (ثوانٍ)"
|
||||
description = "المدة القصوى لانتظار مهمة معالجة قبل الإبلاغ عن خطأ."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "فاصل الاستطلاع (مللي ثانية)"
|
||||
description = "الفاصل بين التحقق من تحديثات Telegram الجديدة."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "رسائل التغذية الراجعة"
|
||||
description = "اختر متى يجب أن يرسل الروبوت رسائل تغذية راجعة للمستخدمين والقنوات."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "تمكين التغذية الراجعة"
|
||||
description = "التحكم فيما إذا كان الروبوت يرسل رسائل تغذية راجعة من عدمه."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "قواعد تغذية القنوات"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "إظهار \"لا يوجد مستند صالح\" (القناة)"
|
||||
description = "إخفاء رد عدم وجود مستند صالح لرفع القنوات."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "إظهار أخطاء المعالجة (القناة)"
|
||||
description = "إرسال رسائل أخطاء المعالجة إلى القنوات."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "إظهار رسائل الخطأ (القناة)"
|
||||
description = "إظهار رسائل خطأ مفصّلة للقنوات."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "قواعد تغذية المستخدم"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "إظهار \"لا يوجد مستند صالح\" (المستخدم)"
|
||||
description = "إخفاء رد عدم وجود مستند صالح لرفع المستخدمين."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "إظهار أخطاء المعالجة (المستخدم)"
|
||||
description = "إرسال رسائل أخطاء المعالجة إلى المستخدمين."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "إظهار رسائل الخطأ (المستخدم)"
|
||||
description = "إظهار رسائل خطأ مفصّلة للمستخدمين."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "قاعدة البيانات"
|
||||
description = "تهيئة إعدادات اتصال قاعدة بيانات مخصصة لعمليات النشر المؤسسية."
|
||||
@@ -4943,10 +4570,6 @@ description = "السماح للمسؤولين بدعوة المستخدمين
|
||||
label = "عنوان URL للواجهة الأمامية"
|
||||
description = "عنوان URL الأساسي للواجهة الأمامية (مثال: https://pdf.example.com). يُستخدم لإنشاء روابط الدعوة في الرسائل. اتركه فارغًا لاستخدام عنوان URL للواجهة الخلفية."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "ملاحظة: يتطلب تكوين عنوان URL للواجهة الأمامية. "
|
||||
link = "الضبط في إعدادات النظام"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "الوثائق القانونية"
|
||||
description = "تهيئة روابط الوثائق والسياسات القانونية."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "ملفاتي"
|
||||
noRecentFiles = "لم يتم العثور على ملفات حديثة"
|
||||
googleDriveNotAvailable = "تكامل Google Drive غير متاح"
|
||||
mobileUpload = "رفع من الهاتف المحمول"
|
||||
mobileShort = "الهاتف"
|
||||
mobileUploadNotAvailable = "الرفع من الهاتف غير مُمكّن"
|
||||
downloadSelected = "تنزيل المحدّد"
|
||||
saveSelected = "حفظ المحدد"
|
||||
openFiles = "فتح ملفات"
|
||||
@@ -5449,7 +5069,6 @@ loading = "جارٍ التحميل..."
|
||||
back = "رجوع"
|
||||
continue = "متابعة"
|
||||
error = "خطأ"
|
||||
save = "حفظ"
|
||||
|
||||
[config.overview]
|
||||
title = "تهيئة التطبيق"
|
||||
@@ -5512,15 +5131,6 @@ impact = "أي تطبيقات أو خدمات تستخدم هذه المفاتي
|
||||
confirmPrompt = "هل أنت متأكد أنك تريد المتابعة؟"
|
||||
confirmCta = "تحديث المفاتيح"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "خطأ في مفتاح API"
|
||||
failedToCreateApiKey = "فشل إنشاء مفتاح API."
|
||||
failedToRetrieveApiKey = "تعذّر جلب مفتاح API من الاستجابة."
|
||||
failedToFetchApiKey = "تعذّر جلب مفتاح API."
|
||||
apiKeyRefreshed = "تم تحديث مفتاح API"
|
||||
apiKeyRefreshedBody = "تم تحديث مفتاح API الخاص بك بنجاح."
|
||||
failedToRefreshApiKey = "فشل تحديث مفتاح API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "اختر المرفقات"
|
||||
info = "اختر ملفات لإرفاقها بملف PDF الخاص بك. سيتم تضمين هذه الملفات وإتاحتها عبر لوحة مرفقات PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "إنهاء"
|
||||
startTour = "بدء الجولة"
|
||||
startTourDescription = "قم بجولة إرشادية للتعرّف على الميزات الرئيسية في Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "ابدأ من شريط <strong>الوصول السريع</strong> للتنقل بين Reader وAutomate وملفاتك وكل الجولات."
|
||||
leftPanel = "يعرض اللوح الأيسر <strong>الأدوات</strong> كل ما يمكنك فعله. تصفّح الفئات أو ابحث للعثور على أداة بسرعة."
|
||||
fileUpload = "استخدم زر <strong>الملفات</strong> لرفع أو اختيار PDF حديث. سنحمّل نموذجًا كي ترى مساحة العمل."
|
||||
rightRail = "يحتوي <strong>الشريط الأيمن</strong> على إجراءات سريعة لاختيار الملفات وتغيير السمة أو اللغة وتنزيل النتائج."
|
||||
topBar = "يتيح لك الشريط العلوي التبديل بين <strong>العارض</strong> و<strong>محرر الصفحات</strong> و<strong>الملفات النشطة</strong>."
|
||||
pageEditorView = "بدّل إلى محرر الصفحات لإعادة الترتيب أو التدوير أو حذف الصفحات."
|
||||
activeFilesView = "استخدم الملفات النشطة لرؤية كل ما فتحته واختيار ما ستعمل عليه."
|
||||
wrapUp = "هذا ما هو جديد في V2. افتح قائمة <strong>الجولات</strong> في أي وقت لإعادة تشغيل هذه الجولة أو جولة الأدوات أو جولة المسؤول."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "مرحبًا بك في Stirling PDF!"
|
||||
description = "هل ترغب في جولة سريعة لمدة دقيقة للتعرّف على الميزات الرئيسية وكيفية البدء؟"
|
||||
@@ -5655,10 +5255,6 @@ download = "تنزيل →"
|
||||
showMeAround = "أرني الجولة"
|
||||
skipTheTour = "تخطي الجولة"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "نظرة عامة على الجولة"
|
||||
body = "تأتي Stirling PDF V2 بعشرات الأدوات وتصميم مُحدَّث. خذ جولة سريعة لترى ما الذي تغيّر وأين تجد الميزات التي تحتاجها."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "تخطي الآن"
|
||||
seePlans = "عرض الخطط →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "الترقية الآن →"
|
||||
freeTitle = "ترخيص الخادم"
|
||||
overLimitTitle = "مطلوب ترخيص خادم"
|
||||
overLimitBody = "ترخيصنا يسمح حتى <strong>{{freeTierLimit}}</strong> مستخدمين مجاناً لكل خادم. لديك <strong>{{overLimitUserCopy}}</strong> مستخدمي Stirling. للمتابعة دون انقطاع، ارقَ إلى خطة خادم Stirling - <strong>مقاعد غير محدودة</strong>، تحرير نصوص PDF، وتحكم إداري كامل مقابل $99/خادم/شهرياً."
|
||||
freeBody = "ترخيص <strong>Open-Core</strong> لدينا يسمح حتى <strong>{{freeTierLimit}}</strong> مستخدمين مجاناً لكل خادم. للتوسع بسلاسة والحصول على وصول مبكر إلى <strong>أداة تحرير نصوص PDF</strong> الجديدة، نوصي بخطة خادم Stirling - تحرير كامل و<strong>مقاعد غير محدودة</strong> مقابل $99/خادم/شهرياً."
|
||||
freeBody = "يتيح ترخيصنا <strong>Open-Core</strong> ما يصل إلى <strong>{{freeTierLimit}}</strong> مستخدمًا مجانًا لكل خادم. للتوسع دون انقطاع، نوصي بخطة Stirling Server - <strong>مقاعد غير محدودة</strong> و<strong>دعم SSO</strong> مقابل $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "تنزيل"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "اتصل بالمبيعات"
|
||||
contactToUpgrade = "اتصل بنا للترقية أو تخصيص خطتك"
|
||||
maxUsers = "الحد الأقصى للمستخدمين"
|
||||
upTo = "حتى"
|
||||
getLicense = "الحصول على ترخيص الخادم"
|
||||
upgradeToEnterprise = "الترقية إلى Enterprise"
|
||||
selectPeriod = "اختيار فترة الفوترة"
|
||||
monthlyBilling = "فوترة شهرية"
|
||||
yearlyBilling = "فوترة سنوية"
|
||||
checkoutOpened = "تم فتح صفحة الدفع"
|
||||
checkoutInstructions = "أكمل عملية الشراء في تبويب Stripe. بعد الدفع، ارجع إلى هنا وحدّث الصفحة لتفعيل ترخيصك. ستتلقى أيضًا بريدًا إلكترونيًا يحتوي على مفتاح الترخيص."
|
||||
activateLicense = "فعِّل ترخيصك"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "تم فتح الدفع في تبويب جديد"
|
||||
instructions = "أكمل عملية الشراء في تبويب Stripe. عند اكتمال الدفع، ستتلقى بريدًا إلكترونيًا يحتوي على مفتاح الترخيص."
|
||||
enterKey = "أدخل مفتاح الترخيص أدناه لتفعيل خطتك:"
|
||||
keyDescription = "الصق مفتاح الترخيص من بريدك الإلكتروني"
|
||||
activate = "تفعيل الترخيص"
|
||||
doLater = "سأفعل ذلك لاحقًا"
|
||||
success = "تم تفعيل الترخيص!"
|
||||
successMessage = "تم تفعيل ترخيصك بنجاح. يمكنك الآن إغلاق هذه النافذة."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "مطلوب التحقق من البريد الإلكتروني"
|
||||
message = "ستحتاج إلى التحقق من عنوان بريدك الإلكتروني في بوابة فوترة Stripe. تحقق من بريدك للحصول على رابط تسجيل الدخول."
|
||||
|
||||
[plan.period]
|
||||
month = "شهر"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "نظام التدقيق غير متاح"
|
||||
notAvailableMessage = "لم يتم تهيئة نظام التدقيق أو أنه غير متاح."
|
||||
disabled = "تم تعطيل تسجيل التدقيق"
|
||||
disabledMessage = "قم بتمكين تسجيل التدقيق في إعدادات التطبيق لتتبع أحداث النظام."
|
||||
enterpriseRequired = "يتطلب ترخيص Enterprise"
|
||||
enterpriseRequiredMessage = "نظام سجلات التدقيق ميزة ضمن فئة Enterprise. يرجى الترقية إلى ترخيص Enterprise للوصول إلى سجلات التدقيق والتحليلات."
|
||||
|
||||
[audit.error]
|
||||
title = "خطأ في تحميل نظام التدقيق"
|
||||
@@ -6370,7 +5942,6 @@ description = "أدخل عنوان URL الكامل لخادم Stirling PDF ال
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "يرجى إدخال عنوان URL للخادم"
|
||||
invalidUrl = "صيغة URL غير صالحة. يرجى إدخال عنوان URL صالح مثل https://your-server.com"
|
||||
unreachable = "تعذّر الاتصال بالخادم"
|
||||
testFailed = "فشل اختبار الاتصال"
|
||||
configFetch = "فشل في جلب إعدادات الخادم. يرجى التحقق من عنوان URL والمحاولة مرة أخرى."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "جارٍ الاتصال بـ:"
|
||||
submit = "تسجيل الدخول"
|
||||
signInWith = "تسجيل الدخول باستخدام"
|
||||
oauthPending = "جارٍ فتح المتصفح للمصادقة..."
|
||||
sso = "تسجيل الدخول الموحد"
|
||||
orContinueWith = "أو المتابعة بالبريد الإلكتروني"
|
||||
serverRequirement = "ملاحظة: يجب أن يكون تسجيل الدخول مفعّلاً على الخادم."
|
||||
showInstructions = "كيفية التمكين؟"
|
||||
@@ -6455,8 +6025,6 @@ reset = "إعادة تعيين التغييرات"
|
||||
downloadJson = "تنزيل JSON"
|
||||
generatePdf = "توليد PDF"
|
||||
saveChanges = "حفظ التغييرات"
|
||||
applyChanges = "تطبيق التغييرات"
|
||||
downloadCopy = "تنزيل نسخة"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ضبط النص تلقائياً ليتناسب مع الصناديق"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "نصيحة: اضغط Ctrl (Cmd) أو Shift لتحديد ع
|
||||
title = "قفل النص المُحرّر ضمن عنصر PDF واحد"
|
||||
description = "عند التفعيل، يصدّر المحرر كل صندوق نص مُحرّر كعنصر نص PDF واحد لتجنب تراكب المحارف أو اختلاط الخطوط."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "إعدادات متقدمة"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "قيود المعاينة"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "تركيز النص والصورة"
|
||||
text = "يركّز هذا المجال على تحرير النص وإعادة تموضع الصور المضمّنة. ستُحفَظ الأعمال الفنية المعقّدة وعناصر النماذج والرسومات الطبقية للتصدير لكنها غير قابلة للتحرير بالكامل هنا."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "اختلاف المعاينة"
|
||||
text = "قد لا تظهر بعض العناصر البصرية (مثل حدود الجداول أو الأشكال أو مظهر التعليقات) تمامًا كما هي في المعاينة. يحتفظ PDF المُصدَّر بأوامر الرسم الأصلية كلما أمكن."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "عارض ألفا"
|
||||
text = "هذا العارض الألفا ما يزال قيد التطوير—قد تتغيّر بعض الخطوط والألوان وتأثيرات الشفافية وتفاصيل التخطيط قليلًا. يرجى التحقق من ملف PDF المُولَّد قبل المشاركة."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "دمج الصناديق المحددة"
|
||||
merge = "دمج التحديد"
|
||||
@@ -6614,58 +6164,3 @@ title = "نتائج إضافة النص"
|
||||
|
||||
[addText.error]
|
||||
failed = "حدث خطأ أثناء إضافة النص إلى ملف PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "رفع من الهاتف المحمول"
|
||||
description = "امسح ضوئيًا لرفع الصور. تتحول الصور تلقائيًا إلى PDF."
|
||||
descriptionNoConvert = "امسح ضوئيًا لرفع الصور من جهازك المحمول."
|
||||
error = "خطأ في الاتصال"
|
||||
pollingError = "خطأ أثناء التحقق من الملفات"
|
||||
sessionId = "معرّف الجلسة"
|
||||
sessionCreateError = "فشل إنشاء الجلسة"
|
||||
expiryWarning = "ستنتهي صلاحية الجلسة قريبًا"
|
||||
expiryWarningMessage = "ستنتهي صلاحية رمز QR هذا خلال {{seconds}} ثانية. سيتم توليد رمز جديد تلقائيًا."
|
||||
filesReceived = "تم استلام {{count}} ملف"
|
||||
connected = "تم توصيل الجهاز المحمول"
|
||||
instructions = "امسح باستخدام كاميرا هاتفك. تُحوَّل الصور إلى PDF تلقائيًا."
|
||||
instructionsNoConvert = "امسح باستخدام كاميرا هاتفك لرفع الملفات."
|
||||
|
||||
[mobileScanner]
|
||||
title = "الماسح عبر الهاتف"
|
||||
noSession = "جلسة غير صالحة"
|
||||
noSessionMessage = "يرجى مسح رمز QR صالح للوصول إلى هذه الصفحة."
|
||||
validating = "جارٍ التحقق من الجلسة..."
|
||||
sessionInvalid = "خطأ في الجلسة"
|
||||
sessionExpired = "انتهت صلاحية هذه الجلسة. يرجى التحديث والمحاولة مرة أخرى."
|
||||
sessionNotFound = "الجلسة غير موجودة. يرجى التحديث والمحاولة مرة أخرى."
|
||||
sessionValidationError = "تعذّر التحقق من الجلسة. يرجى المحاولة مرة أخرى."
|
||||
uploadSuccess = "تم الرفع بنجاح!"
|
||||
uploadSuccessMessage = "تم نقل صورك."
|
||||
httpsRequired = "يتطلب الوصول إلى الكاميرا HTTPS أو localhost. يرجى استخدام HTTPS أو الوصول عبر localhost."
|
||||
uploadFailed = "فشل الرفع. يرجى المحاولة مرة أخرى."
|
||||
uploading = "جارٍ الرفع..."
|
||||
connected = "متصل"
|
||||
connecting = "جارٍ الاتصال..."
|
||||
chooseMethod = "اختر طريقة الرفع"
|
||||
chooseMethodDescription = "حدّد كيف تريد مسح المستندات ورفعها"
|
||||
camera = "الكاميرا"
|
||||
cameraDescription = "امسح المستندات بكاميرا جهازك مع اكتشاف تلقائي للحواف"
|
||||
fileUpload = "رفع ملف"
|
||||
fileDescription = "ارفع صورًا أو مستندات موجودة من جهازك"
|
||||
cameraAccessDenied = "تم رفض الوصول إلى الكاميرا. يرجى تمكين الوصول إلى الكاميرا."
|
||||
back = "رجوع"
|
||||
settings = "الإعدادات"
|
||||
edgeDetection = "اكتشاف الحواف"
|
||||
flashlight = "المصباح"
|
||||
flash = "فلاش"
|
||||
processing = "جارٍ المعالجة..."
|
||||
capture = "التقاط صورة"
|
||||
selectFilesPrompt = "اختر الملفات للرفع"
|
||||
selectImage = "اختر صورة"
|
||||
preview = "معاينة"
|
||||
retake = "إعادة الالتقاط"
|
||||
addToBatch = "إضافة إلى الدفعة"
|
||||
upload = "رفع"
|
||||
batchImages = "دفعة"
|
||||
clearBatch = "مسح"
|
||||
uploadAll = "رفع الكل"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "PDF-də saxlanmamış dəyişiklikləriniz var."
|
||||
pendingRedactionsTitle = "Tətbiq olunmamış məxfiləşdirmələr"
|
||||
pendingRedactions = "Tətbiq olunmamış məxfiləşdirmələriniz var; onlar itiriləcək."
|
||||
areYouSure = "Çıxmaq istədiyinizə əminsiniz?"
|
||||
unsavedChangesTitle = "Saxlanmamış dəyişikliklər"
|
||||
keepWorking = "İşə davam et"
|
||||
discardChanges = "Ləğv et və çıx"
|
||||
discardRedactions = "İmtina et və çıx"
|
||||
applyAndContinue = "Saxla və çıx"
|
||||
exportAndContinue = "İxrac et və davam et"
|
||||
cancel = "Ləğv et"
|
||||
@@ -343,10 +340,6 @@ advance = "Qabaqcıl"
|
||||
edit = "Bax & Redaktə et"
|
||||
popular = "Populyar"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Seçimlər"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Qabaqcıl"
|
||||
title = "Təhlükəsizlik və Autentifikasiya"
|
||||
security = "Təhlükəsizlik"
|
||||
connections = "Bağlantılar"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Lisenziyalaşdırma və Analitika"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Cari versiya"
|
||||
latestVersion = "Ən son versiya"
|
||||
checkForUpdates = "Yeniləmələri yoxla"
|
||||
viewDetails = "Ətraflı bax"
|
||||
serverNeedsUpdate = "Server administrator tərəfindən yenilənməlidir"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Versiya məlumatı"
|
||||
description = "Masaüstü və server versiya detalları"
|
||||
desktop = "Masaüstü versiyası"
|
||||
server = "Server versiyası"
|
||||
|
||||
[settings.security]
|
||||
title = "Təhlükəsizlik"
|
||||
description = "Hesabınızı təhlükəsiz saxlamaq üçün parolunuzu yeniləyin."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Parolunuzu dəyişin. Yenilədikdən sonra çıxış ediləcəksiniz."
|
||||
required = "Bütün sahələr tələb olunur."
|
||||
mismatch = "Yeni parollar uyğun gəlmir."
|
||||
error = "Parolu yeniləmək mümkün olmadı. Cari parolunuzu yoxlayın və yenidən cəhd edin."
|
||||
success = "Parol uğurla yeniləndi. Zəhmət olmasa yenidən daxil olun."
|
||||
ssoDisabled = "Parol dəyişiklikləri kimlik təminatçınız tərəfindən idarə olunur."
|
||||
current = "Cari parol"
|
||||
currentPlaceholder = "Cari parolunuzu daxil edin"
|
||||
new = "Yeni parol"
|
||||
newPlaceholder = "Yeni parol daxil edin"
|
||||
confirm = "Yeni parolu təsdiqləyin"
|
||||
confirmPlaceholder = "Yeni parolunuzu yenidən daxil edin"
|
||||
update = "Parolu yenilə"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Klaviatura qısayolları"
|
||||
@@ -522,16 +488,11 @@ low = "Aşağı"
|
||||
title = "Məlumatları dəyişdirin"
|
||||
header = "Hesab Məlumatlarınızı Yeniləyin"
|
||||
changePassword = "Siz standart giriş məlumatlarından istifadə edirsiniz. Zəhmət olmasa, yeni şifr daxil edin"
|
||||
ssoManaged = "Hesabınız kimlik təminatçınız tərəfindən idarə olunur."
|
||||
newUsername = "Yeni İstifadəçi Adı"
|
||||
oldPassword = "Cari Şifr"
|
||||
newPassword = "Yeni Şifr"
|
||||
confirmNewPassword = "Yeni Şifri Təsdiqləyin"
|
||||
submit = "Dəyişiklikləri Təsdiqlə"
|
||||
credsUpdated = "Hesab yeniləndi"
|
||||
description = "Dəyişikliklər yadda saxlanıldı. Zəhmət olmasa yenidən daxil olun."
|
||||
error = "İstifadəçi adını yeniləmək mümkün olmadı. Zəhmət olmasa parolunuzu yoxlayın və yenidən cəhd edin."
|
||||
changeUsername = "İstifadəçi adınızı yeniləyin. Yenilədikdən sonra çıxış ediləcəksiniz."
|
||||
|
||||
[account]
|
||||
title = "Hesab Parametrləri"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Hesab Parametrləri"
|
||||
adminSettings = "Admin Paramterləri - İstifadəçilər Əlavə Et və Onlara Bax"
|
||||
userControlSettings = "İstifadəçi İdarəetmə Parametrləri"
|
||||
changeUsername = "İstifadəçi Adını Dəyiş"
|
||||
changeUsernameDescription = "İstifadəçi adınızı yeniləyin. Yenilədikdən sonra çıxış ediləcəksiniz."
|
||||
newUsernamePlaceholder = "Yeni istifadəçi adınızı daxil edin"
|
||||
newUsername = "Yeni İstifadəçi Adı"
|
||||
password = "Təsdiqləmə Şifri"
|
||||
oldPassword = "Keçmiş Şifr"
|
||||
@@ -749,11 +708,6 @@ tags = "imza,avtoqraf"
|
||||
title = "İmzala"
|
||||
desc = "Mətn, şəkil və ya əllə çəkmə üsulu ilə PDF-ə imza əlavə edir"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotasiya,vurğulama,çəkmə"
|
||||
title = "Annotasiya"
|
||||
desc = "Vurğulayın, çəkin, qeydlər və fiqurlar əlavə edin görüntüləyicidə"
|
||||
|
||||
[home.flatten]
|
||||
tags = "sadələşdir,sil,interaktiv"
|
||||
title = "Sadələşdir"
|
||||
@@ -965,7 +919,7 @@ title = "Üst-Üstə Qoy"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF Mətn Redaktoru"
|
||||
desc = "Qruplaşdırılmış mətn redaktəsi və PDF yenidən yaradılması ilə Stirling PDF JSON ixraclarını nəzərdən keçirin və redaktə edin"
|
||||
desc = "PDF-lərin içindəki mövcud mətn və şəkilləri redaktə edin"
|
||||
|
||||
[home.addText]
|
||||
tags = "mətn,şərh,etiket"
|
||||
@@ -976,7 +930,6 @@ desc = "PDF faylınıza istənilən yerə mətn əlavə edin"
|
||||
addFiles = "Fayllar əlavə et"
|
||||
uploadFromComputer = "Kompüterdən yüklə"
|
||||
openFromComputer = "Komputerdən aç"
|
||||
mobileUpload = "Mobil cihazdan yüklə"
|
||||
|
||||
[viewPdf]
|
||||
tags = "bax,oxu,sitat götür,mətn,şəkil"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ to PDF seçimləri"
|
||||
optimizeForEbook = "PDF-i e-oxuyucular üçün optimallaşdır (Ghostscript istifadə olunur)"
|
||||
cbzOutputOptions = "PDF to CBZ seçimləri"
|
||||
cbzDpi = "Şəkil göstərilməsi üçün DPI"
|
||||
cbrOptions = "CBR seçimləri"
|
||||
cbrOutputOptions = "PDF-dən CBR-ə seçimlər"
|
||||
cbrDpi = "Şəkil göstərilməsi üçün DPI"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook-dan PDF-ə seçimlər"
|
||||
ebookOptionsDesc = "eBook-ları PDF-ə çevirmə üçün seçimlər"
|
||||
embedAllFonts = "Bütün şriftləri daxil et"
|
||||
embedAllFontsDesc = "eBook-dakı bütün şriftləri yaradılan PDF-ə daxil et"
|
||||
includeTableOfContents = "Mündəricatı daxil et"
|
||||
includeTableOfContentsDesc = "Nəticə PDF-ə yaradılmış mündəricat əlavə edin"
|
||||
includePageNumbers = "Səhifə nömrələrini daxil et"
|
||||
includePageNumbersDesc = "Yaradılan PDF-ə səhifə nömrələri əlavə edin"
|
||||
optimizeForEbookPdf = "eBook oxuyucular üçün optimallaşdır"
|
||||
optimizeForEbookPdfDesc = "PDF-i eBook oxuma üçün optimallaşdır (kiçik fayl ölçüsü, eInk cihazlarda daha yaxşı göstərmə)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF-dən eBook-a seçimlər"
|
||||
epubOptionsDesc = "PDF-i EPUB/AZW3-ə çevirmə üçün seçimlər"
|
||||
detectChapters = "Fəsilləri aşkar et"
|
||||
detectChaptersDesc = "Fəsilə bənzər başlıqları aşkar edib EPUB səhifə qırılmaları əlavə et"
|
||||
targetDevice = "Hədəf cihaz"
|
||||
targetDeviceDesc = "Oxuyucu cihaz üçün optimallaşdırılmış çıxış profilini seçin"
|
||||
outputFormat = "Çıxış formatı"
|
||||
outputFormatDesc = "eBook üçün çıxış formatını seçin"
|
||||
tabletPhone = "Planşet/Telefon (şəkillərlə)"
|
||||
kindleEink = "Kindle e-Ink (mətn üçün optimallaşdırılıb)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "çevirmə,şəkil,jpg,fotoşəkil,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Əlavə et"
|
||||
remove = "Əlavəni sil"
|
||||
embed = "Əlavəni yerləşdir"
|
||||
convertToPdfA3b = "PDF/A-3b-ə çevir"
|
||||
convertToPdfA3bDescription = "Daxil edilmiş qoşmalarla arxivləmə üçün PDF yaradır"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b uzunmüddətli saxlanmanı təmin edən arxiv formatıdır. Qoşma kimi istənilən fayl formatlarının əlavə edilməsinə imkan verir. Çevirmə üçün Ghostscript tələb olunur və böyük fayllar üçün daha uzun çəkə bilər."
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b çevirməsi haqqında"
|
||||
convertToPdfA3bTooltipTitle = "Nə edir"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Saxlanmış"
|
||||
label = "İmza şəklini yüklə"
|
||||
placeholder = "Şəkil faylı seç"
|
||||
hint = "İmzanızın PNG və ya JPG şəklini yükləyin"
|
||||
removeBackground = "Ağ arxa fonu sil (şəffaf et)"
|
||||
processing = "Şəkil emal edilir..."
|
||||
backgroundRemovalFailedTitle = "Arxa fonun silinməsi alınmadı"
|
||||
backgroundRemovalFailedMessage = "Şəkildən arxa fonu silmək mümkün olmadı. Əvəzində orijinal şəkildən istifadə ediləcək."
|
||||
|
||||
[sign.instructions]
|
||||
title = "İmza necə əlavə olunur"
|
||||
@@ -2434,11 +2351,6 @@ note = "Yastılaşdırma PDF-dəki interaktiv elementləri silir və onları red
|
||||
label = "Yalnız formaları düzəldin"
|
||||
desc = "Yalnız forma sahələrini yastılaşdırın, digər interaktiv elementlər toxunulmaz qalsın"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Render DPI-si (ixtiyari, tövsiyə 150 DPI)"
|
||||
help = "Sistem susmaya görə dəyərini istifadə etmək üçün boş buraxın. Yüksək DPI çıxışı kəskinləşdirir, lakin emal vaxtını və fayl ölçüsünü artırır."
|
||||
placeholder = "məs. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Yastılaşdırma nəticələri"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Pdf-ləri Kəs"
|
||||
submit = "Təsdiq Et"
|
||||
noFileSelected = "Kəsməyə başlamaq üçün bir PDF faylı seçin"
|
||||
reset = "Tam PDF-ə sıfırla"
|
||||
autoCrop = "Boşluqları avtomatik qırp"
|
||||
|
||||
[crop.preview]
|
||||
title = "Kəsmə sahəsinin seçimi"
|
||||
@@ -3244,7 +3155,6 @@ title = "Məxfiləşdirmə üsulu"
|
||||
mode = "Rejim"
|
||||
automatic = "Avtomatik"
|
||||
automaticDesc = "Axtarış terminlərinə əsasən mətni məxfiləşdirin"
|
||||
automaticDisabledTooltip = "Birdən çox faylı birdən məxfiləşdirmək üçün fayl idarəçisində faylları seçin"
|
||||
manual = "Əl ilə"
|
||||
manualDesc = "Müəyyən sahələri məxfiləşdirmək üçün klikləyin və sürüşdürün"
|
||||
manualComingSoon = "Əl ilə məxfiləşdirmə tezliklə"
|
||||
@@ -3315,35 +3225,8 @@ text = "Yalnız tam sözlərə uyğun gəlsin, qismən uyğunluqları tutmasın.
|
||||
title = "PDF-Image-ə çevir"
|
||||
text = "Məxfiləşdirmədən sonra PDF-i şəkil əsaslı PDF-ə çevirir. Bu, məxfiləşdirmə qutularının arxasındakı mətnin tamamilə silinib bərpaolunmaz olmasını təmin edir."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Əl ilə məxfiləşdirmə idarələri"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Mətni işarələmə aləti"
|
||||
text = "Məxfiləşdirmək üçün mətni PDF üzərində birbaşa seçin. Məxfiləşdirmək istədiyiniz konkret mətni vurğulamaq üçün klikləyib sürüşdürün."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Sahəni işarələmə aləti"
|
||||
text = "Məxfiləşdirmə üçün PDF üzərində düzbucaqlı sahələr çəkin. Şəkillər, imzalar və ya nizamsız fiqurları məxfiləşdirmək üçün faydalıdır."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Məxfiləşdirmələri tətbiq et"
|
||||
text = "Məzmunu işarələdikdən sonra 'Tətbiq et' düyməsinə klikləyin ki, bütün işarəli sahələr daimi məxfiləşdirilsin. Gözləyən say neçə məxfiləşdirmənin tətbiqə hazır olduğunu göstərir."
|
||||
bullet1 = "Tətbiq etməzdən əvvəl lazım olduğu qədər sahə işarələyin"
|
||||
bullet2 = "Bütün gözləyən məxfiləşdirmələr eyni anda tətbiq olunur"
|
||||
bullet3 = "Tətbiqdən sonra məxfiləşdirmələri geri qaytarmaq olmur"
|
||||
|
||||
[redact.manual]
|
||||
title = "Məxfiləşdirmə alətləri"
|
||||
instructions = "Məxfiləşdirmə üçün məzmunu işarələmək məqsədilə PDF-də mətn seçin və ya sahələr çəkin."
|
||||
markText = "Mətni işarələ"
|
||||
markArea = "Sahəni işarələ"
|
||||
pendingLabel = "Gözləyir:"
|
||||
applyWarning = "⚠️ Daimi tətbiqdir, geri qaytarıla bilməz və altındakı məlumat silinəcək"
|
||||
apply = "Tətbiq et"
|
||||
noMarks = "Məxfiləşdirmə işarələri yoxdur. Məxfiləşdirmək üçün yuxarıdakı alətlərdən istifadə edin."
|
||||
header = "Əl ilə məxfiləşdirmə"
|
||||
controlsTitle = "Əl ilə məxfiləşdirmə idarələri"
|
||||
textBasedRedaction = "Mətn əsaslı məxfiləşdirmə"
|
||||
pageBasedRedaction = "Səhifə əsaslı məxfiləşdirmə"
|
||||
convertPDFToImageLabel = "PDF-i PDF-Image-ə çevir (Qutunun arxasındakı mətni silmək üçün istifadə olunur)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Üfüqi bölmələrin sayını daxil edin"
|
||||
label = "Şaquli bölmələr"
|
||||
placeholder = "Şaquli bölmələrin sayını daxil edin"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Bölmə rejimi"
|
||||
description = "Səhifələri necə bölmək istədiyinizi seçin"
|
||||
splitAll = "Bütün səhifələri böl"
|
||||
splitAllExceptFirst = "Birincidən başqa hamısını böl"
|
||||
splitAllExceptLast = "Sonuncudan başqa hamısını böl"
|
||||
splitAllExceptFirstAndLast = "Birinci və sonuncudan başqa hamısını böl"
|
||||
custom = "Fərdi səhifələr"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Fərdi səhifə nömrələri"
|
||||
placeholder = "məs. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Möhür, Şəkil əlavə et, şəkli ortala, Watermark, PDF, Embed, Fərdiləşdir"
|
||||
header = "PDF-i Möhürlə"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Fayl Ölçüsü"
|
||||
[compress.grayscale]
|
||||
label = "Sıxma üçün Boz Rəng Tətbiq Edin"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Sürətli veb görüntüləmə üçün PDF-i linearlaşdır"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Şəkilləri xətt qrafikasına çevir"
|
||||
description = "Maksimum ölçü azaldılması üçün ImageMagick istifadə edərək səhifələri yüksək kontrastlı ağ-qara edir."
|
||||
unavailable = "ImageMagick bu serverdə quraşdırılmayıb və ya aktiv deyil"
|
||||
detailLevel = "Detallar səviyyəsi"
|
||||
edgeEmphasis = "Kənar vurğulaması"
|
||||
edgeLow = "Yumşaq"
|
||||
edgeMedium = "Balanslı"
|
||||
edgeHigh = "Güclü"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Sıxma ayarlarına ümumi baxış"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Yüksək dəyərlər fayl ölçüsünü azaldır"
|
||||
title = "Boz tonlama"
|
||||
text = "Bütün şəkilləri ağ-qara çevirmək üçün bu seçimi seçin; xüsusilə skan edilmiş PDF-lər və ya şəkil çox olan sənədlər üçün fayl ölçüsünü əhəmiyyətli dərəcədə azalda bilər."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Xətt qrafikası"
|
||||
text = "ImageMagick vasitəsilə səhifələri yüksək kontrastlı ağ-qara rəngə çevirir. Detallar səviyyəsi ilə nə qədər məzmunun qara olacağını, kənar vurğulaması ilə isə kənarların nə dərəcədə aqressiv aşkarlanacağını idarə edin."
|
||||
|
||||
[compress.error]
|
||||
failed = "PDF sıxılarkən xəta baş verdi."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "PDF sıxılarkən xəta baş verdi."
|
||||
_value = "Sıxma ayarları"
|
||||
1 = "1-3 PDF sıxılması,</br> 4-6 yüngül şəkil sıxması,</br> 7-9 güclü şəkil sıxması Şəkil keyfiyyətini əhəmiyyətli dərəcədə azaldacaq"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Aşağı dəyərlər keyfiyyəti qoruyur, lakin daha böyük fayl ölçüsü yaradır"
|
||||
range4to6 = "Orta sıxma, orta keyfiyyət azalması ilə"
|
||||
range7to9 = "Yüksək dəyərlər fayl ölçüsünü əhəmiyyətli dərəcədə azaldır, lakin şəkil aydınlığını azalda bilər"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Bu fayl parol ilə qorunub. Zəhmət olmasa parolu daxil edin:"
|
||||
cancelled = "PDF üçün əməliyyat ləğv edildi: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Seçilmiş səhifələri sil"
|
||||
closePdf = "PDF-i bağla"
|
||||
exportAll = "PDF-i ixrac et"
|
||||
downloadSelected = "Seçilmiş faylları yüklə"
|
||||
annotations = "Annotasiyalar"
|
||||
exportSelected = "Seçilmiş səhifələri ixrac et"
|
||||
saveChanges = "Dəyişiklikləri yadda saxla"
|
||||
downloadAll = "Hamısını yüklə"
|
||||
saveAll = "Hamısını saxla"
|
||||
toggleTheme = "Mövzunu dəyiş"
|
||||
toggleBookmarks = "Əlfəcinləri aç/bağla"
|
||||
language = "Dil"
|
||||
toggleAnnotations = "Annotasiyaların görünməsini dəyiş"
|
||||
search = "PDF-də axtar"
|
||||
panMode = "Sürüşdürmə rejimi"
|
||||
applyRedactionsFirst = "Əvvəlcə məxfiləşdirmələri tətbiq edin"
|
||||
rotateLeft = "Sola döndər"
|
||||
rotateRight = "Sağa döndər"
|
||||
toggleSidebar = "Yan paneli aç/bağla"
|
||||
toggleBookmarks = "Əlfəcinləri aç/bağla"
|
||||
exportSelected = "Seçilmiş səhifələri ixrac et"
|
||||
toggleAnnotations = "Annotasiyaların görünməsini dəyiş"
|
||||
annotationMode = "Annotasiya rejimini dəyiş"
|
||||
print = "PDF-i çap et"
|
||||
draw = "Rəsm çək"
|
||||
redact = "Məxfiləşdir"
|
||||
exitRedaction = "Məxfiləşdirmə rejimindən çıx"
|
||||
save = "Yadda saxla"
|
||||
downloadAll = "Hamısını yüklə"
|
||||
saveAll = "Hamısını saxla"
|
||||
|
||||
[textAlign]
|
||||
left = "Sol"
|
||||
center = "Mərkəz"
|
||||
right = "Sağ"
|
||||
|
||||
[annotation]
|
||||
title = "Annotasiya"
|
||||
desc = "Vurğulama, qələm, mətn və qeydlərdən istifadə edin. Dəyişikliklər canlı qalır — düzləndirməyə ehtiyac yoxdur."
|
||||
highlight = "Vurğula"
|
||||
pen = "Qələm"
|
||||
text = "Mətn qutusu"
|
||||
note = "Qeyd"
|
||||
rectangle = "Düzbucaqlı"
|
||||
ellipse = "Ellips"
|
||||
select = "Seç"
|
||||
exit = "Annotasiya rejimindən çıx"
|
||||
strokeWidth = "Qalınlıq"
|
||||
opacity = "Şəffaflıq"
|
||||
strokeOpacity = "Kontur şəffaflığı"
|
||||
fillOpacity = "Doldurma şəffaflığı"
|
||||
fontSize = "Şrift ölçüsü"
|
||||
chooseColor = "Rəng seçin"
|
||||
color = "Rəng"
|
||||
strokeColor = "Kontur rəngi"
|
||||
fillColor = "Doldurma rəngi"
|
||||
underline = "Altını cız"
|
||||
strikeout = "Üstündən xətt çək"
|
||||
squiggly = "Dalğalı"
|
||||
inkHighlighter = "Sərbəst vurğulayıcı"
|
||||
freehandHighlighter = "Sərbəst vurğulayıcı"
|
||||
square = "Kvadrat"
|
||||
circle = "Dairə"
|
||||
polygon = "Çoxbucaqlı"
|
||||
line = "Xətt"
|
||||
stamp = "Şəkil əlavə et"
|
||||
textMarkup = "Mətn işarələmə"
|
||||
drawing = "Rəsm"
|
||||
shapes = "Fiqurlar"
|
||||
notesStamps = "Qeydlər və möhürlər"
|
||||
settings = "Ayarlar"
|
||||
borderOn = "Kənarlıq: Açıq"
|
||||
borderOff = "Kənarlıq: Bağlı"
|
||||
editInk = "Qələmi redaktə et"
|
||||
editLine = "Xətti redaktə et"
|
||||
editNote = "Qeydi redaktə et"
|
||||
editText = "Mətn qutusunu redaktə et"
|
||||
editTextMarkup = "Mətn işarələməni redaktə et"
|
||||
editSelected = "Annotasiyanı redaktə et"
|
||||
editSquare = "Kvadratı redaktə et"
|
||||
editCircle = "Dairəni redaktə et"
|
||||
editPolygon = "Çoxbucaqlını redaktə et"
|
||||
unsupportedType = "Bu annotasiya növü redaktə üçün tam dəstəklənmir."
|
||||
textAlignment = "Mətnin hizalanması"
|
||||
noteIcon = "Qeyd ikonu"
|
||||
imagePreview = "Ön baxış"
|
||||
contents = "Mətn"
|
||||
backgroundColor = "Arxa fon rəngi"
|
||||
clearBackground = "Arxa fonu sil"
|
||||
noBackground = "Arxa fon yoxdur"
|
||||
stampSettings = "Möhür ayarları"
|
||||
savingCopy = "Endirmə hazırlanır..."
|
||||
saveFailed = "Nüsxəni saxlamaq mümkün olmadı"
|
||||
saveReady = "Endirmə hazırdır"
|
||||
selectAndMove = "Seç və redaktə et"
|
||||
editSelectDescription = "Mövcud annotasiyanın rəngini, şəffaflığını, mətnini və ya ölçüsünü redaktə etmək üçün onu klikləyin."
|
||||
editStampHint = "Şəkli dəyişmək üçün bu möhürü silin və yenisini əlavə edin."
|
||||
editSwitchToSelect = "Bu annotasiyanı redaktə etmək üçün Seç və Redaktə et rejiminə keçin."
|
||||
undo = "Geri al"
|
||||
redo = "Yenidən et"
|
||||
applyChanges = "Dəyişiklikləri tətbiq et"
|
||||
saveChanges = "Dəyişiklikləri yadda saxla"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Ayarlar"
|
||||
adminSettings = "Admin Ayarları"
|
||||
allTools = "All Tools"
|
||||
reader = "Oxuyucu"
|
||||
tours = "Turlar"
|
||||
showMeAround = "Məni gəzdir"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Bələdçiləri buradan izləyin: Alətlər turu, Yeni V2 tərtibat turu və Admin turu."
|
||||
user = "Bələdçiləri buradan izləyin: Alətlər turu və Yeni V2 tərtibat turu."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Alətlər Turu"
|
||||
toolsTourDesc = "Alətlərin nələr etdiyini öyrənin"
|
||||
adminTour = "Admin Turu"
|
||||
adminTourDesc = "Admin ayarlarını və funksiyaları kəşf edin"
|
||||
whatsNewTour = "V2-də yeniliklərə baxın"
|
||||
whatsNewTourDesc = "Yenilənmiş tərtibat turu"
|
||||
|
||||
[admin]
|
||||
error = "Xəta"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Ayarları yükləmək mümkün olmadı"
|
||||
saveError = "Ayarları saxlamaq mümkün olmadı"
|
||||
saved = "Ayarlar uğurla yadda saxlanıldı"
|
||||
saveSuccess = "Ayarlar uğurla yadda saxlanıldı"
|
||||
success = "Ayarlar uğurla yadda saxlanıldı"
|
||||
error = "Ayarları yadda saxlamaq mümkün olmadı"
|
||||
save = "Dəyişiklikləri yadda saxla"
|
||||
discard = "Ləğv et"
|
||||
restartRequired = "Yenidən başlatmaq tələb olunur"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTML-dən PDF-ə çevirmə üçün WeasyPrint icra faylına yol (
|
||||
label = "Unoconvert İcra faylı"
|
||||
description = "Sənəd çevirmələri üçün LibreOffice unoconvert yolunun göstərilməsi (defolt üçün boş saxlayın: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Frontend üçün əsas URL (məs., https://pdf.example.com). E-poçt dəvət linkləri və mobil QR kod yükləmələri üçün istifadə olunur. Boş saxlayın ki, backend URL istifadə edilsin."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Plan detalları üçün klikləyin"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Təhlükəsizlik"
|
||||
description = "Autentifikasiya, giriş davranışı və təhlükəsizlik siyasətlərini konfiqurasiya edin."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Qoşul"
|
||||
disconnect = "Ayır"
|
||||
disconnected = "Provayder uğurla ayrıldı"
|
||||
disconnectError = "Provayderi ayırmaq alınmadı"
|
||||
mobileScannerConvertToPdf = "Şəkilləri PDF-ə çevir"
|
||||
mobileScannerConvertToPdfDesc = "Yüklənən şəkilləri avtomatik olaraq PDF formatına çevir. Deaktiv edilsə, şəkillər olduğu kimi saxlanılacaq."
|
||||
mobileScannerImageResolution = "Şəkil rezolyusiyası"
|
||||
mobileScannerImageResolutionDesc = "Yüklənən şəkillərin rezolyusiyası. \"Azaldılmış\" ölçü fayl ölçüsünü azaltmaq üçün şəkilləri maksimum 1200px-ə miqyaslayır."
|
||||
imageResolutionFull = "Tam (Orijinal ölçü)"
|
||||
imageResolutionReduced = "Azaldılmış (Maks 1200px)"
|
||||
mobileScannerPageFormat = "Səhifə formatı"
|
||||
mobileScannerPageFormatDesc = "Çevrilmiş şəkillər üçün PDF səhifə ölçüsü. \"Saxla\" orijinal şəkil ölçülərindən istifadə edir."
|
||||
pageFormatKeep = "Saxla (Orijinal ölçülər)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Səhifəyə sığdır"
|
||||
mobileScannerStretchToFitDesc = "Şəkilləri bütün səhifəni dolduracaq şəkildə uzat. Deaktiv edilsə, şəkillər nisbət qorunmaqla mərkəzləşdirilir."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO Avto Giriş"
|
||||
@@ -4646,122 +4389,6 @@ description = "İlk SAML2 girişi zamanı istifadəçi hesablarını avtomatik y
|
||||
label = "Qeydiyyatı blokla"
|
||||
description = "SAML2 vasitəsilə yeni istifadəçi qeydiyyatının qarşısını al"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Mobil telefondan yükləmə"
|
||||
enable = "QR kod yükləməsini aktiv et"
|
||||
description = "İstifadəçilərə QR kodu skan edərək mobil cihazlardan fayl yükləməyə icazə verin"
|
||||
note = "Qeyd: Frontend URL konfiqurasiyası tələb olunur. "
|
||||
link = "Sistem ayarlarında konfiqurasiya et"
|
||||
mobileScannerConvertToPdf = "Şəkilləri PDF-ə çevir"
|
||||
mobileScannerConvertToPdfDesc = "Yüklənən şəkilləri avtomatik olaraq PDF formatına çevir. Deaktiv edilsə, şəkillər olduğu kimi saxlanılacaq."
|
||||
mobileScannerImageResolution = "Şəkil rezolyusiyası"
|
||||
mobileScannerImageResolutionDesc = "Yüklənən şəkillərin rezolyusiyası. \"Azaldılmış\" ölçü fayl ölçüsünü azaltmaq üçün şəkilləri maksimum 1200px-ə miqyaslayır."
|
||||
imageResolutionFull = "Tam (Orijinal ölçü)"
|
||||
imageResolutionReduced = "Azaldılmış (Maks 1200px)"
|
||||
mobileScannerPageFormat = "Səhifə formatı"
|
||||
mobileScannerPageFormatDesc = "Çevrilmiş şəkillər üçün PDF səhifə ölçüsü. \"Saxla\" orijinal şəkil ölçülərindən istifadə edir."
|
||||
pageFormatKeep = "Saxla (Orijinal ölçülər)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Səhifəyə sığdır"
|
||||
mobileScannerStretchToFitDesc = "Şəkilləri bütün səhifəni dolduracaq şəkildə uzat. Deaktiv edilsə, şəkillər nisbət qorunmaqla mərkəzləşdirilir."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram botu"
|
||||
description = "Telegram bot bağlantısını, giriş nəzarətlərini və geribildirim davranışını konfiqurasiya edin."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram botunu aktiv et"
|
||||
description = "İstifadəçilərin Stirling PDF ilə konfiqurasiya etdiyiniz Telegram botu vasitəsilə qarşılıqlı əlaqə qurmasına icazə verin."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot istifadəçi adı"
|
||||
description = "Telegram botunuzun ictimai istifadəçi adı."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "Telegram botunuz üçün BotFather tərəfindən verilmiş API tokeni."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Gələnlər qovluğu"
|
||||
description = "Gələn Telegram fayllarının saxlanıldığı pipeline qovluğu altındakı qovluq."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Fərdi qovluq sonluğu istifadə et"
|
||||
description = "Yükləmələri hər söhbət üçün təcrid etmək üçün gələn fayl qovluqlarına söhbət ID-sini əlavə et."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Girişə nəzarət"
|
||||
description = "Bot ilə hansı istifadəçi və ya kanalların qarşılıqlı əlaqədə ola biləcəyini məhdudlaşdırın."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Xüsusi istifadəçi ID-lərinə icazə ver"
|
||||
description = "Aktiv edildikdə, yalnız siyahıdakı istifadəçi ID-ləri botdan istifadə edə bilər."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "İcazə verilmiş istifadəçi ID-ləri"
|
||||
description = "Bot ilə qarşılıqlı əlaqəyə icazə verilən Telegram istifadəçi ID-lərini daxil edin."
|
||||
placeholder = "İstifadəçi ID əlavə edin və enter basın"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Xüsusi kanal ID-lərinə icazə ver"
|
||||
description = "Aktiv edildikdə, yalnız siyahıdakı kanal ID-ləri botdan istifadə edə bilər."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "İcazə verilmiş kanal ID-ləri"
|
||||
description = "Bot ilə qarşılıqlı əlaqəyə icazə verilən Telegram kanal ID-lərini daxil edin."
|
||||
placeholder = "Kanal ID əlavə edin və enter basın"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Emal"
|
||||
description = "Telegram yükləmələri üçün sorğu intervallarını və emal vaxtı limitlərini idarə edin."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Emal vaxt limiti (saniyə)"
|
||||
description = "Xətanı bildirməzdən əvvəl emal işini gözləmək üçün maksimum vaxt."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Sorğu intervalı (ms)"
|
||||
description = "Yeni Telegram yeniləmələrini yoxlama arasındakı interval."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Geribildirim mesajları"
|
||||
description = "Botun istifadəçilərə və kanallara nə vaxt geribildirim göndərməli olduğunu seçin."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Geribildirimi aktiv et"
|
||||
description = "Botun ümumiyyətlə geribildirim mesajları göndərib-göndərməməsinə nəzarət edin."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Kanal geribildirim qaydaları"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "\"No valid document\" göstərin (Kanal)"
|
||||
description = "Kanal yükləmələri üçün 'keçərli sənəd yoxdur' cavabını susdurun."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Emal xətalarını göstərin (Kanal)"
|
||||
description = "Emal xətası mesajlarını kanallara göndərin."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Xəta mesajlarını göstərin (Kanal)"
|
||||
description = "Kanallar üçün ətraflı xəta mesajlarını göstərin."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "İstifadəçi geribildirim qaydaları"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "\"No valid document\" göstərin (İstifadəçi)"
|
||||
description = "İstifadəçi yükləmələri üçün 'keçərli sənəd yoxdur' cavabını susdurun."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Emal xətalarını göstərin (İstifadəçi)"
|
||||
description = "Emal xətası mesajlarını istifadəçilərə göndərin."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Xəta mesajlarını göstərin (İstifadəçi)"
|
||||
description = "İstifadəçilər üçün ətraflı xəta mesajlarını göstərin."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Məlumat Bazası"
|
||||
description = "Müəssisə yerləşdirmələri üçün fərdi məlumat bazası bağlantı ayarlarını konfiqurasiya edin."
|
||||
@@ -4888,7 +4515,7 @@ description = "Daha geniş sistem müvəqqəti qovluğunu təmizləyib-təmizlə
|
||||
label = "Proses İcraedicisi Limitləri"
|
||||
description = "Hər icraedici üçün sessiya limitlərini və taym-outları konfiqurasiya edin"
|
||||
libreOffice = "LibreOffice"
|
||||
pdfToHtml = "PDF to HTML"
|
||||
pdfToHtml = "PDF-dən HTML-ə"
|
||||
qpdf = "QPDF"
|
||||
tesseract = "Tesseract OCR"
|
||||
pythonOpenCv = "Python OpenCV"
|
||||
@@ -4943,10 +4570,6 @@ description = "Adminlərə avtomatik parollarla istifadəçiləri e-poçt vasit
|
||||
label = "Frontend URL"
|
||||
description = "Frontend üçün baza URL (məs. https://pdf.example.com). E-poçtlarda dəvət linklərini yaratmaq üçün istifadə olunur. Boş saxlayın ki, backend URL-i istifadə olunsun."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Qeyd: Frontend URL konfiqurasiyası tələb olunur. "
|
||||
link = "Sistem ayarlarında konfiqurasiya et"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Hüquqi Sənədlər"
|
||||
description = "Hüquqi sənədlərə və siyasətlərə keçidləri konfiqurasiya edin."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Fayllarım"
|
||||
noRecentFiles = "Son fayl tapılmadı"
|
||||
googleDriveNotAvailable = "Google Drive inteqrasiyası mövcud deyil"
|
||||
mobileUpload = "Mobil yükləmə"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "Mobil yükləmə aktiv deyil"
|
||||
downloadSelected = "Seçilmişləri yüklə"
|
||||
saveSelected = "Seçilənləri saxla"
|
||||
openFiles = "Faylları aç"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Yüklənir..."
|
||||
back = "Geri"
|
||||
continue = "Davam et"
|
||||
error = "Xəta"
|
||||
save = "Yadda saxla"
|
||||
|
||||
[config.overview]
|
||||
title = "Tətbiq Konfiqurasiyası"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Hazırda bu açarlardan istifadə edən bütün tətbiqlər və xidmə
|
||||
confirmPrompt = "Davam etmək istədiyinizə əminsiniz?"
|
||||
confirmCta = "Açarları yenilə"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API açarı xətası"
|
||||
failedToCreateApiKey = "API açarı yaratmaq alınmadı."
|
||||
failedToRetrieveApiKey = "Cavabdan API açarını əldə etmək alınmadı."
|
||||
failedToFetchApiKey = "API açarını gətirmək alınmadı."
|
||||
apiKeyRefreshed = "API açarı yeniləndi"
|
||||
apiKeyRefreshedBody = "API açarınız uğurla yeniləndi."
|
||||
failedToRefreshApiKey = "API açarını yeniləmək alınmadı."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Qoşmaları seçin"
|
||||
info = "PDF-inizə əlavə etmək üçün faylları seçin. Bu fayllar daxil ediləcək və PDF-in qoşmalar panelindən əlçatan olacaq."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Bitir"
|
||||
startTour = "Tura başla"
|
||||
startTourDescription = "Stirling PDF-in əsas xüsusiyyətləri üzrə bələdçili tura başlayın"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Reader, Automate, fayllarınız və bütün turlar arasında keçmək üçün <strong>Tez Giriş</strong> panelindən başlayın."
|
||||
leftPanel = "Sol <strong>Alətlər</strong> paneli edə biləcəyiniz hər şeyi siyahıya alır. Kateqoriyalara baxın və ya tez alət tapmaq üçün axtarın."
|
||||
fileUpload = "<strong>Fayllar</strong> düyməsindən PDF yükləyin və ya son faylı seçin. İş sahəsini görə bilməyiniz üçün nümunə yükləyəcəyik."
|
||||
rightRail = "<strong>Sağ Panel</strong> fayl seçimi, mövzu və dili dəyişmək və nəticələri endirmək üçün sürətli hərəkətləri saxlayır."
|
||||
topBar = "Yuxarı panel <strong>Görüntüləyici</strong>, <strong>Səhifə Redaktoru</strong> və <strong>Aktiv Fayllar</strong> arasında keçməyə imkan verir."
|
||||
pageEditorView = "Səhifələri yenidən sıralamaq, çevirmək və ya silmək üçün Səhifə Redaktoruna keçin."
|
||||
activeFilesView = "Açıq olan hər şeyə baxmaq və işləyəcəyinizi seçmək üçün Aktiv Fayllardan istifadə edin."
|
||||
wrapUp = "V2-də yeniliklər bunlardır. <strong>Turlar</strong> menyusunu istənilən vaxt açaraq bunu, Alətlər turunu və ya Admin turunu yenidən izləyə bilərsiniz."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Stirling PDF-ə xoş gəlmisiniz!"
|
||||
description = "Əsas xüsusiyyətləri və necə başlamağı öyrənmək üçün 1 dəqiqəlik qısa tura baxmaq istəyirsiniz?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Yüklə →"
|
||||
showMeAround = "Turu göstər"
|
||||
skipTheTour = "Turu keç"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Tur icmalı"
|
||||
body = "Stirling PDF V2 onlarca alət və yenilənmiş tərtibatla gəlir. Sürətli turla nələrin dəyişdiyini və lazım olan funksiyaları harada tapacağınızı görün."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Hələlik ötür"
|
||||
seePlans = "Planlara baxın →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "İndi yüksəlt →"
|
||||
freeTitle = "Server lisenziyası"
|
||||
overLimitTitle = "Server lisenziyası tələb olunur"
|
||||
overLimitBody = "Lisenziyalaşmamız hər server üçün pulsuz olaraq maksimum <strong>{{freeTierLimit}}</strong> istifadəçiyə icazə verir. Sizdə <strong>{{overLimitUserCopy}}</strong> Stirling istifadəçisi var. Fasiləsiz davam etmək üçün Stirling Server planına yüksəldin - <strong>limitsiz yerlər</strong>, PDF mətn redaktəsi və tam admin nəzarəti cəmi $99/server/ay."
|
||||
freeBody = "Bizim <strong>Open-Core</strong> lisenziyası hər server üçün pulsuz olaraq maksimum <strong>{{freeTierLimit}}</strong> istifadəçiyə icazə verir. Fasiləsiz miqyaslanmaq və yeni <strong>PDF mətn redaktəsi alətimizə</strong> erkən çıxış əldə etmək üçün Stirling Server planını tövsiyə edirik — tam redaktə və <strong>limitsiz yerlər</strong> $99/server/ay."
|
||||
freeBody = "Bizim <strong>Open-Core</strong> lisenziyalaşdırmamız hər server üçün pulsuz olaraq ən çox <strong>{{freeTierLimit}}</strong> istifadəçiyə icazə verir. Fasiləsiz miqyaslama üçün Stirling Server planını tövsiyə edirik - <strong>limitsiz yerlər</strong> və <strong>SSO dəstəyi</strong> $99/server/ay."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Yüklə"
|
||||
@@ -5847,8 +5443,8 @@ emailDisabled = "E-poçt dəvətləri üçün ayarlarda SMTP konfiqurasiyası v
|
||||
[workspace.people.license]
|
||||
users = "istifadəçi"
|
||||
availableSlots = "Mövcud yerlər"
|
||||
grandfathered = "Grandfathered"
|
||||
grandfatheredShort = "{{count}} grandfathered"
|
||||
grandfathered = "Əvvəlki şərtlərlə"
|
||||
grandfatheredShort = "{{count}} əvvəlki şərtlərlə"
|
||||
fromLicense = "lisenziyadan"
|
||||
slotsAvailable = "{{count}} istifadəçi yeri mövcuddur"
|
||||
noSlotsAvailable = "Mövcud yer yoxdur"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Satışla əlaqə"
|
||||
contactToUpgrade = "Planınızı yüksəltmək və ya fərdiləşdirmək üçün bizimlə əlaqə saxlayın"
|
||||
maxUsers = "Maksimum İstifadəçi"
|
||||
upTo = "Maksimum"
|
||||
getLicense = "Server lisenziyası al"
|
||||
upgradeToEnterprise = "Enterprise-a yüksəlt"
|
||||
selectPeriod = "Faktura dövrünü seçin"
|
||||
monthlyBilling = "Aylıq ödəniş"
|
||||
yearlyBilling = "İllik ödəniş"
|
||||
checkoutOpened = "Ödəniş səhifəsi açıldı"
|
||||
checkoutInstructions = "Ödənişi Stripe vərəqəsində tamamlayın. Ödənişdən sonra buraya qayıdın və lisenziyanı aktivləşdirmək üçün səhifəni yeniləyin. Lisenziya açarı olan e-poçt da alacaqsınız."
|
||||
activateLicense = "Lisenziyanızı aktivləşdirin"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Yeni vərəqədə ödəniş açıldı"
|
||||
instructions = "Ödənişi Stripe vərəqəsində tamamlayın. Ödəniş tamamlandıqdan sonra lisenziya açarı e-poçtunu alacaqsınız."
|
||||
enterKey = "Planınızı aktivləşdirmək üçün aşağıya lisenziya açarınızı daxil edin:"
|
||||
keyDescription = "E-poçtunuzdakı lisenziya açarını yapışdırın"
|
||||
activate = "Lisenziyanı aktivləşdir"
|
||||
doLater = "Bunu sonra edəcəyəm"
|
||||
success = "Lisenziya aktivləşdirildi!"
|
||||
successMessage = "Lisenziyanız uğurla aktivləşdirildi. Bu pəncərəni indi bağlaya bilərsiniz."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "E-poçtun təsdiqi tələb olunur"
|
||||
message = "Stripe ödəniş portalında e-poçt ünvanınızı təsdiqləməyiniz lazım olacaq. Giriş linki üçün e-poçtunuzu yoxlayın."
|
||||
|
||||
[plan.period]
|
||||
month = "ay"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Audit sistemi əlçatan deyil"
|
||||
notAvailableMessage = "Audit sistemi konfiqurasiya edilməyib və ya əlçatan deyil."
|
||||
disabled = "Audit jurnalı deaktiv edilib"
|
||||
disabledMessage = "Sistem hadisələrini izləmək üçün tətbiqin konfiqurasiyasında audit jurnalını aktivləşdirin."
|
||||
enterpriseRequired = "Enterprise lisenziyası tələb olunur"
|
||||
enterpriseRequiredMessage = "Audit jurnalı sistemi enterprise funksiyadır. Audit qeydləri və analitikaya giriş üçün zəhmət olmasa enterprise lisenziyaya yüksəldin."
|
||||
|
||||
[audit.error]
|
||||
title = "Audit sistemi yüklənərkən xəta"
|
||||
@@ -6370,7 +5942,6 @@ description = "Öz Stirling PDF serverinizin tam URL ünvanını daxil edin"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Zəhmət olmasa server URL-i daxil edin"
|
||||
invalidUrl = "Yanlış URL formatı. Zəhmət olmasa https://your-server.com kimi düzgün URL daxil edin"
|
||||
unreachable = "Serverə qoşulmaq mümkün olmadı"
|
||||
testFailed = "Bağlantı testi uğursuz oldu"
|
||||
configFetch = "Server konfiqurasiyasını əldə etmək mümkün olmadı. URL-i yoxlayın və yenidən cəhd edin."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Qoşulur:"
|
||||
submit = "Daxil ol"
|
||||
signInWith = "Bununla daxil ol"
|
||||
oauthPending = "Təsdiqləmə üçün brauzer açılır..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Və ya e-poçt ilə davam edin"
|
||||
serverRequirement = "Qeyd: Serverdə giriş funksiyası aktiv olmalıdır."
|
||||
showInstructions = "Necə aktivləşdirmək olar?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Dəyişiklikləri sıfırla"
|
||||
downloadJson = "JSON-u endir"
|
||||
generatePdf = "PDF yarat"
|
||||
saveChanges = "Dəyişiklikləri yadda saxla"
|
||||
applyChanges = "Dəyişiklikləri tətbiq et"
|
||||
downloadCopy = "Nüsxəni endir"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Mətni avtomatik miqyasla"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Məsləhət: Mətn qutularını çoxseçim üçün Ctrl (Cm
|
||||
title = "Redaktə olunmuş mətni tək PDF elementinə kilidlə"
|
||||
description = "Aktiv olduqda, redaktor hər redaktə edilmiş mətn qutusunu üst-üstə düşən qliflərdən və ya qarışıq şriftlərdən qaçmaq üçün bir PDF mətn elementi kimi ixrac edir."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Qabaqcıl ayarlar"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Ön baxış məhdudiyyətləri"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Mətn və şəkil fokuslanması"
|
||||
text = "Bu iş sahəsi mətni redaktə etməyə və daxil edilmiş şəkilləri yenidən yerləşdirməyə fokuslanır. Mürəkkəb səhifə qrafikası, forma vidcetləri və laylı qrafika ixrac üçün qorunur, lakin burada tam redaktə edilə bilmir."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Ön baxış fərqliliyi"
|
||||
text = "Bəzi vizuallar (məsələn, cədvəl haşiyələri, fiqurlar və ya annotasiya görünüşləri) ön baxışda dəqiq göstərilməyə bilər. İxrac olunan PDF mümkün olduqda orijinal cızma əmrlərini saxlayır."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alfa görüntüləyici"
|
||||
text = "Bu alfa görüntüləyici hələ inkişaf edir—bəzi şriftlər, rənglər, şəffaflıq effektləri və maket detalları bir qədər dəyişə bilər. Zəhmət olmasa paylaşmazdan əvvəl yaradılan PDF-i iki dəfə yoxlayın."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Seçilmiş qutuları birləşdir"
|
||||
merge = "Seçimi birləşdir"
|
||||
@@ -6614,58 +6164,3 @@ title = "Mətn əlavə etmə nəticələri"
|
||||
|
||||
[addText.error]
|
||||
failed = "PDF-ə mətn əlavə edilərkən xəta baş verdi."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Mobil cihazdan yüklə"
|
||||
description = "Skan edib fotoları yükləyin. Şəkillər avtomatik olaraq PDF-ə çevrilir."
|
||||
descriptionNoConvert = "Mobil cihazınızdan fotoları yükləmək üçün skan edin."
|
||||
error = "Bağlantı xətası"
|
||||
pollingError = "Faylları yoxlayarkən xəta"
|
||||
sessionId = "Sessiya ID-si"
|
||||
sessionCreateError = "Sessiya yaratmaq alınmadı"
|
||||
expiryWarning = "Sessiya tezliklə bitir"
|
||||
expiryWarningMessage = "Bu QR kodu {{seconds}} saniyəyə müddəti bitəcək. Yeni kod avtomatik yaradılacaq."
|
||||
filesReceived = "{{count}} fayl alındı"
|
||||
connected = "Mobil cihaz qoşuldu"
|
||||
instructions = "Telefon kameranızla skan edin. Şəkillər avtomatik olaraq PDF-ə çevrilir."
|
||||
instructionsNoConvert = "Fayl yükləmək üçün telefon kameranızla skan edin."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobil skaner"
|
||||
noSession = "Yalnış sessiya"
|
||||
noSessionMessage = "Bu səhifəyə daxil olmaq üçün etibarlı QR kodunu skan edin."
|
||||
validating = "Sessiya yoxlanılır..."
|
||||
sessionInvalid = "Sessiya xətası"
|
||||
sessionExpired = "Bu sessiyanın vaxtı bitib. Yeniləyib yenidən cəhd edin."
|
||||
sessionNotFound = "Sessiya tapılmadı. Yeniləyib yenidən cəhd edin."
|
||||
sessionValidationError = "Sessiyanı doğrulamaq mümkün olmadı. Yenidən cəhd edin."
|
||||
uploadSuccess = "Uğurla yükləndi!"
|
||||
uploadSuccessMessage = "Şəkilləriniz köçürüldü."
|
||||
httpsRequired = "Kameraya çıxış üçün HTTPS və ya localhost tələb olunur. Zəhmət olmasa HTTPS istifadə edin və ya localhost vasitəsilə daxil olun."
|
||||
uploadFailed = "Yükləmə alınmadı. Yenidən cəhd edin."
|
||||
uploading = "Yüklənir..."
|
||||
connected = "Qoşuldu"
|
||||
connecting = "Qoşulur..."
|
||||
chooseMethod = "Yükləmə üsulunu seçin"
|
||||
chooseMethodDescription = "Sənədləri necə skan edib yükləmək istədiyinizi seçin"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Cihazınızın kamerası ilə avtomatik kənar aşkarlanması ilə sənədləri skan edin"
|
||||
fileUpload = "Fayl yükləmə"
|
||||
fileDescription = "Cihazınızdan mövcud fotoları və ya sənədləri yükləyin"
|
||||
cameraAccessDenied = "Kameraya giriş rədd edildi. Zəhmət olmasa kameraya icazə verin."
|
||||
back = "Geri"
|
||||
settings = "Ayarlar"
|
||||
edgeDetection = "Kənar aşkarlanması"
|
||||
flashlight = "Fənər"
|
||||
flash = "Flaş"
|
||||
processing = "Emal olunur..."
|
||||
capture = "Foto çəkin"
|
||||
selectFilesPrompt = "Yükləmək üçün faylları seçin"
|
||||
selectImage = "Şəkil seçin"
|
||||
preview = "Ön baxış"
|
||||
retake = "Yenidən çəkin"
|
||||
addToBatch = "Paketə əlavə et"
|
||||
upload = "Yüklə"
|
||||
batchImages = "Paket"
|
||||
clearBatch = "Təmizlə"
|
||||
uploadAll = "Hamısını yüklə"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Имате незаписани промени във вашия PDF."
|
||||
pendingRedactionsTitle = "Неприложени заличавания"
|
||||
pendingRedactions = "Имате неприложени заличавания, които ще бъдат загубени."
|
||||
areYouSure = "Сигурни ли сте, че искате да напуснете?"
|
||||
unsavedChangesTitle = "Незаписани промени"
|
||||
keepWorking = "Продължи работа"
|
||||
discardChanges = "Отхвърли и излез"
|
||||
discardRedactions = "Отхвърляне и изход"
|
||||
applyAndContinue = "Запази и излез"
|
||||
exportAndContinue = "Експортирай и продължи"
|
||||
cancel = "Отказ"
|
||||
@@ -343,10 +340,6 @@ advance = "Разширено"
|
||||
edit = "Преглед и редактиране"
|
||||
popular = "Популярни"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Предпочитания"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Разширени"
|
||||
title = "Сигурност и удостоверяване"
|
||||
security = "Сигурност"
|
||||
connections = "Връзки"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Лицензиране и аналитика"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Текуща версия"
|
||||
latestVersion = "Последна версия"
|
||||
checkForUpdates = "Провери за актуализации"
|
||||
viewDetails = "Виж подробности"
|
||||
serverNeedsUpdate = "Сървърът трябва да бъде актуализиран от администратор"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Информация за версията"
|
||||
description = "Подробности за версиите на десктоп и сървър"
|
||||
desktop = "Десктоп версия"
|
||||
server = "Сървърна версия"
|
||||
|
||||
[settings.security]
|
||||
title = "Сигурност"
|
||||
description = "Актуализирайте паролата си, за да запазите акаунта си защитен."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Променете паролата си. След актуализиране ще бъдете изведени от профила."
|
||||
required = "Всички полета са задължителни."
|
||||
mismatch = "Новите пароли не съвпадат."
|
||||
error = "Неуспешно актуализиране на парола. Проверете текущата си парола и опитайте отново."
|
||||
success = "Паролата е актуализирана успешно. Моля, влезте отново."
|
||||
ssoDisabled = "Промените на паролата се управляват от вашия доставчик на удостоверяване."
|
||||
current = "Текуща парола"
|
||||
currentPlaceholder = "Въведете текущата си парола"
|
||||
new = "Нова парола"
|
||||
newPlaceholder = "Въведете нова парола"
|
||||
confirm = "Потвърдете новата парола"
|
||||
confirmPlaceholder = "Въведете отново новата си парола"
|
||||
update = "Актуализиране на паролата"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Клавишни комбинации"
|
||||
@@ -522,16 +488,11 @@ low = "Нисък"
|
||||
title = "Промяна на идентификационните данни"
|
||||
header = "Актуализирайте данните за акаунта си"
|
||||
changePassword = "Използвате идентификационни данни за вход по подразбиране. Моля, въведете нова парола"
|
||||
ssoManaged = "Вашият акаунт се управлява от вашия доставчик на удостоверяване."
|
||||
newUsername = "Ново потребителско име"
|
||||
oldPassword = "Текуща парола"
|
||||
newPassword = "Нова парола"
|
||||
confirmNewPassword = "Подтвърдете новата парола"
|
||||
submit = "Изпращане на промените"
|
||||
credsUpdated = "Акаунтът е актуализиран"
|
||||
description = "Промените са записани. Моля, влезте отново."
|
||||
error = "Неуспешно актуализиране на потребителското име. Проверете паролата си и опитайте отново."
|
||||
changeUsername = "Актуализирайте потребителското си име. След актуализиране ще бъдете изведени от профила."
|
||||
|
||||
[account]
|
||||
title = "Настройки на акаунта"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Настройки на акаунта"
|
||||
adminSettings = "Настройки на администратора - Преглед и добавяне на потребители"
|
||||
userControlSettings = "Настройки за потребителски контрол"
|
||||
changeUsername = "Промени потребител"
|
||||
changeUsernameDescription = "Актуализирайте потребителското си име. След актуализиране ще бъдете изведени от профила."
|
||||
newUsernamePlaceholder = "Въведете новото си потребителско име"
|
||||
newUsername = "Ново потребителско име"
|
||||
password = "Парола за потвърждение"
|
||||
oldPassword = "Стара парола"
|
||||
@@ -749,11 +708,6 @@ tags = "подпис,автограф"
|
||||
title = "Подпишете"
|
||||
desc = "Добавя подпис към PDF чрез рисунка, текст или изображение"
|
||||
|
||||
[home.annotate]
|
||||
tags = "анотиране,открояване,рисуване"
|
||||
title = "Анотиране"
|
||||
desc = "Откроявайте, рисувайте, добавяйте бележки и форми във визуализатора"
|
||||
|
||||
[home.flatten]
|
||||
tags = "опростяване,премахване,интерактивни"
|
||||
title = "Изравняване"
|
||||
@@ -964,8 +918,8 @@ desc = "Наслагва PDF файлове върху друг PDF"
|
||||
title = "Наслагване PDF-и"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF текстов редактор"
|
||||
desc = "Преглеждайте и редактирайте JSON експорти на Stirling PDF с групово редактиране на текст и повторно генериране на PDF"
|
||||
title = "Редактор на текст в PDF"
|
||||
desc = "Редактирайте съществуващ текст и изображения в PDF файлове"
|
||||
|
||||
[home.addText]
|
||||
tags = "текст,анотация,етикет"
|
||||
@@ -976,7 +930,6 @@ desc = "Добавете собствен текст навсякъде в PDF"
|
||||
addFiles = "Добавяне на файлове"
|
||||
uploadFromComputer = "Качване от компютър"
|
||||
openFromComputer = "Отвори от компютър"
|
||||
mobileUpload = "Качване от мобилно устройство"
|
||||
|
||||
[viewPdf]
|
||||
tags = "преглед,четене,анотиране,текст,изображение"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Опции за CBZ към PDF"
|
||||
optimizeForEbook = "Оптимизиране на PDF за четци на електронни книги (използва Ghostscript)"
|
||||
cbzOutputOptions = "Опции за PDF към CBZ"
|
||||
cbzDpi = "DPI за изобразяване на изображение"
|
||||
cbrOptions = "Опции за CBR"
|
||||
cbrOutputOptions = "Опции за PDF към CBR"
|
||||
cbrDpi = "DPI за рендериране на изображения"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Опции за eBook към PDF"
|
||||
ebookOptionsDesc = "Опции за конвертиране на eBook към PDF"
|
||||
embedAllFonts = "Вграждане на всички шрифтове"
|
||||
embedAllFontsDesc = "Вграждане на всички шрифтове от eBook във генерирания PDF"
|
||||
includeTableOfContents = "Включване на съдържание"
|
||||
includeTableOfContentsDesc = "Добавяне на генерирано съдържание към получения PDF"
|
||||
includePageNumbers = "Включване на номера на страници"
|
||||
includePageNumbersDesc = "Добавяне на номера на страници към генерирания PDF"
|
||||
optimizeForEbookPdf = "Оптимизиране за eBook четци"
|
||||
optimizeForEbookPdfDesc = "Оптимизиране на PDF за четене на eBook (по-малък размер на файла, по-добро рендериране на eInk устройства)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Опции за PDF към eBook"
|
||||
epubOptionsDesc = "Опции за конвертиране на PDF към EPUB/AZW3"
|
||||
detectChapters = "Откриване на глави"
|
||||
detectChaptersDesc = "Откриване на заглавия, които изглеждат като глави, и вмъкване на прекъсвания на страници в EPUB"
|
||||
targetDevice = "Целево устройство"
|
||||
targetDeviceDesc = "Изберете изходен профил, оптимизиран за устройството-четец"
|
||||
outputFormat = "Формат на изхода"
|
||||
outputFormatDesc = "Изберете изходния формат за eBook"
|
||||
tabletPhone = "Таблет/Телефон (с изображения)"
|
||||
kindleEink = "Kindle e-Ink (оптимизиран за текст)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "преобразуване,img,jpg,изображение,снимка"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Добавяне на прикачен файл"
|
||||
remove = "Премахване на прикачен файл"
|
||||
embed = "Вграждане на прикачен файл"
|
||||
convertToPdfA3b = "Конвертиране в PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Създава архивен PDF с вградени прикачени файлове"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b е архивен формат, който осигурява дългосрочно съхранение. Позволява вграждане на произволни файлови формати като прикачени файлове. Конвертирането изисква Ghostscript и може да отнеме повече време при големи файлове."
|
||||
convertToPdfA3bTooltipHeader = "За конвертирането в PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Какво прави"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Запазени"
|
||||
label = "Качете изображение на подпис"
|
||||
placeholder = "Изберете файл с изображение"
|
||||
hint = "Качете PNG или JPG изображение на вашия подпис"
|
||||
removeBackground = "Премахване на бял фон (прозрачен)"
|
||||
processing = "Обработка на изображението..."
|
||||
backgroundRemovalFailedTitle = "Неуспешно премахване на фона"
|
||||
backgroundRemovalFailedMessage = "Фонът не можа да бъде премахнат. Ще се използва оригиналното изображение."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Как да добавите подпис"
|
||||
@@ -2434,11 +2351,6 @@ note = "Сплескването премахва интерактивните
|
||||
label = "Изравнете само форми"
|
||||
desc = "Сплесквай само полетата на формите, оставяйки другите интерактивни елементи непокътнати"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI на рендериране (по избор, препоръчително 150 DPI)"
|
||||
help = "Оставете празно за системната стойност по подразбиране. По-висок DPI изостря изхода, но увеличава времето за обработка и размера на файла."
|
||||
placeholder = "напр. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Резултати от сплескване"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Изрязване на PDF"
|
||||
submit = "Подайте"
|
||||
noFileSelected = "Изберете PDF файл, за да започнете изрязването"
|
||||
reset = "Нулиране към целия PDF"
|
||||
autoCrop = "Автоматично изрязване на бели полета"
|
||||
|
||||
[crop.preview]
|
||||
title = "Избор на област за изрязване"
|
||||
@@ -3244,7 +3155,6 @@ title = "Метод на заличаване"
|
||||
mode = "Режим"
|
||||
automatic = "Автоматичен"
|
||||
automaticDesc = "Заличаване на текст въз основа на търсене"
|
||||
automaticDisabledTooltip = "Изберете файлове във файловия мениджър, за да заличите няколко файла наведнъж"
|
||||
manual = "Ръчен"
|
||||
manualDesc = "Щракнете и плъзнете, за да заличите конкретни области"
|
||||
manualComingSoon = "Скоро ще бъде налично ръчно заличаване"
|
||||
@@ -3315,35 +3225,8 @@ text = "Съвпада само с цели думи, не с частични.
|
||||
title = "Конвертиране в PDF-Image"
|
||||
text = "Конвертира PDF в PDF на база изображение след заличаване. Това гарантира, че текстът зад полетата за заличаване е напълно премахнат и невъзстановим."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Контроли за ръчно заличаване"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Инструмент за маркиране на текст"
|
||||
text = "Изберете текст директно в PDF, за да го маркирате за заличаване. Щракнете и плъзнете, за да откроите конкретен текст, който искате да заличите."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Инструмент за маркиране на област"
|
||||
text = "Начертайте правоъгълни области върху PDF, за да отбележите зони за заличаване. Полезно за заличаване на изображения, подписи или неправилни форми."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Прилагане на заличаванията"
|
||||
text = "След маркиране на съдържание щракнете „Прилагане“, за да заличите трайно всички маркирани области. Броят на чакащите показва колко заличавания са готови за прилагане."
|
||||
bullet1 = "Маркирайте колкото области е нужно преди прилагане"
|
||||
bullet2 = "Всички чакащи заличавания се прилагат наведнъж"
|
||||
bullet3 = "След прилагане заличаванията не могат да бъдат отменени"
|
||||
|
||||
[redact.manual]
|
||||
title = "Инструменти за заличаване"
|
||||
instructions = "Изберете текст или начертайте области върху PDF, за да маркирате съдържание за заличаване."
|
||||
markText = "Маркиране на текст"
|
||||
markArea = "Маркиране на област"
|
||||
pendingLabel = "Чакащи:"
|
||||
applyWarning = "⚠️ Постоянно прилагане, не може да се отмени и данните отдолу ще бъдат изтрити"
|
||||
apply = "Прилагане"
|
||||
noMarks = "Няма марки за заличаване. Използвайте инструментите по-горе, за да маркирате съдържание за заличаване."
|
||||
header = "Ръчно заличаване"
|
||||
controlsTitle = "Ръчни контроли за заличаване"
|
||||
textBasedRedaction = "Заличаване по текст"
|
||||
pageBasedRedaction = "Заличаване по страници"
|
||||
convertPDFToImageLabel = "Конвертиране на PDF в PDF-Image (за премахване на текст зад полето)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Въведете брой хоризонтални деления
|
||||
label = "Вертикални разделения"
|
||||
placeholder = "Въведете брой вертикални деления"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Режим на разделяне"
|
||||
description = "Изберете как да разделите страниците"
|
||||
splitAll = "Разделяне на всички страници"
|
||||
splitAllExceptFirst = "Разделяне на всички с изключение на първата"
|
||||
splitAllExceptLast = "Разделяне на всички с изключение на последната"
|
||||
splitAllExceptFirstAndLast = "Разделяне на всички с изключение на първата и последната"
|
||||
custom = "Потребителски страници"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Потребителски номера на страници"
|
||||
placeholder = "напр. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Печат,добавяне на изображение,централно изображение,воден знак,PDF,вграждане,персонализиране"
|
||||
header = "Поставяне на печат на PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Размер на файла"
|
||||
[compress.grayscale]
|
||||
label = "Приложи сива скала за компресиране"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Линеаризиране на PDF за бързо уеб преглеждане"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Конвертиране на изображения в Line Art"
|
||||
description = "Използва ImageMagick, за да намали страниците до черно-бяло с висок контраст за максимално намаляване на размера."
|
||||
unavailable = "ImageMagick не е инсталиран или активиран на този сървър"
|
||||
detailLevel = "Ниво на детайл"
|
||||
edgeEmphasis = "Подчертаване на ръбовете"
|
||||
edgeLow = "Леко"
|
||||
edgeMedium = "Баланс"
|
||||
edgeHigh = "Силно"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Преглед на настройките за компресия"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "По-високите стойности намаляват разм
|
||||
title = "Сива скала"
|
||||
text = "Изберете тази опция, за да конвертирате всички изображения в черно-бяло, което може значително да намали размера на файла, особено за сканирани PDF-и или документи с много изображения."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "Конвертирайте страниците в черно-бяло с висок контраст с помощта на ImageMagick. Използвайте нивото на детайл, за да контролирате колко съдържание става черно, и подчертаването на ръбовете, за да контролирате колко агресивно се откриват ръбовете."
|
||||
|
||||
[compress.error]
|
||||
failed = "Възникна грешка при компресиране на PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Възникна грешка при компресиране на PDF
|
||||
_value = "Настройки за компресия"
|
||||
1 = "1-3 компресия на PDF,</br> 4-6 лека компресия на изображения,</br> 7-9 силна компресия на изображения Ще намали значително качеството на изображенията"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "По-ниските стойности запазват качеството, но водят до по-големи файлове"
|
||||
range4to6 = "Средна компресия с умерено намаляване на качеството"
|
||||
range7to9 = "По-високите стойности значително намаляват размера, но може да влошат яснотата на изображенията"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Този файл е защитен с парола. Моля, въведете паролата:"
|
||||
cancelled = "Операцията за PDF е отменена: {0}"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "Изтрий избраните страници"
|
||||
closePdf = "Затвори PDF"
|
||||
exportAll = "Експорт на PDF"
|
||||
downloadSelected = "Изтегли избраните файлове"
|
||||
annotations = "Анотации"
|
||||
exportSelected = "Експорт на избраните страници"
|
||||
saveChanges = "Запази промените"
|
||||
downloadAll = "Изтегли всички"
|
||||
saveAll = "Запази всички"
|
||||
toggleTheme = "Превключи тема"
|
||||
toggleBookmarks = "Превключи отметките"
|
||||
language = "Език"
|
||||
toggleAnnotations = "Показване/скриване на анотациите"
|
||||
search = "Търсене в PDF"
|
||||
panMode = "Режим на придвижване"
|
||||
applyRedactionsFirst = "Първо приложете заличаванията"
|
||||
rotateLeft = "Завърти наляво"
|
||||
rotateRight = "Завърти надясно"
|
||||
toggleSidebar = "Показване/скриване на страничната лента"
|
||||
toggleBookmarks = "Превключи отметките"
|
||||
exportSelected = "Експорт на избраните страници"
|
||||
toggleAnnotations = "Показване/скриване на анотациите"
|
||||
annotationMode = "Превключи режим на анотации"
|
||||
print = "Печат на PDF"
|
||||
draw = "Рисуване"
|
||||
redact = "Заличаване"
|
||||
exitRedaction = "Изход от режим на заличаване"
|
||||
save = "Запази"
|
||||
downloadAll = "Изтегли всички"
|
||||
saveAll = "Запази всички"
|
||||
|
||||
[textAlign]
|
||||
left = "Ляво"
|
||||
center = "Център"
|
||||
right = "Дясно"
|
||||
|
||||
[annotation]
|
||||
title = "Анотиране"
|
||||
desc = "Използвайте открояване, перо, текст и бележки. Промените остават активни — не е нужно сплескване."
|
||||
highlight = "Открояване"
|
||||
pen = "Перо"
|
||||
text = "Текстово поле"
|
||||
note = "Бележка"
|
||||
rectangle = "Правоъгълник"
|
||||
ellipse = "Елипса"
|
||||
select = "Избор"
|
||||
exit = "Изход от режим за анотиране"
|
||||
strokeWidth = "Дебелина"
|
||||
opacity = "Непрозрачност"
|
||||
strokeOpacity = "Непрозрачност на контура"
|
||||
fillOpacity = "Непрозрачност на запълването"
|
||||
fontSize = "Размер на шрифта"
|
||||
chooseColor = "Избор на цвят"
|
||||
color = "Цвят"
|
||||
strokeColor = "Цвят на контура"
|
||||
fillColor = "Цвят на запълването"
|
||||
underline = "Подчертаване"
|
||||
strikeout = "Зачеркване"
|
||||
squiggly = "Вълнообразно подчертаване"
|
||||
inkHighlighter = "Ръчно открояване"
|
||||
freehandHighlighter = "Ръчно открояване"
|
||||
square = "Квадрат"
|
||||
circle = "Кръг"
|
||||
polygon = "Многоъгълник"
|
||||
line = "Линия"
|
||||
stamp = "Добавяне на изображение"
|
||||
textMarkup = "Маркиране на текст"
|
||||
drawing = "Рисуване"
|
||||
shapes = "Форми"
|
||||
notesStamps = "Бележки и печати"
|
||||
settings = "Настройки"
|
||||
borderOn = "Рамка: Вкл."
|
||||
borderOff = "Рамка: Изкл."
|
||||
editInk = "Редактиране на перо"
|
||||
editLine = "Редактиране на линия"
|
||||
editNote = "Редактиране на бележка"
|
||||
editText = "Редактиране на текстово поле"
|
||||
editTextMarkup = "Редактиране на маркиран текст"
|
||||
editSelected = "Редактиране на анотация"
|
||||
editSquare = "Редактиране на квадрат"
|
||||
editCircle = "Редактиране на кръг"
|
||||
editPolygon = "Редактиране на многоъгълник"
|
||||
unsupportedType = "Този тип анотация не се поддържа напълно за редактиране."
|
||||
textAlignment = "Подравняване на текст"
|
||||
noteIcon = "Икона на бележка"
|
||||
imagePreview = "Преглед"
|
||||
contents = "Текст"
|
||||
backgroundColor = "Цвят на фона"
|
||||
clearBackground = "Премахване на фона"
|
||||
noBackground = "Без фон"
|
||||
stampSettings = "Настройки на печат"
|
||||
savingCopy = "Подготовка за изтегляне..."
|
||||
saveFailed = "Неуспешно записване на копие"
|
||||
saveReady = "Готово за изтегляне"
|
||||
selectAndMove = "Избор и редактиране"
|
||||
editSelectDescription = "Щракнете съществуваща анотация, за да редактирате цвета, непрозрачността, текста или размера."
|
||||
editStampHint = "За да промените изображението, изтрийте този печат и добавете нов."
|
||||
editSwitchToSelect = "Превключете към „Избор и редактиране“, за да редактирате тази анотация."
|
||||
undo = "Отмяна"
|
||||
redo = "Повторение"
|
||||
applyChanges = "Прилагане на промените"
|
||||
saveChanges = "Запазване на промените"
|
||||
saveChanges = "Запази промените"
|
||||
|
||||
[search]
|
||||
title = "Търсене в PDF"
|
||||
@@ -4265,20 +4038,12 @@ settings = "Опции"
|
||||
adminSettings = "Админ опции"
|
||||
allTools = "All Tools"
|
||||
reader = "Четец"
|
||||
tours = "Турове"
|
||||
showMeAround = "Покажете ми наоколо"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Гледайте обиколките тук: обиколка на инструментите, обиколка на новия V2 дизайн и админ обиколка."
|
||||
user = "Гледайте обиколките тук: обиколка на инструментите и обиколка на новия V2 дизайн."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Обиколка на инструментите"
|
||||
toolsTourDesc = "Научете какво могат инструментите"
|
||||
adminTour = "Обиколка за админи"
|
||||
adminTourDesc = "Разгледайте админ настройките и функциите"
|
||||
whatsNewTour = "Вижте какво е ново във V2"
|
||||
whatsNewTourDesc = "Обиколка на обновения дизайн"
|
||||
|
||||
[admin]
|
||||
error = "Грешка"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Неуспешно зареждане на настройките"
|
||||
saveError = "Неуспешно запазване на настройките"
|
||||
saved = "Настройките са запазени успешно"
|
||||
saveSuccess = "Настройките са запазени успешно"
|
||||
success = "Настройките са записани успешно"
|
||||
error = "Неуспешно записване на настройките"
|
||||
save = "Запази промените"
|
||||
discard = "Отхвърли"
|
||||
restartRequired = "Изисква се рестарт"
|
||||
@@ -4422,13 +4185,6 @@ description = "Път до изпълнимия файл WeasyPrint за HTML к
|
||||
label = "Изпълним файл на Unoconvert"
|
||||
description = "Път до LibreOffice unoconvert за конвертиране на документи (оставете празно за подразбиране: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Базов URL за фронтенда (напр. https://pdf.example.com). Използва се за линкове за покана по имейл и мобилно качване чрез QR код. Оставете празно, за да се използва backend URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Щракнете, за да видите подробности за плана"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Сигурност"
|
||||
description = "Конфигурирайте удостоверяване, поведение при вход и политики за сигурност."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Свържи"
|
||||
disconnect = "Прекъсни връзката"
|
||||
disconnected = "Доставчикът е разкачен успешно"
|
||||
disconnectError = "Неуспешно разкачване на доставчика"
|
||||
mobileScannerConvertToPdf = "Конвертиране на изображения в PDF"
|
||||
mobileScannerConvertToPdfDesc = "Автоматично конвертиране на качените изображения в PDF формат. Ако е изключено, изображенията се запазват без промяна."
|
||||
mobileScannerImageResolution = "Резолюция на изображението"
|
||||
mobileScannerImageResolutionDesc = "Резолюция на качените изображения. „Намалена“ мащабира до максимум 1200px за по-малък размер на файла."
|
||||
imageResolutionFull = "Пълна (оригинален размер)"
|
||||
imageResolutionReduced = "Намалена (макс. 1200px)"
|
||||
mobileScannerPageFormat = "Формат на страницата"
|
||||
mobileScannerPageFormatDesc = "Размер на PDF страницата за конвертираните изображения. „Запазване“ използва оригиналните размери на изображението."
|
||||
pageFormatKeep = "Запазване (оригинални размери)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Разтягане до запълване"
|
||||
mobileScannerStretchToFitDesc = "Разтягане на изображенията, за да запълнят цялата страница. Ако е изключено, изображенията са центрирани със запазено съотношение."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO автоматичен вход"
|
||||
@@ -4646,122 +4389,6 @@ description = "Автоматично създаване на акаунти п
|
||||
label = "Блокирай регистрацията"
|
||||
description = "Предотврати регистрация на нови потребители чрез SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Качване от мобилен телефон"
|
||||
enable = "Разрешаване на качване чрез QR код"
|
||||
description = "Позволете на потребителите да качват файлове от мобилни устройства чрез сканиране на QR код"
|
||||
note = "Забележка: Изисква конфигуриран Frontend URL. "
|
||||
link = "Конфигуриране в системните настройки"
|
||||
mobileScannerConvertToPdf = "Конвертиране на изображения в PDF"
|
||||
mobileScannerConvertToPdfDesc = "Автоматично конвертиране на качените изображения в PDF формат. Ако е изключено, изображенията се запазват без промяна."
|
||||
mobileScannerImageResolution = "Резолюция на изображението"
|
||||
mobileScannerImageResolutionDesc = "Резолюция на качените изображения. „Намалена“ мащабира до максимум 1200px за по-малък размер на файла."
|
||||
imageResolutionFull = "Пълна (оригинален размер)"
|
||||
imageResolutionReduced = "Намалена (макс. 1200px)"
|
||||
mobileScannerPageFormat = "Формат на страницата"
|
||||
mobileScannerPageFormatDesc = "Размер на PDF страницата за конвертираните изображения. „Запазване“ използва оригиналните размери на изображението."
|
||||
pageFormatKeep = "Запазване (оригинални размери)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Разтягане до запълване"
|
||||
mobileScannerStretchToFitDesc = "Разтягане на изображенията, за да запълнят цялата страница. Ако е изключено, изображенията са центрирани със запазено съотношение."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram бот"
|
||||
description = "Конфигурирайте свързването на Telegram бота, контрола на достъпа и поведението на обратната връзка."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Активиране на Telegram бот"
|
||||
description = "Позволете на потребителите да работят със Stirling PDF чрез конфигурирания от вас Telegram бот."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Потребителско име на бота"
|
||||
description = "Публичното потребителско име на вашия Telegram бот."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "API токен, предоставен от BotFather за вашия Telegram бот."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Папка „Входящи“"
|
||||
description = "Папка под директорията pipeline, където се съхраняват входящите Telegram файлове."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Използване на персонализиран суфикс за папка"
|
||||
description = "Добавяне на ID на чата към папките за входящи файлове, за да се изолират качванията по чат."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Контрол на достъпа"
|
||||
description = "Ограничете кои потребители или канали могат да взаимодействат с бота."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Разрешаване на конкретни потребителски ID"
|
||||
description = "Когато е активно, само изброените потребителски ID могат да използват бота."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Разрешени потребителски ID"
|
||||
description = "Въведете Telegram потребителски ID, които могат да взаимодействат с бота."
|
||||
placeholder = "Добавете потребителско ID и натиснете Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Разрешаване на конкретни ID на канали"
|
||||
description = "Когато е активно, само изброените ID на канали могат да използват бота."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Разрешени ID на канали"
|
||||
description = "Въведете Telegram ID на канали, на които е позволено да взаимодействат с бота."
|
||||
placeholder = "Добавете ID на канал и натиснете Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Обработка"
|
||||
description = "Контролирайте интервалите на проверка и таймаутите за обработка при Telegram качвания."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Таймаут за обработка (секунди)"
|
||||
description = "Максимално време за изчакване на задача за обработка преди да се съобщи грешка."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Интервал на проверка (ms)"
|
||||
description = "Интервал между проверките за нови Telegram обновявания."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Съобщения за обратна връзка"
|
||||
description = "Изберете кога ботът да изпраща обратна връзка към потребители и канали."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Активиране на обратна връзка"
|
||||
description = "Контрол дали ботът изобщо изпраща съобщения за обратна връзка."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Правила за обратна връзка (канали)"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Показване на \"Няма валиден документ\" (Канал)"
|
||||
description = "Потискане на отговора „няма валиден документ“ за качвания в канали."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Показване на грешки при обработка (Канал)"
|
||||
description = "Изпращане на съобщения за грешки при обработка към канали."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Показване на съобщения за грешки (Канал)"
|
||||
description = "Показване на подробни съобщения за грешки за канали."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Правила за обратна връзка (потребители)"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Показване на \"Няма валиден документ\" (Потребител)"
|
||||
description = "Потискане на отговора „няма валиден документ“ за потребителски качвания."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Показване на грешки при обработка (Потребител)"
|
||||
description = "Изпращане на съобщения за грешки при обработка към потребители."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Показване на съобщения за грешки (Потребител)"
|
||||
description = "Показване на подробни съобщения за грешки за потребители."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "База данни"
|
||||
description = "Конфигурирайте персонализирани настройки за връзка към база данни за корпоративни внедрявания."
|
||||
@@ -4943,10 +4570,6 @@ description = "Позволи на администраторите да кан
|
||||
label = "Frontend URL"
|
||||
description = "Базов URL за фронтенда (напр. https://pdf.example.com). Използва се за генериране на покани в имейли. Оставете празно, за да се използва backend URL."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Забележка: Изисква конфигуриран Frontend URL. "
|
||||
link = "Конфигуриране в системните настройки"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Правни документи"
|
||||
description = "Конфигурирайте връзки към правни документи и политики."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Моите файлове"
|
||||
noRecentFiles = "Няма намерени последни файлове"
|
||||
googleDriveNotAvailable = "Интеграцията с Google Drive не е налична"
|
||||
mobileUpload = "Качване от мобилно устройство"
|
||||
mobileShort = "Мобилно"
|
||||
mobileUploadNotAvailable = "Качването от мобилно не е активирано"
|
||||
downloadSelected = "Изтегли избраните"
|
||||
saveSelected = "Запази избраните"
|
||||
openFiles = "Отвори файлове"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Зареждане..."
|
||||
back = "Назад"
|
||||
continue = "Продължи"
|
||||
error = "Грешка"
|
||||
save = "Запазване"
|
||||
|
||||
[config.overview]
|
||||
title = "Конфигурация на приложението"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Всички приложения или услуги, които из
|
||||
confirmPrompt = "Сигурни ли сте, че искате да продължите?"
|
||||
confirmCta = "Опресни ключовете"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Грешка с API ключ"
|
||||
failedToCreateApiKey = "Неуспешно създаване на API ключ."
|
||||
failedToRetrieveApiKey = "Неуспешно извличане на API ключ от отговора."
|
||||
failedToFetchApiKey = "Неуспешно извличане на API ключ."
|
||||
apiKeyRefreshed = "API ключът е обновен"
|
||||
apiKeyRefreshedBody = "Вашият API ключ беше успешно обновен."
|
||||
failedToRefreshApiKey = "Неуспешно обновяване на API ключ."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Изберете прикачени файлове"
|
||||
info = "Изберете файлове за прикачване към вашия PDF. Те ще бъдат вградени и достъпни през панела за прикачени файлове на PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Готово"
|
||||
startTour = "Започни обиколката"
|
||||
startTourDescription = "Направете обиколка с водач на основните функции на Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Започнете от релсата <strong>Quick Access</strong>, за да превключвате между Reader, Automate, вашите файлове и всички турове."
|
||||
leftPanel = "Левият панел <strong>Tools</strong> изброява всичко, което можете да правите. Разглеждайте категориите или търсете, за да намерите инструмент бързо."
|
||||
fileUpload = "Използвайте бутона <strong>Files</strong>, за да качите или изберете скорошен PDF. Ще заредим пример, за да видите работното пространство."
|
||||
rightRail = "<strong>Дясната релса</strong> съдържа бързи действия за избор на файлове, смяна на тема или език и изтегляне на резултати."
|
||||
topBar = "Горната лента ви позволява да превключвате между <strong>Viewer</strong>, <strong>Page Editor</strong> и <strong>Active Files</strong>."
|
||||
pageEditorView = "Преминете към Page Editor, за да пренареждате, завъртате или изтривате страници."
|
||||
activeFilesView = "Използвайте Active Files, за да видите всичко отворено и да изберете върху какво да работите."
|
||||
wrapUp = "Това е новото във V2. Отворете менюто <strong>Турове</strong> по всяко време, за да прегледате отново това, обиколката на инструментите или админ обиколката."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Добре дошли в Stirling PDF!"
|
||||
description = "Искате ли бърза 1-минутна обиколка, за да научите основните функции и как да започнете?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Изтегли →"
|
||||
showMeAround = "Разходи ме из новото"
|
||||
skipTheTour = "Пропусни обиколката"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Преглед на тура"
|
||||
body = "Stirling PDF V2 идва с десетки инструменти и обновен интерфейс. Направете бърза обиколка, за да видите какво се е променило и къде да намерите нужните функции."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Пропусни засега"
|
||||
seePlans = "Виж плановете →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Надградете сега →"
|
||||
freeTitle = "Лиценз за сървър"
|
||||
overLimitTitle = "Необходим е лиценз за сървър"
|
||||
overLimitBody = "Нашият лиценз позволява до <strong>{{freeTierLimit}}</strong> безплатни потребители на сървър. Имате <strong>{{overLimitUserCopy}}</strong> потребители на Stirling. За да продължите без прекъсвания, надградете до плана Stirling Server – <strong>неограничени места</strong>, редакция на PDF текст и пълен админ контрол за $99/сървър/месец."
|
||||
freeBody = "Нашият <strong>Open-Core</strong> лиценз позволява до <strong>{{freeTierLimit}}</strong> безплатни потребители на сървър. За да мащабирате без прекъсвания и да получите ранен достъп до нашия нов <strong>инструмент за редакция на PDF текст</strong>, препоръчваме плана Stirling Server – пълно редактиране и <strong>неограничени места</strong> за $99/сървър/месец."
|
||||
freeBody = "Нашият лицензен модел <strong>Open-Core</strong> позволява до <strong>{{freeTierLimit}}</strong> потребители безплатно на сървър. За безпрепятствено мащабиране препоръчваме плана Stirling Server - <strong>неограничени места</strong> и <strong>поддръжка на SSO</strong> за $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Изтегляне"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Свържете се с отдел Продажби"
|
||||
contactToUpgrade = "Свържете се с нас, за да надградите или персонализирате плана си"
|
||||
maxUsers = "Макс. потребители"
|
||||
upTo = "До"
|
||||
getLicense = "Вземете лиценз за сървър"
|
||||
upgradeToEnterprise = "Надграждане до Enterprise"
|
||||
selectPeriod = "Изберете период на фактуриране"
|
||||
monthlyBilling = "Месечно фактуриране"
|
||||
yearlyBilling = "Годишно фактуриране"
|
||||
checkoutOpened = "Чек-аутът е отворен"
|
||||
checkoutInstructions = "Завършете покупката си в раздела на Stripe. След плащане се върнете тук и обновете страницата, за да активирате лиценза си. Ще получите и имейл с лицензионния си ключ."
|
||||
activateLicense = "Активирайте лиценза си"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Чек-аутът е отворен в нов раздел"
|
||||
instructions = "Завършете покупката си в раздела на Stripe. След като плащането приключи, ще получите имейл с вашия лицензионен ключ."
|
||||
enterKey = "Въведете своя лицензионен ключ по-долу, за да активирате плана:"
|
||||
keyDescription = "Поставете лицензионния ключ от имейла си"
|
||||
activate = "Активиране на лиценз"
|
||||
doLater = "Ще направя това по-късно"
|
||||
success = "Лицензът е активиран!"
|
||||
successMessage = "Лицензът ви беше активиран успешно. Можете да затворите този прозорец."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Изисква се потвърждение на имейл"
|
||||
message = "Ще трябва да потвърдите имейл адреса си в портала за фактуриране на Stripe. Проверете имейла си за линк за вход."
|
||||
|
||||
[plan.period]
|
||||
month = "месец"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Системата за одит не е налична"
|
||||
notAvailableMessage = "Системата за одит не е конфигурирана или не е налична."
|
||||
disabled = "Одитният лог е изключен"
|
||||
disabledMessage = "Активирайте одитното логване в конфигурацията на приложението, за да проследявате системни събития."
|
||||
enterpriseRequired = "Необходим е лиценз Enterprise"
|
||||
enterpriseRequiredMessage = "Системата за журнализация на одити е функция на Enterprise. Моля, надградете до лиценз Enterprise, за да получите достъп до одитните логове и анализите."
|
||||
|
||||
[audit.error]
|
||||
title = "Грешка при зареждане на системата за одит"
|
||||
@@ -6370,7 +5942,6 @@ description = "Въведете пълния URL на вашия самосто
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Моля, въведете URL на сървър"
|
||||
invalidUrl = "Невалиден формат на URL. Въведете валиден URL като https://your-server.com"
|
||||
unreachable = "Неуспешна връзка със сървъра"
|
||||
testFailed = "Тестът на връзката е неуспешен"
|
||||
configFetch = "Неуспешно извличане на конфигурацията на сървъра. Моля, проверете URL адреса и опитайте отново."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Свързване към:"
|
||||
submit = "Вход"
|
||||
signInWith = "Вписване с"
|
||||
oauthPending = "Отваряне на браузър за удостоверяване..."
|
||||
sso = "Единно вписване"
|
||||
orContinueWith = "Или продължете с имейл"
|
||||
serverRequirement = "Забележка: Сървърът трябва да има активиран вход."
|
||||
showInstructions = "Как да се активира?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Отмени промените"
|
||||
downloadJson = "Изтегли JSON"
|
||||
generatePdf = "Генерирай PDF"
|
||||
saveChanges = "Запази промените"
|
||||
applyChanges = "Прилагане на промените"
|
||||
downloadCopy = "Изтегляне на копие"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Авто-мащабиране на текст за напасване в полетата"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Съвет: Задръжте Ctrl (Cmd) или Shift за
|
||||
title = "Заключи редактирания текст към един PDF елемент"
|
||||
description = "Когато е включено, редакторът експортира всяко редактирано текстово поле като един PDF текстов елемент, за да избегне застъпване на глифове или смесени шрифтове."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Разширени настройки"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Ограничения на предварителния преглед"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Фокус върху текст и изображения"
|
||||
text = "Това работно пространство е насочено към редактиране на текст и преместване на вградени изображения. Сложни графики на страницата, формуляри и многослойна графика се запазват за експорт, но не са напълно редактируеми тук."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Разлики в предварителния преглед"
|
||||
text = "Някои визуални елементи (като рамки на таблици, форми или вид на анотации) може да не се показват точно в предварителния преглед. Експортираният PDF запазва оригиналните команди за рисуване, когато е възможно."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Алфа визуализатор"
|
||||
text = "Този алфа визуализатор все още се развива — определени шрифтове, цветове, ефекти на прозрачност и детайли в оформлението може леко да се променят. Моля, проверете генерирания PDF преди да го споделите."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Слей избраните полета"
|
||||
merge = "Слей избраното"
|
||||
@@ -6614,58 +6164,3 @@ title = "Резултати от добавяне на текст"
|
||||
|
||||
[addText.error]
|
||||
failed = "Възникна грешка при добавяне на текст към PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Качване от мобилно устройство"
|
||||
description = "Сканирайте, за да качите снимки. Изображенията се конвертират автоматично в PDF."
|
||||
descriptionNoConvert = "Сканирайте, за да качвате снимки от мобилното си устройство."
|
||||
error = "Грешка при свързване"
|
||||
pollingError = "Грешка при проверка за файлове"
|
||||
sessionId = "ID на сесия"
|
||||
sessionCreateError = "Неуспешно създаване на сесия"
|
||||
expiryWarning = "Сесията скоро изтича"
|
||||
expiryWarningMessage = "Този QR код ще изтече след {{seconds}} секунди. Нов код ще бъде генериран автоматично."
|
||||
filesReceived = "Получени {{count}} файл(а)"
|
||||
connected = "Мобилното устройство е свързано"
|
||||
instructions = "Сканирайте с камерата на телефона си. Изображенията се конвертират автоматично в PDF."
|
||||
instructionsNoConvert = "Сканирайте с камерата на телефона си, за да качите файлове."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Мобилен скенер"
|
||||
noSession = "Невалидна сесия"
|
||||
noSessionMessage = "Моля, сканирайте валиден QR код, за да получите достъп до тази страница."
|
||||
validating = "Валидиране на сесията..."
|
||||
sessionInvalid = "Грешка в сесията"
|
||||
sessionExpired = "Тази сесия е изтекла. Моля, обновете и опитайте отново."
|
||||
sessionNotFound = "Сесията не е намерена. Моля, обновете и опитайте отново."
|
||||
sessionValidationError = "Неуспешна проверка на сесията. Опитайте отново."
|
||||
uploadSuccess = "Качването е успешно!"
|
||||
uploadSuccessMessage = "Вашите изображения бяха прехвърлени."
|
||||
httpsRequired = "Достъпът до камерата изисква HTTPS или localhost. Моля, използвайте HTTPS или достъп чрез localhost."
|
||||
uploadFailed = "Качването не бе успешно. Опитайте отново."
|
||||
uploading = "Качване..."
|
||||
connected = "Свързано"
|
||||
connecting = "Свързване..."
|
||||
chooseMethod = "Изберете метод за качване"
|
||||
chooseMethodDescription = "Изберете как искате да сканирате и качвате документи"
|
||||
camera = "Камера"
|
||||
cameraDescription = "Сканиране на документи с камерата на устройството с автоматично откриване на ръбове"
|
||||
fileUpload = "Качване на файл"
|
||||
fileDescription = "Качете съществуващи снимки или документи от устройството си"
|
||||
cameraAccessDenied = "Достъпът до камерата е отказан. Моля, разрешете достъп до камерата."
|
||||
back = "Назад"
|
||||
settings = "Настройки"
|
||||
edgeDetection = "Откриване на ръбове"
|
||||
flashlight = "Фенерче"
|
||||
flash = "Светкавица"
|
||||
processing = "Обработка..."
|
||||
capture = "Заснемане на снимка"
|
||||
selectFilesPrompt = "Изберете файлове за качване"
|
||||
selectImage = "Изберете изображение"
|
||||
preview = "Преглед"
|
||||
retake = "Повтори снимката"
|
||||
addToBatch = "Добавяне към пакет"
|
||||
upload = "Качване"
|
||||
batchImages = "Пакет"
|
||||
clearBatch = "Изчистване"
|
||||
uploadAll = "Качване на всички"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Tens canvis sense desar al teu PDF."
|
||||
pendingRedactionsTitle = "Redaccions no aplicades"
|
||||
pendingRedactions = "Hi ha redaccions no aplicades que es perdran."
|
||||
areYouSure = "Segur que vols sortir?"
|
||||
unsavedChangesTitle = "Canvis sense desar"
|
||||
keepWorking = "Continua treballant"
|
||||
discardChanges = "Descarta i surt"
|
||||
discardRedactions = "Descarta i surt"
|
||||
applyAndContinue = "Desa i surt"
|
||||
exportAndContinue = "Exporta i continua"
|
||||
cancel = "Cancel·la"
|
||||
@@ -343,10 +340,6 @@ advance = "Avançat"
|
||||
edit = "Visualitzar i Editar"
|
||||
popular = "Popular"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferències"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Equips"
|
||||
title = "Configuració"
|
||||
systemSettings = "Configuració del sistema"
|
||||
features = "Funcions"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Punts finals"
|
||||
database = "Base de dades"
|
||||
advanced = "Avançat"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avançat"
|
||||
title = "Seguretat i autenticació"
|
||||
security = "Seguretat"
|
||||
connections = "Connexions"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Llicències i analítiques"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versió actual"
|
||||
latestVersion = "Última versió"
|
||||
checkForUpdates = "Comprova actualitzacions"
|
||||
viewDetails = "Veure detalls"
|
||||
serverNeedsUpdate = "L'administrador ha d'actualitzar el servidor"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informació de la versió"
|
||||
description = "Detalls de les versions d'escriptori i del servidor"
|
||||
desktop = "Versió d'escriptori"
|
||||
server = "Versió del servidor"
|
||||
|
||||
[settings.security]
|
||||
title = "Seguretat"
|
||||
description = "Actualitza la contrasenya per mantenir segur el compte."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Canvia la contrasenya. Es tancarà la sessió després d’actualitzar."
|
||||
required = "Tots els camps són obligatoris."
|
||||
mismatch = "Les contrasenyes noves no coincideixen."
|
||||
error = "No s'ha pogut actualitzar la contrasenya. Verifica la contrasenya actual i torna-ho a provar."
|
||||
success = "La contrasenya s'ha actualitzat correctament. Torna a iniciar la sessió."
|
||||
ssoDisabled = "Els canvis de contrasenya els gestiona el proveïdor d'identitat."
|
||||
current = "Contrasenya actual"
|
||||
currentPlaceholder = "Introdueix la contrasenya actual"
|
||||
new = "Contrasenya nova"
|
||||
newPlaceholder = "Introdueix una contrasenya nova"
|
||||
confirm = "Confirma la contrasenya nova"
|
||||
confirmPlaceholder = "Torna a introduir la contrasenya nova"
|
||||
update = "Actualitza la contrasenya"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Dreceres de teclat"
|
||||
@@ -522,16 +488,11 @@ low = "Baixa"
|
||||
title = "Canvia les Credencials"
|
||||
header = "Actualitza les Dades del Compte"
|
||||
changePassword = "Estàs utilitzant les credencials d'inici de sessió per defecte. Si us plau, introdueix una nova contrasenya"
|
||||
ssoManaged = "El compte el gestiona el proveïdor d'identitat."
|
||||
newUsername = "Nou Nom d'Usuari"
|
||||
oldPassword = "Contrasenya Actual"
|
||||
newPassword = "Nova Contrasenya"
|
||||
confirmNewPassword = "Confirma la Nova Contrasenya"
|
||||
submit = "Envia els Canvis"
|
||||
credsUpdated = "Compte actualitzat"
|
||||
description = "S'han desat els canvis. Torna a iniciar la sessió."
|
||||
error = "No s'ha pogut actualitzar el nom d'usuari. Verifica la contrasenya i torna-ho a provar."
|
||||
changeUsername = "Actualitza el nom d'usuari. Es tancarà la sessió després d’actualitzar."
|
||||
|
||||
[account]
|
||||
title = "Opcions del compte"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Opcions del compte"
|
||||
adminSettings = "Opcions d'Administrador - Veure i afegir usuaris"
|
||||
userControlSettings = "Opcions de Control d'Usuari"
|
||||
changeUsername = "Canvia el nom d'usuari"
|
||||
changeUsernameDescription = "Actualitza el nom d'usuari. Es tancarà la sessió després d’actualitzar."
|
||||
newUsernamePlaceholder = "Introdueix el nom d'usuari nou"
|
||||
newUsername = "Nom d'usuari nou"
|
||||
password = "Confirma contrasenya"
|
||||
oldPassword = "Contrasenya Antiga"
|
||||
@@ -602,7 +561,7 @@ totalEndpoints = "Total d'endpoints"
|
||||
totalVisits = "Total de visites"
|
||||
showing = "Mostrant"
|
||||
selectedVisits = "Visites seleccionades"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Punt final"
|
||||
visits = "Visites"
|
||||
percentage = "Percentatge"
|
||||
loading = "Carregant..."
|
||||
@@ -749,11 +708,6 @@ tags = "signatura,autògraf"
|
||||
title = "Signa"
|
||||
desc = "Afegeix signatura al PDF mitjançant dibuix, text o imatge"
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotar,ressaltar,dibuixar"
|
||||
title = "Anota"
|
||||
desc = "Ressalta, dibuixa i afegeix notes i formes al visor"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplifica,elimina,interactiu"
|
||||
title = "Aplanar"
|
||||
@@ -965,7 +919,7 @@ title = "Superposar PDFs"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor de text PDF"
|
||||
desc = "Revisa i edita exportacions JSON de Stirling PDF amb edició de text agrupada i regeneració del PDF"
|
||||
desc = "Edita el text i les imatges existents dins dels PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "text,anotació,etiqueta"
|
||||
@@ -976,7 +930,6 @@ desc = "Afegeix text personalitzat a qualsevol lloc del teu PDF"
|
||||
addFiles = "Afegeix fitxers"
|
||||
uploadFromComputer = "Puja des de l'ordinador"
|
||||
openFromComputer = "Obre des de l'ordinador"
|
||||
mobileUpload = "Puja des del mòbil"
|
||||
|
||||
[viewPdf]
|
||||
tags = "veure,llegir,anotar,text,imatge"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opcions de CBZ a PDF"
|
||||
optimizeForEbook = "Optimitza el PDF per a lectors d'ebook (usa Ghostscript)"
|
||||
cbzOutputOptions = "Opcions de PDF a CBZ"
|
||||
cbzDpi = "DPI per al renderitzat d'imatges"
|
||||
cbrOptions = "Opcions CBR"
|
||||
cbrOutputOptions = "Opcions de PDF a CBR"
|
||||
cbrDpi = "DPI per al renderitzat d'imatges"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opcions d'eBook a PDF"
|
||||
ebookOptionsDesc = "Opcions per convertir eBooks a PDF"
|
||||
embedAllFonts = "Incrusta tots els tipus de lletra"
|
||||
embedAllFontsDesc = "Incrusta tots els tipus de lletra de l'eBook al PDF generat"
|
||||
includeTableOfContents = "Inclou la taula de continguts"
|
||||
includeTableOfContentsDesc = "Afegeix una taula de continguts generada al PDF resultant"
|
||||
includePageNumbers = "Inclou números de pàgina"
|
||||
includePageNumbersDesc = "Afegeix números de pàgina al PDF generat"
|
||||
optimizeForEbookPdf = "Optimitza per a lectors d'eBook"
|
||||
optimizeForEbookPdfDesc = "Optimitza el PDF per a la lectura en eBook (mida de fitxer menor, millor renderitzat en dispositius eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opcions de PDF a eBook"
|
||||
epubOptionsDesc = "Opcions per convertir PDF a EPUB/AZW3"
|
||||
detectChapters = "Detecta capítols"
|
||||
detectChaptersDesc = "Detecta encapçalaments que semblin capítols i insereix salts de pàgina EPUB"
|
||||
targetDevice = "Dispositiu de destinació"
|
||||
targetDeviceDesc = "Tria un perfil de sortida optimitzat per al dispositiu lector"
|
||||
outputFormat = "Format de sortida"
|
||||
outputFormatDesc = "Tria el format de sortida per a l'eBook"
|
||||
tabletPhone = "Tauleta/Telèfon (amb imatges)"
|
||||
kindleEink = "Kindle e-Ink (text optimitzat)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversió,img,jpg,imatge,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Afegeix adjunt"
|
||||
remove = "Elimina adjunt"
|
||||
embed = "Incrusta adjunt"
|
||||
convertToPdfA3b = "Converteix a PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Crea un PDF d'arxiu amb fitxers adjunts incrustats"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b és un format d'arxiu que garanteix la preservació a llarg termini. Permet incrustar formats de fitxer arbitraris com a adjunts. La conversió requereix Ghostscript i pot trigar més amb fitxers grans."
|
||||
convertToPdfA3bTooltipHeader = "Sobre la conversió a PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Què fa"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Desades"
|
||||
label = "Carrega la imatge de la signatura"
|
||||
placeholder = "Selecciona el fitxer d'imatge"
|
||||
hint = "Carrega una imatge PNG o JPG de la teva signatura"
|
||||
removeBackground = "Elimina el fons blanc (fes-lo transparent)"
|
||||
processing = "Processant la imatge..."
|
||||
backgroundRemovalFailedTitle = "No s'ha pogut eliminar el fons"
|
||||
backgroundRemovalFailedMessage = "No s'ha pogut eliminar el fons de la imatge. S'utilitzarà la imatge original."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Com afegir la signatura"
|
||||
@@ -2434,11 +2351,6 @@ note = "Aplanar elimina els elements interactius del PDF, fent-los no editables.
|
||||
label = "Aplana només els formularis"
|
||||
desc = "Aplana només els camps de formulari, deixant intactes altres elements interactius"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de renderitzat (opcional, recomanat 150 DPI)"
|
||||
help = "Deixa-ho en blanc per usar el valor predeterminat del sistema. Un DPI més alt afina el resultat però augmenta el temps de processament i la mida del fitxer."
|
||||
placeholder = "p. ex., 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultats d'aplanament"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Talla PDF"
|
||||
submit = "Envia"
|
||||
noFileSelected = "Seleccioneu un fitxer PDF per començar a retallar"
|
||||
reset = "Restableix al PDF complet"
|
||||
autoCrop = "Retalla automàticament els espais en blanc"
|
||||
|
||||
[crop.preview]
|
||||
title = "Selecció de l'àrea de retall"
|
||||
@@ -3244,7 +3155,6 @@ title = "Mètode de redacció"
|
||||
mode = "Mode"
|
||||
automatic = "Automàtic"
|
||||
automaticDesc = "Redacta text en funció de termes de cerca"
|
||||
automaticDisabledTooltip = "Selecciona fitxers al gestor de fitxers per redactar diversos fitxers alhora"
|
||||
manual = "Manual"
|
||||
manualDesc = "Feu clic i arrossegueu per redactar àrees específiques"
|
||||
manualComingSoon = "La redacció manual arribarà aviat"
|
||||
@@ -3315,35 +3225,8 @@ text = "Només coincideix amb paraules completes, no coincidències parcials. 'J
|
||||
title = "Converteix a PDF-imatge"
|
||||
text = "Converteix el PDF a un PDF basat en imatges després de la redacció. Això assegura que el text darrere dels quadres de redacció s'elimini completament i no es pugui recuperar."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controls de redacció manuals"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Eina de marcar text"
|
||||
text = "Selecciona text directament al PDF per marcar-lo per a la redacció. Fes clic i arrossega per ressaltar el text específic que vulguis redactar."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Eina de marcar àrea"
|
||||
text = "Dibuixa àrees rectangulars al PDF per marcar regions per a la redacció. Útil per redactar imatges, signatures o formes irregulars."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplica les redaccions"
|
||||
text = "Després de marcar el contingut, fes clic a «Aplica» per redactar permanentment totes les àrees marcades. El recompte pendent mostra quantes redaccions estan preparades per aplicar-se."
|
||||
bullet1 = "Marca tantes àrees com calgui abans d'aplicar"
|
||||
bullet2 = "Totes les redaccions pendents s'apliquen alhora"
|
||||
bullet3 = "Les redaccions no es poden desfer després d'aplicar-les"
|
||||
|
||||
[redact.manual]
|
||||
title = "Eines de redacció"
|
||||
instructions = "Selecciona text o dibuixa àrees al PDF per marcar contingut per a la redacció."
|
||||
markText = "Marca text"
|
||||
markArea = "Marca àrea"
|
||||
pendingLabel = "Pendent:"
|
||||
applyWarning = "⚠️ Aplicació permanent: no es pot desfer i les dades que hi ha a sota s'eliminaran"
|
||||
apply = "Aplica"
|
||||
noMarks = "No hi ha marques de redacció. Utilitza les eines de dalt per marcar contingut per a la redacció."
|
||||
header = "Redacció manual"
|
||||
controlsTitle = "Controls de redacció manuals"
|
||||
textBasedRedaction = "Redacció basada en text"
|
||||
pageBasedRedaction = "Redacció basada en pàgina"
|
||||
convertPDFToImageLabel = "Converteix PDF a PDF-imatge (S'utilitza per eliminar el text darrere del quadre)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Introdueix el nombre de divisions horitzontals"
|
||||
label = "Divisions Verticals"
|
||||
placeholder = "Introdueix el nombre de divisions verticals"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Mode de divisió"
|
||||
description = "Tria com dividir les pàgines"
|
||||
splitAll = "Divideix totes les pàgines"
|
||||
splitAllExceptFirst = "Divideix totes excepte la primera"
|
||||
splitAllExceptLast = "Divideix totes excepte l'última"
|
||||
splitAllExceptFirstAndLast = "Divideix totes excepte la primera i l'última"
|
||||
custom = "Pàgines personalitzades"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Números de pàgina personalitzats"
|
||||
placeholder = "p. ex., 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Segell, Afegeix imatge, Centra imatge, Marca d'aigua, PDF, Insereix, Personalitza"
|
||||
header = "Segella PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Mida del Fitxer"
|
||||
[compress.grayscale]
|
||||
label = "Aplicar escala de grisos per a la compressió"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearitza el PDF per a una visualització web ràpida"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Converteix les imatges a dibuix de línies"
|
||||
description = "Utilitza ImageMagick per reduir les pàgines a blanc i negre d'alt contrast per a una reducció de mida màxima."
|
||||
unavailable = "ImageMagick no està instal·lat ni habilitat en aquest servidor"
|
||||
detailLevel = "Nivell de detall"
|
||||
edgeEmphasis = "Èmfasi de vores"
|
||||
edgeLow = "Suau"
|
||||
edgeMedium = "Equilibrat"
|
||||
edgeHigh = "Fort"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Resum de configuració de compressió"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Els valors alts redueixen la mida del fitxer"
|
||||
title = "Escala de grisos"
|
||||
text = "Seleccioneu aquesta opció per convertir totes les imatges a blanc i negre, cosa que pot reduir significativament la mida del fitxer, especialment per a PDFs escanejats o documents amb moltes imatges."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Dibuix de línies"
|
||||
text = "Converteix pàgines a blanc i negre d'alt contrast amb ImageMagick. Utilitza el nivell de detall per controlar quant contingut esdevé negre i l’èmfasi de vores per controlar com d’agressiva és la detecció de vores."
|
||||
|
||||
[compress.error]
|
||||
failed = "S'ha produït un error en comprimir el PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "S'ha produït un error en comprimir el PDF."
|
||||
_value = "Configuració de compressió"
|
||||
1 = "1-3 compressió de PDF,</br> 4-6 compressió lleugera d'imatges,</br> 7-9 compressió intensa d'imatges Reduirà dràsticament la qualitat de la imatge"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valors baixos conserven la qualitat però generen fitxers més grans"
|
||||
range4to6 = "Compressió mitjana amb una reducció moderada de la qualitat"
|
||||
range7to9 = "Valors alts redueixen significativament la mida del fitxer però poden reduir la nitidesa de la imatge"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Aquest fitxer està protegit amb contrasenya. Si us plau, introdueix la contrasenya:"
|
||||
cancelled = "Operació cancel·lada per al PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Suprimeix les pàgines seleccionades"
|
||||
closePdf = "Tanca el PDF"
|
||||
exportAll = "Exporta el PDF"
|
||||
downloadSelected = "Descarrega els fitxers seleccionats"
|
||||
annotations = "Anotacions"
|
||||
exportSelected = "Exporta les pàgines seleccionades"
|
||||
saveChanges = "Desa els canvis"
|
||||
downloadAll = "Descarrega-ho tot"
|
||||
saveAll = "Desa-ho tot"
|
||||
toggleTheme = "Canvia el tema"
|
||||
toggleBookmarks = "Mostra/amaga marcadors"
|
||||
language = "Idioma"
|
||||
toggleAnnotations = "Mostra/oculta les anotacions"
|
||||
search = "Cerca al PDF"
|
||||
panMode = "Mode de desplaçament"
|
||||
applyRedactionsFirst = "Aplica primer les redaccions"
|
||||
rotateLeft = "Gira a l'esquerra"
|
||||
rotateRight = "Gira a la dreta"
|
||||
toggleSidebar = "Mostra/oculta la barra lateral"
|
||||
toggleBookmarks = "Mostra/amaga marcadors"
|
||||
exportSelected = "Exporta les pàgines seleccionades"
|
||||
toggleAnnotations = "Mostra/oculta les anotacions"
|
||||
annotationMode = "Activa/desactiva el mode d'anotació"
|
||||
print = "Imprimeix el PDF"
|
||||
draw = "Dibuixa"
|
||||
redact = "Redacta"
|
||||
exitRedaction = "Surt del mode de redacció"
|
||||
save = "Desa"
|
||||
downloadAll = "Descarrega-ho tot"
|
||||
saveAll = "Desa-ho tot"
|
||||
|
||||
[textAlign]
|
||||
left = "Esquerra"
|
||||
center = "Centre"
|
||||
right = "Dreta"
|
||||
|
||||
[annotation]
|
||||
title = "Anota"
|
||||
desc = "Utilitza ressaltador, ploma, text i notes. Els canvis es mantenen en viu—no cal aplanar."
|
||||
highlight = "Ressaltador"
|
||||
pen = "Ploma"
|
||||
text = "Quadre de text"
|
||||
note = "Nota"
|
||||
rectangle = "Rectangle"
|
||||
ellipse = "El·lipse"
|
||||
select = "Selecciona"
|
||||
exit = "Surt del mode d'anotació"
|
||||
strokeWidth = "Amplada"
|
||||
opacity = "Opacitat"
|
||||
strokeOpacity = "Opacitat del traç"
|
||||
fillOpacity = "Opacitat de farciment"
|
||||
fontSize = "Mida de la lletra"
|
||||
chooseColor = "Tria el color"
|
||||
color = "Color"
|
||||
strokeColor = "Color del traç"
|
||||
fillColor = "Color de farciment"
|
||||
underline = "Subratllat"
|
||||
strikeout = "Barrat"
|
||||
squiggly = "Subratllat ondulat"
|
||||
inkHighlighter = "Ressaltador a mà alçada"
|
||||
freehandHighlighter = "Ressaltador a mà alçada"
|
||||
square = "Quadrat"
|
||||
circle = "Cercle"
|
||||
polygon = "Polígon"
|
||||
line = "Línia"
|
||||
stamp = "Afegeix imatge"
|
||||
textMarkup = "Marcat de text"
|
||||
drawing = "Dibuix"
|
||||
shapes = "Formes"
|
||||
notesStamps = "Notes i segells"
|
||||
settings = "Configuració"
|
||||
borderOn = "Vora: activada"
|
||||
borderOff = "Vora: desactivada"
|
||||
editInk = "Edita la ploma"
|
||||
editLine = "Edita la línia"
|
||||
editNote = "Edita la nota"
|
||||
editText = "Edita el quadre de text"
|
||||
editTextMarkup = "Edita el marcat de text"
|
||||
editSelected = "Edita l'anotació"
|
||||
editSquare = "Edita el quadrat"
|
||||
editCircle = "Edita el cercle"
|
||||
editPolygon = "Edita el polígon"
|
||||
unsupportedType = "Aquest tipus d’anotació no és totalment compatible amb l’edició."
|
||||
textAlignment = "Alineació del text"
|
||||
noteIcon = "Icona de nota"
|
||||
imagePreview = "Previsualització"
|
||||
contents = "Text"
|
||||
backgroundColor = "Color de fons"
|
||||
clearBackground = "Elimina el fons"
|
||||
noBackground = "Sense fons"
|
||||
stampSettings = "Configuració del segell"
|
||||
savingCopy = "Preparant la baixada..."
|
||||
saveFailed = "No s'ha pogut desar la còpia"
|
||||
saveReady = "Baixada preparada"
|
||||
selectAndMove = "Selecciona i edita"
|
||||
editSelectDescription = "Fes clic en una anotació existent per editar-ne el color, l'opacitat, el text o la mida."
|
||||
editStampHint = "Per canviar la imatge, suprimeix aquest segell i n'afegeix un de nou."
|
||||
editSwitchToSelect = "Canvia a Selecciona i edita per editar aquesta anotació."
|
||||
undo = "Desfés"
|
||||
redo = "Refés"
|
||||
applyChanges = "Aplica els canvis"
|
||||
saveChanges = "Desa els canvis"
|
||||
|
||||
[search]
|
||||
@@ -4260,25 +4033,17 @@ files = "Fitxers"
|
||||
activity = "Registre"
|
||||
help = "Ajuda"
|
||||
account = "Compte"
|
||||
config = "Config"
|
||||
config = "Configuració"
|
||||
settings = "Ajustos"
|
||||
adminSettings = "Ajustos admin"
|
||||
allTools = "All Tools"
|
||||
reader = "Lector"
|
||||
tours = "Visites guiades"
|
||||
showMeAround = "Fes-me una visita guiada"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Mira els recorreguts aquí: visita de les eines, visita del nou disseny V2 i la visita d’administració."
|
||||
user = "Mira els recorreguts aquí: visita de les eines i visita del nou disseny V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Visita guiada de les eines"
|
||||
toolsTourDesc = "Descobriu què poden fer les eines"
|
||||
adminTour = "Visita per a administradors"
|
||||
adminTourDesc = "Exploreu la configuració i les funcions d'administració"
|
||||
whatsNewTour = "Descobreix les novetats de la V2"
|
||||
whatsNewTourDesc = "Recorregut pel disseny actualitzat"
|
||||
|
||||
[admin]
|
||||
error = "Error"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "No s'ha pogut carregar la configuració"
|
||||
saveError = "No s'ha pogut desar la configuració"
|
||||
saved = "Configuració desada correctament"
|
||||
saveSuccess = "Configuració desada correctament"
|
||||
success = "La configuració s'ha desat correctament"
|
||||
error = "No s'ha pogut desar la configuració"
|
||||
save = "Desa els canvis"
|
||||
discard = "Descarta"
|
||||
restartRequired = "Cal reiniciar"
|
||||
@@ -4422,13 +4185,6 @@ description = "Camí a l'executable de WeasyPrint per a la conversió d'HTML a P
|
||||
label = "Executable d'Unoconvert"
|
||||
description = "Camí a LibreOffice unoconvert per a conversions de documents (deixeu-ho buit per al valor per defecte: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "URL base per al frontend (p. ex., https://pdf.example.com). S'utilitza per a enllaços d'invitació per correu i pujades via codi QR mòbil. Deixa-ho en blanc per usar l'URL del backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Fes clic per veure els detalls del pla"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Seguretat"
|
||||
description = "Configureu l'autenticació, el comportament d'inici de sessió i les polítiques de seguretat."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Connecta"
|
||||
disconnect = "Desconnecta"
|
||||
disconnected = "Proveïdor desconnectat correctament"
|
||||
disconnectError = "No s'ha pogut desconnectar el proveïdor"
|
||||
mobileScannerConvertToPdf = "Converteix imatges a PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converteix automàticament les imatges pujades al format PDF. Si es desactiva, les imatges es mantindran tal com estan."
|
||||
mobileScannerImageResolution = "Resolució de la imatge"
|
||||
mobileScannerImageResolutionDesc = "Resolució de les imatges pujades. «Reduïda» escala les imatges fins a un màxim de 1200 px per reduir la mida del fitxer."
|
||||
imageResolutionFull = "Completa (mida original)"
|
||||
imageResolutionReduced = "Reduïda (màx. 1200 px)"
|
||||
mobileScannerPageFormat = "Format de pàgina"
|
||||
mobileScannerPageFormatDesc = "Mida de pàgina del PDF per a les imatges convertides. «Mantén» utilitza les dimensions originals de la imatge."
|
||||
pageFormatKeep = "Mantén (dimensions originals)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 polzades)"
|
||||
mobileScannerStretchToFit = "Ajusta per omplir"
|
||||
mobileScannerStretchToFitDesc = "Estira les imatges per omplir tota la pàgina. Si es desactiva, les imatges es centraran preservant la relació d’aspecte."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Inici de sessió automàtic amb SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Crea automàticament comptes d'usuari en el primer inici de sessi
|
||||
label = "Bloqueja el registre"
|
||||
description = "Evita el registre de nous usuaris via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Pujada des del telèfon mòbil"
|
||||
enable = "Habilita la pujada per codi QR"
|
||||
description = "Permet als usuaris pujar fitxers des de dispositius mòbils escanejant un codi QR"
|
||||
note = "Nota: cal configurar el Frontend URL. "
|
||||
link = "Configura-ho a la configuració del sistema"
|
||||
mobileScannerConvertToPdf = "Converteix imatges a PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converteix automàticament les imatges pujades al format PDF. Si es desactiva, les imatges es mantindran tal com estan."
|
||||
mobileScannerImageResolution = "Resolució de la imatge"
|
||||
mobileScannerImageResolutionDesc = "Resolució de les imatges pujades. «Reduïda» escala les imatges fins a un màxim de 1200 px per reduir la mida del fitxer."
|
||||
imageResolutionFull = "Completa (mida original)"
|
||||
imageResolutionReduced = "Reduïda (màx. 1200 px)"
|
||||
mobileScannerPageFormat = "Format de pàgina"
|
||||
mobileScannerPageFormatDesc = "Mida de pàgina del PDF per a les imatges convertides. «Mantén» utilitza les dimensions originals de la imatge."
|
||||
pageFormatKeep = "Mantén (dimensions originals)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 polzades)"
|
||||
mobileScannerStretchToFit = "Ajusta per omplir"
|
||||
mobileScannerStretchToFitDesc = "Estira les imatges per omplir tota la pàgina. Si es desactiva, les imatges es centraran preservant la relació d’aspecte."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot de Telegram"
|
||||
description = "Configura la connectivitat del bot de Telegram, els controls d'accés i el comportament dels missatges de retroacció."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Habilita el bot de Telegram"
|
||||
description = "Permet als usuaris interactuar amb Stirling PDF a través del bot de Telegram configurat."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nom d'usuari del bot"
|
||||
description = "El nom d'usuari públic del bot de Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token del bot"
|
||||
description = "Token d'API proporcionat per BotFather per al bot de Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Carpeta d'entrada"
|
||||
description = "Carpeta dins del directori de pipeline on s'emmagatzemen els fitxers entrants de Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Usa un sufix personalitzat de carpeta"
|
||||
description = "Afegeix l'ID del xat a les carpetes de fitxers entrants per aïllar les pujades per xat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Control d'accés"
|
||||
description = "Restringeix quins usuaris o canals poden interactuar amb el bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Permet ID d'usuari específics"
|
||||
description = "Quan està habilitat, només els ID d'usuari llistats poden utilitzar el bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID d'usuari permesos"
|
||||
description = "Introdueix els ID d'usuari de Telegram que poden interactuar amb el bot."
|
||||
placeholder = "Afegeix un ID d'usuari i prem Retorn"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Permet ID de canal específics"
|
||||
description = "Quan està habilitat, només els ID de canal llistats poden utilitzar el bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID de canal permesos"
|
||||
description = "Introdueix els ID de canal de Telegram que poden interactuar amb el bot."
|
||||
placeholder = "Afegeix un ID de canal i prem Retorn"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Processament"
|
||||
description = "Controla els intervals de consulta i els temps d'espera del processament per a pujades de Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Temps d'espera del processament (segons)"
|
||||
description = "Temps màxim d'espera d'una tasca de processament abans d'informar d'un error."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interval de consulta (ms)"
|
||||
description = "Interval entre comprovacions de noves actualitzacions de Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Missatges de retroacció"
|
||||
description = "Tria quan el bot ha d'enviar retroacció als usuaris i canals."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Habilita la retroacció"
|
||||
description = "Controla si el bot envia missatges de retroacció."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regles de retroacció del canal"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Mostra «No hi ha cap document vàlid» (canal)"
|
||||
description = "Suprimeix la resposta de «no hi ha cap document vàlid» per a pujades al canal."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Mostra errors de processament (canal)"
|
||||
description = "Envia missatges d'error de processament als canals."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Mostra missatges d'error (canal)"
|
||||
description = "Mostra missatges d'error detallats per als canals."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regles de retroacció de l'usuari"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Mostra «No hi ha cap document vàlid» (usuari)"
|
||||
description = "Suprimeix la resposta de «no hi ha cap document vàlid» per a pujades d'usuari."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Mostra errors de processament (usuari)"
|
||||
description = "Envia missatges d'error de processament als usuaris."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Mostra missatges d'error (usuari)"
|
||||
description = "Mostra missatges d'error detallats per als usuaris."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Base de dades"
|
||||
description = "Configureu la configuració de connexió de base de dades personalitzada per a desplegaments d'empresa."
|
||||
@@ -4824,7 +4451,7 @@ features = "Banderes de funcions"
|
||||
processing = "Processament"
|
||||
|
||||
[admin.settings.advanced.endpoints]
|
||||
label = "Endpoints"
|
||||
label = "Punts finals"
|
||||
manage = "Gestiona els endpoints de l'API"
|
||||
description = "La gestió d'endpoints es configura via YAML. Consulteu la documentació per a detalls sobre com habilitar/deshabilitar endpoints específics."
|
||||
|
||||
@@ -4943,10 +4570,6 @@ description = "Permet que els administradors convidin usuaris per correu amb con
|
||||
label = "URL del frontend"
|
||||
description = "URL base del frontend (p. ex. https://pdf.example.com). S'utilitza per generar enllaços d'invitació als correus. Deixeu-ho buit per usar l'URL del backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Nota: cal configurar el Frontend URL. "
|
||||
link = "Configura-ho a la configuració del sistema"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documents legals"
|
||||
description = "Configureu enllaços a documents i polítiques legals."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Els meus fitxers"
|
||||
noRecentFiles = "No s'han trobat fitxers recents"
|
||||
googleDriveNotAvailable = "La integració amb Google Drive no està disponible"
|
||||
mobileUpload = "Pujada des del mòbil"
|
||||
mobileShort = "Mòbil"
|
||||
mobileUploadNotAvailable = "La pujada des del mòbil no està habilitada"
|
||||
downloadSelected = "Descarrega els seleccionats"
|
||||
saveSelected = "Desa la selecció"
|
||||
openFiles = "Obre fitxers"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Carregant..."
|
||||
back = "Enrere"
|
||||
continue = "Continua"
|
||||
error = "Error"
|
||||
save = "Desa"
|
||||
|
||||
[config.overview]
|
||||
title = "Configuració de l’aplicació"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Qualsevol aplicació o servei que actualment utilitzi aquestes claus d
|
||||
confirmPrompt = "Esteu segur que voleu continuar?"
|
||||
confirmCta = "Actualitza les claus"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Error de clau d'API"
|
||||
failedToCreateApiKey = "No s'ha pogut crear la clau d'API."
|
||||
failedToRetrieveApiKey = "No s'ha pogut obtenir la clau d'API de la resposta."
|
||||
failedToFetchApiKey = "No s'ha pogut recuperar la clau d'API."
|
||||
apiKeyRefreshed = "Clau d'API actualitzada"
|
||||
apiKeyRefreshedBody = "La clau d'API s'ha actualitzat correctament."
|
||||
failedToRefreshApiKey = "No s'ha pogut actualitzar la clau d'API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Seleccioneu adjunts"
|
||||
info = "Seleccioneu fitxers per adjuntar al vostre PDF. Aquests fitxers s’incrustaran i seran accessibles mitjançant el panell d’adjunts del PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Finalitza"
|
||||
startTour = "Inicia la visita"
|
||||
startTourDescription = "Feu una visita guiada per les funcions clau de Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Comença a la barra de <strong>Accés ràpid</strong> per saltar entre el Lector, Automatitza, els teus fitxers i totes les visites guiades."
|
||||
leftPanel = "El panell esquerre de <strong>Eines</strong> llista tot el que pots fer. Navega per categories o cerca per trobar una eina ràpidament."
|
||||
fileUpload = "Utilitza el botó <strong>Fitxers</strong> per pujar o triar un PDF recent. Carregarem un exemple perquè vegis l'espai de treball."
|
||||
rightRail = "La <strong>barra dreta</strong> conté accions ràpides per seleccionar fitxers, canviar el tema o l’idioma i baixar els resultats."
|
||||
topBar = "La barra superior et permet canviar entre el <strong>Visor</strong>, l’<strong>Editor de pàgines</strong> i els <strong>Fitxers actius</strong>."
|
||||
pageEditorView = "Canvia a l'Editor de pàgines per reordenar, girar o suprimir pàgines."
|
||||
activeFilesView = "Utilitza Fitxers actius per veure tot el que tens obert i triar amb què treballar."
|
||||
wrapUp = "Això és el que hi ha de nou a la V2. Obre el menú de <strong>Visites guiades</strong> en qualsevol moment per tornar a veure aquesta, la visita d’Eines o la d’Administració."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Us donem la benvinguda a Stirling PDF!"
|
||||
description = "Voleu fer una visita guiada d’1 minut per conèixer les funcions clau i com començar?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Baixa →"
|
||||
showMeAround = "Fes-me un recorregut"
|
||||
skipTheTour = "Omet la visita guiada"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Resum de la visita"
|
||||
body = "Stirling PDF V2 inclou desenes d'eines i un disseny renovat. Fes una visita ràpida per veure què ha canviat i on trobar les funcions que necessites."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Omet per ara"
|
||||
seePlans = "Veure plans →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Actualitza ara →"
|
||||
freeTitle = "Llicència del servidor"
|
||||
overLimitTitle = "Cal una llicència de servidor"
|
||||
overLimitBody = "La nostra llicència permet fins a <strong>{{freeTierLimit}}</strong> usuaris gratuïts per servidor. Tens <strong>{{overLimitUserCopy}}</strong> usuaris de Stirling. Per continuar sense interrupcions, actualitza al pla Stirling Server: <strong>seients il·limitats</strong>, edició de text de PDF i control d'administració complet per 99 $/servidor/mes."
|
||||
freeBody = "La nostra llicència <strong>Open-Core</strong> permet fins a <strong>{{freeTierLimit}}</strong> usuaris gratuïts per servidor. Per escalar sense interrupcions i obtenir accés anticipat a la nova <strong>eina d'edició de text PDF</strong>, recomanem el pla Stirling Server: edició completa i <strong>seients il·limitats</strong> per 99 $/servidor/mes."
|
||||
freeBody = "La nostra llicència <strong>Open-Core</strong> permet fins a <strong>{{freeTierLimit}}</strong> usuaris gratuïts per servidor. Per escalar sense interrupcions, recomanem el pla Stirling Server - <strong>places il·limitades</strong> i <strong>suport SSO</strong> per $99/servidor/mes."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Baixa"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contacta amb vendes"
|
||||
contactToUpgrade = "Contacteu-nos per actualitzar o personalitzar el vostre pla"
|
||||
maxUsers = "Nombre màxim d’usuaris"
|
||||
upTo = "Fins a"
|
||||
getLicense = "Obtén la llicència del servidor"
|
||||
upgradeToEnterprise = "Actualitza a Enterprise"
|
||||
selectPeriod = "Selecciona el període de facturació"
|
||||
monthlyBilling = "Facturació mensual"
|
||||
yearlyBilling = "Facturació anual"
|
||||
checkoutOpened = "Pagament obert"
|
||||
checkoutInstructions = "Completa la compra a la pestanya de Stripe. Després del pagament, torna aquí i actualitza la pàgina per activar la llicència. També rebràs un correu electrònic amb la clau de llicència."
|
||||
activateLicense = "Activa la teva llicència"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Pagament obert en una pestanya nova"
|
||||
instructions = "Completa la compra a la pestanya de Stripe. Un cop completat el pagament, rebràs un correu electrònic amb la clau de llicència."
|
||||
enterKey = "Introdueix la clau de llicència a continuació per activar el pla:"
|
||||
keyDescription = "Enganxa la clau de llicència del correu electrònic"
|
||||
activate = "Activa la llicència"
|
||||
doLater = "Ho faré més tard"
|
||||
success = "Llicència activada!"
|
||||
successMessage = "La llicència s'ha activat correctament. Ara pots tancar aquesta finestra."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Cal verificació del correu electrònic"
|
||||
message = "Hauràs de verificar l'adreça de correu electrònic al portal de facturació de Stripe. Comprova el correu per trobar l'enllaç d'inici de sessió."
|
||||
|
||||
[plan.period]
|
||||
month = "mes"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistema d’auditoria no disponible"
|
||||
notAvailableMessage = "El sistema d’auditoria no està configurat o no està disponible."
|
||||
disabled = "El registre d’auditoria està desactivat"
|
||||
disabledMessage = "Activeu el registre d’auditoria a la configuració de l’aplicació per fer el seguiment dels esdeveniments del sistema."
|
||||
enterpriseRequired = "Cal llicència Enterprise"
|
||||
enterpriseRequiredMessage = "El sistema de registres d’auditoria és una funció d’Enterprise. Actualitza a una llicència Enterprise per accedir als registres d’auditoria i a les analítiques."
|
||||
|
||||
[audit.error]
|
||||
title = "Error en carregar el sistema d’auditoria"
|
||||
@@ -6292,7 +5864,7 @@ title = "Gràfic d'ús dels endpoints"
|
||||
|
||||
[usage.table]
|
||||
title = "Estadístiques detallades"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Punt final"
|
||||
visits = "Visites"
|
||||
percentage = "Percentatge"
|
||||
noData = "No hi ha dades disponibles"
|
||||
@@ -6370,7 +5942,6 @@ description = "Introdueix la URL completa del teu servidor autoallotjat de Stirl
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Introdueix una URL de servidor"
|
||||
invalidUrl = "Format d'URL invàlid. Introdueix una URL vàlida com https://your-server.com"
|
||||
unreachable = "No s'ha pogut connectar amb el servidor"
|
||||
testFailed = "Ha fallat la prova de connexió"
|
||||
configFetch = "No s'ha pogut obtenir la configuració del servidor. Comproveu l'URL i torneu-ho a provar."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Connectant amb:"
|
||||
submit = "Inicia sessió"
|
||||
signInWith = "Inicia sessió amb"
|
||||
oauthPending = "Obrint el navegador per autenticar-te..."
|
||||
sso = "Inici de sessió únic"
|
||||
orContinueWith = "O continua amb el correu electrònic"
|
||||
serverRequirement = "Nota: el servidor ha de tenir l'inici de sessió habilitat."
|
||||
showInstructions = "Com s'habilita?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Restableix els canvis"
|
||||
downloadJson = "Descarrega JSON"
|
||||
generatePdf = "Genera PDF"
|
||||
saveChanges = "Deseu els canvis"
|
||||
applyChanges = "Aplica els canvis"
|
||||
downloadCopy = "Baixa una còpia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoajusta el text a les caixes"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Consell: Mantén premut Ctrl (Cmd) o Shift per seleccionar
|
||||
title = "Bloqueja el text editat a un únic element del PDF"
|
||||
description = "Quan s'habilita, l'editor exporta cada quadre de text editat com un sol element de text del PDF per evitar glifs superposats o tipus de lletra barrejats."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Paràmetres avançats"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitacions de la previsualització"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Enfocament en text i imatge"
|
||||
text = "Aquest espai de treball se centra en l’edició de text i el reposicionament d’imatges incrustades. Els elements gràfics complexos, els ginys de formulari i els gràfics amb capes es conserven per a l’exportació però no són totalment editables aquí."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variacions de previsualització"
|
||||
text = "Alguns elements visuals (com les vores de taula, formes o aparença d’anotacions) poden no mostrar-se exactament a la previsualització. El PDF exportat manté les ordres de dibuix originals sempre que sigui possible."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visor alfa"
|
||||
text = "Aquest visor alfa encara està evolucionant; certs tipus de lletra, colors, efectes de transparència i detalls de disposició poden variar lleugerament. Revisa dues vegades el PDF generat abans de compartir-lo."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Fusiona els quadres seleccionats"
|
||||
merge = "Fusiona la selecció"
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultats d'afegir text"
|
||||
|
||||
[addText.error]
|
||||
failed = "S'ha produït un error en afegir text al PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Puja des del mòbil"
|
||||
description = "Escaneja per pujar fotos. Les imatges es converteixen automàticament a PDF."
|
||||
descriptionNoConvert = "Escaneja per pujar fotos des del dispositiu mòbil."
|
||||
error = "Error de connexió"
|
||||
pollingError = "Error en comprovar si hi ha fitxers"
|
||||
sessionId = "ID de sessió"
|
||||
sessionCreateError = "No s'ha pogut crear la sessió"
|
||||
expiryWarning = "La sessió caducarà aviat"
|
||||
expiryWarningMessage = "Aquest codi QR caducarà d'aquí a {{seconds}} segons. Es generarà un codi nou automàticament."
|
||||
filesReceived = "S'han rebut {{count}} fitxer(s)"
|
||||
connected = "Dispositiu mòbil connectat"
|
||||
instructions = "Escaneja amb la càmera del telèfon. Les imatges es converteixen automàticament a PDF."
|
||||
instructionsNoConvert = "Escaneja amb la càmera del telèfon per pujar fitxers."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Escàner mòbil"
|
||||
noSession = "Sessió no vàlida"
|
||||
noSessionMessage = "Escaneja un codi QR vàlid per accedir a aquesta pàgina."
|
||||
validating = "Validant la sessió..."
|
||||
sessionInvalid = "Error de sessió"
|
||||
sessionExpired = "Aquesta sessió ha caducat. Actualitza i torna-ho a provar."
|
||||
sessionNotFound = "No s'ha trobat la sessió. Actualitza i torna-ho a provar."
|
||||
sessionValidationError = "No s'ha pogut verificar la sessió. Torna-ho a provar."
|
||||
uploadSuccess = "Pujada correcta!"
|
||||
uploadSuccessMessage = "Les imatges s'han transferit."
|
||||
httpsRequired = "L'accés a la càmera requereix HTTPS o localhost. Utilitza HTTPS o accedeix mitjançant localhost."
|
||||
uploadFailed = "La pujada ha fallat. Torna-ho a provar."
|
||||
uploading = "Pujant..."
|
||||
connected = "Connectat"
|
||||
connecting = "Connectant..."
|
||||
chooseMethod = "Tria el mètode de pujada"
|
||||
chooseMethodDescription = "Selecciona com vols escanejar i pujar documents"
|
||||
camera = "Càmera"
|
||||
cameraDescription = "Escaneja documents amb la càmera del dispositiu amb detecció automàtica de vores"
|
||||
fileUpload = "Pujada de fitxers"
|
||||
fileDescription = "Puja fotos o documents existents des del dispositiu"
|
||||
cameraAccessDenied = "S'ha denegat l'accés a la càmera. Habilita l'accés a la càmera."
|
||||
back = "Enrere"
|
||||
settings = "Configuració"
|
||||
edgeDetection = "Detecció de vores"
|
||||
flashlight = "Llanterna"
|
||||
flash = "Flash"
|
||||
processing = "Processant..."
|
||||
capture = "Captura la foto"
|
||||
selectFilesPrompt = "Selecciona els fitxers per pujar"
|
||||
selectImage = "Selecciona la imatge"
|
||||
preview = "Previsualitza"
|
||||
retake = "Torna a fer-la"
|
||||
addToBatch = "Afegeix al lot"
|
||||
upload = "Puja"
|
||||
batchImages = "Lot"
|
||||
clearBatch = "Buida"
|
||||
uploadAll = "Puja-ho tot"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Máte neuložené změny v PDF."
|
||||
pendingRedactionsTitle = "Neaplikovaná začernění"
|
||||
pendingRedactions = "Máte neaplikovaná začernění, která budou ztracena."
|
||||
areYouSure = "Opravdu chcete odejít?"
|
||||
unsavedChangesTitle = "Neuložené změny"
|
||||
keepWorking = "Pokračovat v práci"
|
||||
discardChanges = "Zahodit a odejít"
|
||||
discardRedactions = "Zahodit a odejít"
|
||||
applyAndContinue = "Uložit a odejít"
|
||||
exportAndContinue = "Exportovat a pokračovat"
|
||||
cancel = "Zrušit"
|
||||
@@ -343,10 +340,6 @@ advance = "Pokročilé"
|
||||
edit = "Zobrazit a upravit"
|
||||
popular = "Oblíbené"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Předvolby"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Týmy"
|
||||
title = "Konfigurace"
|
||||
systemSettings = "Systémová nastavení"
|
||||
features = "Funkce"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Koncové body"
|
||||
database = "Databáze"
|
||||
advanced = "Pokročilé"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Pokročilé"
|
||||
title = "Zabezpečení a ověřování"
|
||||
security = "Zabezpečení"
|
||||
connections = "Připojení"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licencování a analytika"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Aktuální verze"
|
||||
latestVersion = "Nejnovější verze"
|
||||
checkForUpdates = "Zkontrolovat aktualizace"
|
||||
viewDetails = "Zobrazit podrobnosti"
|
||||
serverNeedsUpdate = "Server musí být aktualizován administrátorem"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informace o verzi"
|
||||
description = "Podrobnosti o verzích desktopu a serveru"
|
||||
desktop = "Verze desktopu"
|
||||
server = "Verze serveru"
|
||||
|
||||
[settings.security]
|
||||
title = "Security"
|
||||
description = "Update your password to keep your account secure."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Change your password. You will be logged out after updating."
|
||||
required = "All fields are required."
|
||||
mismatch = "New passwords do not match."
|
||||
error = "Unable to update password. Please verify your current password and try again."
|
||||
success = "Password updated successfully. Please sign in again."
|
||||
ssoDisabled = "Password changes are managed by your identity provider."
|
||||
current = "Current password"
|
||||
currentPlaceholder = "Enter your current password"
|
||||
new = "New password"
|
||||
newPlaceholder = "Enter a new password"
|
||||
confirm = "Confirm new password"
|
||||
confirmPlaceholder = "Re-enter your new password"
|
||||
update = "Update password"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Klávesové zkratky"
|
||||
@@ -522,16 +488,11 @@ low = "Nízká"
|
||||
title = "Změnit přihlašovací údaje"
|
||||
header = "Aktualizovat údaje vašeho účtu"
|
||||
changePassword = "Používáte výchozí přihlašovací údaje. Zadejte prosím nové heslo"
|
||||
ssoManaged = "Your account is managed by your identity provider."
|
||||
newUsername = "Nové uživatelské jméno"
|
||||
oldPassword = "Současné heslo"
|
||||
newPassword = "Nové heslo"
|
||||
confirmNewPassword = "Potvrdit nové heslo"
|
||||
submit = "Potvrdit změny"
|
||||
credsUpdated = "Account updated"
|
||||
description = "Changes saved. Please log in again."
|
||||
error = "Unable to update username. Please verify your password and try again."
|
||||
changeUsername = "Update your username. You will be logged out after updating."
|
||||
|
||||
[account]
|
||||
title = "Nastavení účtu"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Nastavení účtu"
|
||||
adminSettings = "Nastavení správce - Zobrazit a přidat uživatele"
|
||||
userControlSettings = "Nastavení ovládání uživatelů"
|
||||
changeUsername = "Změnit uživatelské jméno"
|
||||
changeUsernameDescription = "Aktualizujte své uživatelské jméno. Po aktualizaci budete odhlášeni."
|
||||
newUsernamePlaceholder = "Zadejte své nové uživatelské jméno"
|
||||
newUsername = "Nové uživatelské jméno"
|
||||
password = "Potvrzovací heslo"
|
||||
oldPassword = "Staré heslo"
|
||||
@@ -749,11 +708,6 @@ tags = "podpis,autogram"
|
||||
title = "Podepsat"
|
||||
desc = "Přidá podpis do PDF kreslením, textem nebo obrázkem"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotate,highlight,draw"
|
||||
title = "Annotate"
|
||||
desc = "Highlight, draw, add notes and shapes in the viewer"
|
||||
|
||||
[home.flatten]
|
||||
tags = "zjednodušit,odstranit,interaktivní"
|
||||
title = "Zploštit"
|
||||
@@ -965,7 +919,7 @@ title = "Překrýt PDF"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor textu PDF"
|
||||
desc = "Prohlížejte a upravujte exporty JSON ze Stirling PDF se skupinovými úpravami textu a regenerací PDF"
|
||||
desc = "Upravujte existující text a obrázky v PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "text,anotace,štítek"
|
||||
@@ -976,7 +930,6 @@ desc = "Přidejte libovolný text kamkoli do PDF"
|
||||
addFiles = "Přidat soubory"
|
||||
uploadFromComputer = "Nahrát z počítače"
|
||||
openFromComputer = "Otevřít z počítače"
|
||||
mobileUpload = "Nahrát z mobilu"
|
||||
|
||||
[viewPdf]
|
||||
tags = "zobrazit,číst,anotovat,text,obrázek"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Možnosti CBZ → PDF"
|
||||
optimizeForEbook = "Optimalizovat PDF pro čtečky e‑knih (používá Ghostscript)"
|
||||
cbzOutputOptions = "Možnosti PDF → CBZ"
|
||||
cbzDpi = "DPI pro vykreslení obrázků"
|
||||
cbrOptions = "CBR Options"
|
||||
cbrOutputOptions = "PDF to CBR Options"
|
||||
cbrDpi = "DPI for image rendering"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook to PDF Options"
|
||||
ebookOptionsDesc = "Options for converting eBooks to PDF"
|
||||
embedAllFonts = "Embed all fonts"
|
||||
embedAllFontsDesc = "Embed all fonts from the eBook into the generated PDF"
|
||||
includeTableOfContents = "Include table of contents"
|
||||
includeTableOfContentsDesc = "Add a generated table of contents to the resulting PDF"
|
||||
includePageNumbers = "Include page numbers"
|
||||
includePageNumbersDesc = "Add page numbers to the generated PDF"
|
||||
optimizeForEbookPdf = "Optimize for ebook readers"
|
||||
optimizeForEbookPdfDesc = "Optimize the PDF for eBook reading (smaller file size, better rendering on eInk devices)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Možnosti převodu PDF do eBooku"
|
||||
epubOptionsDesc = "Možnosti pro převod PDF na EPUB/AZW3"
|
||||
detectChapters = "Detekovat kapitoly"
|
||||
detectChaptersDesc = "Rozpoznat nadpisy vypadající jako kapitoly a vložit zalomení stránek EPUB"
|
||||
targetDevice = "Cílové zařízení"
|
||||
targetDeviceDesc = "Vyberte výstupní profil optimalizovaný pro zařízení čtečky"
|
||||
outputFormat = "Výstupní formát"
|
||||
outputFormatDesc = "Vyberte výstupní formát pro eBook"
|
||||
tabletPhone = "Tablet/Telefon (s obrázky)"
|
||||
kindleEink = "Kindle e-Ink (optimalizováno pro text)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "převod,img,jpg,obrázek,fotka"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Přidat přílohu"
|
||||
remove = "Odebrat přílohu"
|
||||
embed = "Vložit přílohu"
|
||||
convertToPdfA3b = "Convert to PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Creates an archival PDF with embedded attachments"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b is an archival format ensuring long-term preservation. It allows embedding arbitrary file formats as attachments. Conversion requires Ghostscript and may take longer for large files."
|
||||
convertToPdfA3bTooltipHeader = "About PDF/A-3b Conversion"
|
||||
convertToPdfA3bTooltipTitle = "What it does"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Uložené"
|
||||
label = "Nahrát obrázek podpisu"
|
||||
placeholder = "Vyberte obrazový soubor"
|
||||
hint = "Nahrajte PNG nebo JPG s vaším podpisem"
|
||||
removeBackground = "Remove white background (make transparent)"
|
||||
processing = "Processing image..."
|
||||
backgroundRemovalFailedTitle = "Background removal failed"
|
||||
backgroundRemovalFailedMessage = "Could not remove the background from the image. Using original image instead."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Jak přidat podpis"
|
||||
@@ -2434,11 +2351,6 @@ note = "Zploštění odstraní interaktivní prvky z PDF a učiní je needitovat
|
||||
label = "Zploštit pouze formuláře"
|
||||
desc = "Zploštit pouze formulářová pole, ostatní interaktivní prvky ponechat"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Rendering DPI (optional, recommended 150 DPI)"
|
||||
help = "Leave blank to use the system default. Higher DPI sharpens output but increases processing time and file size."
|
||||
placeholder = "e.g. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Výsledky zploštění"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Oříznout PDF"
|
||||
submit = "Odeslat"
|
||||
noFileSelected = "Vyberte soubor PDF pro zahájení ořezu"
|
||||
reset = "Obnovit na celé PDF"
|
||||
autoCrop = "Auto-crop whitespace"
|
||||
|
||||
[crop.preview]
|
||||
title = "Výběr oblasti ořezu"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metoda začernění"
|
||||
mode = "Režim"
|
||||
automatic = "Automatický"
|
||||
automaticDesc = "Začernit text podle vyhledávaných výrazů"
|
||||
automaticDisabledTooltip = "Vyberte soubory ve správci souborů, abyste začernili více souborů najednou"
|
||||
manual = "Manuální"
|
||||
manualDesc = "Kliknutím a tažením začerněte konkrétní oblasti"
|
||||
manualComingSoon = "Ruční začernění již brzy"
|
||||
@@ -3315,35 +3225,8 @@ text = "Shoduje pouze celá slova, ne částečné. Při zapnutí se 'John' nesh
|
||||
title = "Převést na PDF-Image"
|
||||
text = "Po začernění převede PDF na obrazové PDF. Zajistí, že text pod začerněnými políčky je zcela odstraněn a nelze jej obnovit."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Ovládání ručního začernění"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Nástroj pro označení textu"
|
||||
text = "Vyberte text přímo v PDF a označte ho pro začernění. Klikněte a tažením vyznačte konkrétní text, který chcete začernit."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Nástroj pro označení oblasti"
|
||||
text = "Kreslete v PDF obdélníkové oblasti a označte je pro začernění. Užitečné pro začernění obrázků, podpisů nebo nepravidelných tvarů."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Použít začernění"
|
||||
text = "Po označení obsahu klikněte na „Použít“ a trvale začerněte všechny označené oblasti. Počet čekajících ukazuje, kolik začernění je připraveno k použití."
|
||||
bullet1 = "Před použitím můžete označit libovolný počet oblastí"
|
||||
bullet2 = "Všechna čekající začernění se použijí najednou"
|
||||
bullet3 = "Po použití nelze začernění vrátit zpět"
|
||||
|
||||
[redact.manual]
|
||||
title = "Nástroje pro začernění"
|
||||
instructions = "Vyberte text nebo nakreslete oblasti v PDF a označte obsah pro začernění."
|
||||
markText = "Označit text"
|
||||
markArea = "Označit oblast"
|
||||
pendingLabel = "Čeká:"
|
||||
applyWarning = "⚠️ Trvalé použití, nelze vrátit zpět a data pod začerněním budou smazána"
|
||||
apply = "Použít"
|
||||
noMarks = "Žádné značky začernění. Pomocí nástrojů výše označte obsah pro začernění."
|
||||
header = "Ruční začernění"
|
||||
controlsTitle = "Ovládání ručního začernění"
|
||||
textBasedRedaction = "Začernění založené na textu"
|
||||
pageBasedRedaction = "Začernění podle stránek"
|
||||
convertPDFToImageLabel = "Převést PDF na PDF-Image (použito k odstranění textu za rámečkem)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Zadejte počet horizontálních dělení"
|
||||
label = "Vertikální dělení"
|
||||
placeholder = "Zadejte počet vertikálních dělení"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Split Mode"
|
||||
description = "Choose how to split the pages"
|
||||
splitAll = "Split all pages"
|
||||
splitAllExceptFirst = "Split all except first"
|
||||
splitAllExceptLast = "Split all except last"
|
||||
splitAllExceptFirstAndLast = "Split all except first and last"
|
||||
custom = "Custom pages"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Custom Page Numbers"
|
||||
placeholder = "e.g. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Razítko,Přidat obrázek,centrovat obrázek,Vodoznak,PDF,Vložit,Přizpůsobit"
|
||||
header = "Razítko PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Velikost souboru"
|
||||
[compress.grayscale]
|
||||
label = "Použít stupnici šedi pro kompresi"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearize PDF for fast web viewing"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Convert images to line art"
|
||||
description = "Uses ImageMagick to reduce pages to high-contrast black and white for maximum size reduction."
|
||||
unavailable = "ImageMagick is not installed or enabled on this server"
|
||||
detailLevel = "Detail level"
|
||||
edgeEmphasis = "Edge emphasis"
|
||||
edgeLow = "Gentle"
|
||||
edgeMedium = "Balanced"
|
||||
edgeHigh = "Strong"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Přehled nastavení komprese"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Vyšší hodnoty snižují velikost souboru"
|
||||
title = "Stupně šedi"
|
||||
text = "Vyberte tuto možnost pro převod všech obrázků do černobílé, což může výrazně snížit velikost souboru, zejména u skenovaných PDF nebo dokumentů s mnoha obrázky."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "Convert pages to high-contrast black and white using ImageMagick. Use detail level to control how much content becomes black, and edge emphasis to control how aggressively edges are detected."
|
||||
|
||||
[compress.error]
|
||||
failed = "Při kompresi PDF došlo k chybě."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Při kompresi PDF došlo k chybě."
|
||||
_value = "Nastavení komprese"
|
||||
1 = "1–3 komprese PDF,</br> 4–6 mírná komprese obrázků,</br> 7–9 silná komprese obrázků výrazně sníží kvalitu obrazu"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Lower values preserve quality but result in larger files"
|
||||
range4to6 = "Medium compression with moderate quality reduction"
|
||||
range7to9 = "Higher values reduce file size significantly but may reduce image clarity"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Tento soubor je chráněn heslem. Zadejte prosím heslo:"
|
||||
cancelled = "Operace byla zrušena pro PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Smazat vybrané stránky"
|
||||
closePdf = "Zavřít PDF"
|
||||
exportAll = "Exportovat PDF"
|
||||
downloadSelected = "Stáhnout vybrané soubory"
|
||||
annotations = "Annotations"
|
||||
exportSelected = "Exportovat vybrané stránky"
|
||||
saveChanges = "Uložit změny"
|
||||
downloadAll = "Stáhnout vše"
|
||||
saveAll = "Uložit vše"
|
||||
toggleTheme = "Přepnout motiv"
|
||||
toggleBookmarks = "Přepnout záložky"
|
||||
language = "Jazyk"
|
||||
toggleAnnotations = "Přepnout viditelnost anotací"
|
||||
search = "Hledat v PDF"
|
||||
panMode = "Režim posunu"
|
||||
applyRedactionsFirst = "Nejprve použijte začernění"
|
||||
rotateLeft = "Otočit doleva"
|
||||
rotateRight = "Otočit doprava"
|
||||
toggleSidebar = "Přepnout postranní panel"
|
||||
toggleBookmarks = "Přepnout záložky"
|
||||
exportSelected = "Exportovat vybrané stránky"
|
||||
toggleAnnotations = "Přepnout viditelnost anotací"
|
||||
annotationMode = "Přepnout režim anotací"
|
||||
print = "Tisk PDF"
|
||||
draw = "Kreslit"
|
||||
redact = "Začernit"
|
||||
exitRedaction = "Opustit režim začernění"
|
||||
save = "Uložit"
|
||||
downloadAll = "Stáhnout vše"
|
||||
saveAll = "Uložit vše"
|
||||
|
||||
[textAlign]
|
||||
left = "Left"
|
||||
center = "Center"
|
||||
right = "Right"
|
||||
|
||||
[annotation]
|
||||
title = "Annotate"
|
||||
desc = "Use highlight, pen, text, and notes. Changes stay live—no flattening required."
|
||||
highlight = "Highlight"
|
||||
pen = "Pen"
|
||||
text = "Text box"
|
||||
note = "Note"
|
||||
rectangle = "Rectangle"
|
||||
ellipse = "Ellipse"
|
||||
select = "Select"
|
||||
exit = "Exit annotation mode"
|
||||
strokeWidth = "Width"
|
||||
opacity = "Opacity"
|
||||
strokeOpacity = "Stroke Opacity"
|
||||
fillOpacity = "Fill Opacity"
|
||||
fontSize = "Font size"
|
||||
chooseColor = "Choose colour"
|
||||
color = "Colour"
|
||||
strokeColor = "Stroke Colour"
|
||||
fillColor = "Fill Colour"
|
||||
underline = "Underline"
|
||||
strikeout = "Strikeout"
|
||||
squiggly = "Squiggly"
|
||||
inkHighlighter = "Freehand Highlighter"
|
||||
freehandHighlighter = "Freehand Highlighter"
|
||||
square = "Square"
|
||||
circle = "Circle"
|
||||
polygon = "Polygon"
|
||||
line = "Line"
|
||||
stamp = "Add Image"
|
||||
textMarkup = "Text Markup"
|
||||
drawing = "Drawing"
|
||||
shapes = "Shapes"
|
||||
notesStamps = "Notes & Stamps"
|
||||
settings = "Settings"
|
||||
borderOn = "Border: On"
|
||||
borderOff = "Border: Off"
|
||||
editInk = "Edit Pen"
|
||||
editLine = "Edit Line"
|
||||
editNote = "Edit Note"
|
||||
editText = "Edit Text Box"
|
||||
editTextMarkup = "Edit Text Markup"
|
||||
editSelected = "Edit Annotation"
|
||||
editSquare = "Edit Square"
|
||||
editCircle = "Edit Circle"
|
||||
editPolygon = "Edit Polygon"
|
||||
unsupportedType = "This annotation type is not fully supported for editing."
|
||||
textAlignment = "Text Alignment"
|
||||
noteIcon = "Note Icon"
|
||||
imagePreview = "Preview"
|
||||
contents = "Text"
|
||||
backgroundColor = "Background colour"
|
||||
clearBackground = "Remove background"
|
||||
noBackground = "No background"
|
||||
stampSettings = "Stamp Settings"
|
||||
savingCopy = "Preparing download..."
|
||||
saveFailed = "Unable to save copy"
|
||||
saveReady = "Download ready"
|
||||
selectAndMove = "Select and Edit"
|
||||
editSelectDescription = "Click an existing annotation to edit its colour, opacity, text, or size."
|
||||
editStampHint = "To change the image, delete this stamp and add a new one."
|
||||
editSwitchToSelect = "Switch to Select & Edit to edit this annotation."
|
||||
undo = "Undo"
|
||||
redo = "Redo"
|
||||
applyChanges = "Apply Changes"
|
||||
saveChanges = "Uložit změny"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Nastav."
|
||||
adminSettings = "Admin nastav."
|
||||
allTools = "All Tools"
|
||||
reader = "Čtečka"
|
||||
tours = "Tours"
|
||||
showMeAround = "Show me around"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Watch walkthroughs here: Tools tour, New V2 layout tour, and the Admin tour."
|
||||
user = "Watch walkthroughs here: Tools tour and the New V2 layout tour."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Prohlídka nástrojů"
|
||||
toolsTourDesc = "Zjistěte, co nástroje umí"
|
||||
adminTour = "Prohlídka administrace"
|
||||
adminTourDesc = "Prozkoumejte nastavení a funkce pro správce"
|
||||
whatsNewTour = "See what's new in V2"
|
||||
whatsNewTourDesc = "Tour the updated layout"
|
||||
|
||||
[admin]
|
||||
error = "Chyba"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Nepodařilo se načíst nastavení"
|
||||
saveError = "Nepodařilo se uložit nastavení"
|
||||
saved = "Nastavení byla úspěšně uložena"
|
||||
saveSuccess = "Nastavení byla úspěšně uložena"
|
||||
success = "Nastavení byla úspěšně uložena"
|
||||
error = "Nastavení se nepodařilo uložit"
|
||||
save = "Uložit změny"
|
||||
discard = "Zahodit"
|
||||
restartRequired = "Vyžadován restart"
|
||||
@@ -4422,13 +4185,6 @@ description = "Cesta ke spustitelnému souboru WeasyPrint pro převod HTML do PD
|
||||
label = "Spustitelný soubor unoconvert"
|
||||
description = "Cesta k LibreOffice unoconvert pro převody dokumentů (ponechte prázdné pro výchozí: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Základní URL pro frontend (např. https://pdf.example.com). Používá se pro odkazy v e‑mailových pozvánkách a nahrávání přes mobilní QR kód. Ponechte prázdné pro použití backend URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Klikněte pro zobrazení detailů tarifu"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Zabezpečení"
|
||||
description = "Nakonfigurujte autentizaci, chování přihlášení a bezpečnostní zásady."
|
||||
@@ -4505,7 +4261,7 @@ description = "Sledovat akce uživatelů a systémové události pro compliance
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Úroveň auditu"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=VYPNUTO, 1=ZÁKLADNÍ, 2=STANDARDNÍ, 3=PODROBNÝ"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Doba uchování auditů (dny)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Připojit"
|
||||
disconnect = "Odpojit"
|
||||
disconnected = "Poskytovatel byl úspěšně odpojen"
|
||||
disconnectError = "Nepodařilo se odpojit poskytovatele"
|
||||
mobileScannerConvertToPdf = "Převádět obrázky do PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automaticky převádí nahrané obrázky do formátu PDF. Pokud je vypnuto, obrázky zůstanou beze změny."
|
||||
mobileScannerImageResolution = "Rozlišení obrázků"
|
||||
mobileScannerImageResolutionDesc = "Rozlišení nahraných obrázků. \"Snížené\" zmenší obrázky na max. 1200 px pro snížení velikosti souboru."
|
||||
imageResolutionFull = "Plné (původní velikost)"
|
||||
imageResolutionReduced = "Snížené (max. 1200 px)"
|
||||
mobileScannerPageFormat = "Formát stránky"
|
||||
mobileScannerPageFormatDesc = "Velikost stránky PDF pro převedené obrázky. \"Ponechat\" použije původní rozměry obrázků."
|
||||
pageFormatKeep = "Ponechat (původní rozměry)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 in)"
|
||||
mobileScannerStretchToFit = "Roztáhnout na celou stránku"
|
||||
mobileScannerStretchToFitDesc = "Roztáhne obrázky tak, aby vyplnily celou stránku. Pokud je vypnuto, obrázky se vystředí se zachováním poměru stran."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Automatické přihlášení SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Automaticky vytvořit uživatelské účty při prvním přihlá
|
||||
label = "Blokovat registraci"
|
||||
description = "Zabránit registraci nových uživatelů přes SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Nahrávání z mobilního telefonu"
|
||||
enable = "Povolit nahrávání pomocí QR kódu"
|
||||
description = "Umožní uživatelům nahrávat soubory z mobilních zařízení po načtení QR kódu"
|
||||
note = "Poznámka: Vyžaduje nastavenou Frontend URL. "
|
||||
link = "Nastavit v systémovém nastavení"
|
||||
mobileScannerConvertToPdf = "Převádět obrázky do PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automaticky převádí nahrané obrázky do formátu PDF. Pokud je vypnuto, obrázky zůstanou beze změny."
|
||||
mobileScannerImageResolution = "Rozlišení obrázků"
|
||||
mobileScannerImageResolutionDesc = "Rozlišení nahraných obrázků. \"Snížené\" zmenší obrázky na max. 1200 px pro snížení velikosti souboru."
|
||||
imageResolutionFull = "Plné (původní velikost)"
|
||||
imageResolutionReduced = "Snížené (max. 1200 px)"
|
||||
mobileScannerPageFormat = "Formát stránky"
|
||||
mobileScannerPageFormatDesc = "Velikost stránky PDF pro převedené obrázky. \"Ponechat\" použije původní rozměry obrázků."
|
||||
pageFormatKeep = "Ponechat (původní rozměry)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 in)"
|
||||
mobileScannerStretchToFit = "Roztáhnout na celou stránku"
|
||||
mobileScannerStretchToFitDesc = "Roztáhne obrázky tak, aby vyplnily celou stránku. Pokud je vypnuto, obrázky se vystředí se zachováním poměru stran."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram bot"
|
||||
description = "Nastavte připojení Telegram bota, řízení přístupu a způsob zpětné vazby."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Povolit Telegram bota"
|
||||
description = "Umožněte uživatelům pracovat se Stirling PDF prostřednictvím vámi nastaveného Telegram bota."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Uživatelské jméno bota"
|
||||
description = "Veřejné uživatelské jméno vašeho Telegram bota."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token bota"
|
||||
description = "API token poskytnutý BotFatherem pro vašeho Telegram bota."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Složka doručených"
|
||||
description = "Složka v adresáři pipeline, kam se ukládají příchozí soubory z Telegramu."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Použít vlastní příponu složky"
|
||||
description = "Připojit ID chatu k příchozím složkám souborů pro oddělení nahrávání podle chatu."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Řízení přístupu"
|
||||
description = "Omezte, kteří uživatelé nebo kanály mohou s botem komunikovat."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Povolit konkrétní ID uživatelů"
|
||||
description = "Pokud je zapnuto, bota mohou používat pouze uvedená ID uživatelů."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Povolená ID uživatelů"
|
||||
description = "Zadejte ID uživatelů Telegramu, kteří mohou s botem komunikovat."
|
||||
placeholder = "Přidejte ID uživatele a stiskněte Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Povolit konkrétní ID kanálů"
|
||||
description = "Pokud je zapnuto, bota mohou používat pouze uvedená ID kanálů."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Povolená ID kanálů"
|
||||
description = "Zadejte ID kanálů Telegramu, které mohou s botem komunikovat."
|
||||
placeholder = "Přidejte ID kanálu a stiskněte Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Zpracování"
|
||||
description = "Nastavte intervaly dotazování a limity zpracování pro nahrávání z Telegramu."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Časový limit zpracování (sekundy)"
|
||||
description = "Maximální doba čekání na úlohu zpracování před ohlášením chyby."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interval dotazování (ms)"
|
||||
description = "Interval mezi kontrolami nových Telegram aktualizací."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Zprávy zpětné vazby"
|
||||
description = "Zvolte, kdy má bot posílat zpětnou vazbu uživatelům a kanálům."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Povolit zpětnou vazbu"
|
||||
description = "Určuje, zda bot vůbec posílá zprávy se zpětnou vazbou."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Pravidla zpětné vazby pro kanály"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Zobrazit \"No valid document\" (Kanál)"
|
||||
description = "Potlačit odpověď no valid document pro nahrávání do kanálů."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Zobrazit chyby zpracování (Kanál)"
|
||||
description = "Posílat do kanálů chybové zprávy o zpracování."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Zobrazit chybová hlášení (Kanál)"
|
||||
description = "Zobrazit podrobná chybová hlášení pro kanály."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Pravidla zpětné vazby pro uživatele"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Zobrazit \"No valid document\" (Uživatel)"
|
||||
description = "Potlačit odpověď no valid document pro nahrávání od uživatelů."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Zobrazit chyby zpracování (Uživatel)"
|
||||
description = "Posílat chybové zprávy o zpracování uživatelům."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Zobrazit chybová hlášení (Uživatel)"
|
||||
description = "Zobrazit podrobná chybová hlášení pro uživatele."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Databáze"
|
||||
description = "Nakonfigurujte vlastní nastavení připojení k databázi pro podniková nasazení."
|
||||
@@ -4943,10 +4570,6 @@ description = "Umožnit správcům zvát uživatele e-mailem s automaticky gener
|
||||
label = "URL frontendu"
|
||||
description = "Základní URL pro frontend (např. https://pdf.example.com). Používá se pro generování odkazů na pozvánky v e-mailech. Ponechte prázdné pro použití backend URL."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Poznámka: Vyžaduje nastavenou Frontend URL. "
|
||||
link = "Nastavit v systémovém nastavení"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Právní dokumenty"
|
||||
description = "Nakonfigurujte odkazy na právní dokumenty a zásady."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Moje soubory"
|
||||
noRecentFiles = "Nebyly nalezeny žádné nedávné soubory"
|
||||
googleDriveNotAvailable = "Integrace s Google Drive není dostupná"
|
||||
mobileUpload = "Nahrávání z mobilu"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "Nahrávání z mobilu není povoleno"
|
||||
downloadSelected = "Stáhnout vybrané"
|
||||
saveSelected = "Uložit vybrané"
|
||||
openFiles = "Otevřít soubory"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Načítání..."
|
||||
back = "Zpět"
|
||||
continue = "Pokračovat"
|
||||
error = "Chyba"
|
||||
save = "Save"
|
||||
|
||||
[config.overview]
|
||||
title = "Konfigurace aplikace"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Všechny aplikace nebo služby, které tyto klíče aktuálně použí
|
||||
confirmPrompt = "Opravdu chcete pokračovat?"
|
||||
confirmCta = "Obnovit klíče"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Chyba API klíče"
|
||||
failedToCreateApiKey = "Nepodařilo se vytvořit API klíč."
|
||||
failedToRetrieveApiKey = "Nepodařilo se získat API klíč z odpovědi."
|
||||
failedToFetchApiKey = "Nepodařilo se načíst API klíč."
|
||||
apiKeyRefreshed = "API klíč obnoven"
|
||||
apiKeyRefreshedBody = "Váš API klíč byl úspěšně obnoven."
|
||||
failedToRefreshApiKey = "Nepodařilo se obnovit API klíč."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Vybrat přílohy"
|
||||
info = "Vyberte soubory, které chcete připojit k PDF. Tyto soubory budou vloženy a dostupné v panelu příloh PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Dokončit"
|
||||
startTour = "Spustit prohlídku"
|
||||
startTourDescription = "Vydejte se na průvodce hlavními funkcemi Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Start at the <strong>Quick Access</strong> rail to jump between Reader, Automate, your files, and all the tours."
|
||||
leftPanel = "The left <strong>Tools</strong> panel lists everything you can do. Browse categories or search to find a tool quickly."
|
||||
fileUpload = "Use the <strong>Files</strong> button to upload or pick a recent PDF. We will load a sample so you can see the workspace."
|
||||
rightRail = "The <strong>Right Rail</strong> holds quick actions to select files, change theme or language, and download results."
|
||||
topBar = "The top bar lets you swap between <strong>Viewer</strong>, <strong>Page Editor</strong>, and <strong>Active Files</strong>."
|
||||
pageEditorView = "Switch to the Page Editor to reorder, rotate, or delete pages."
|
||||
activeFilesView = "Use Active Files to see everything you have open and pick what to work on."
|
||||
wrapUp = "That is what is new in V2. Open the <strong>Tours</strong> menu anytime to replay this, the Tools tour, or the Admin tour."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Vítejte ve Stirling PDF!"
|
||||
description = "Chcete si dát rychlou 1minutovou prohlídku a naučit se klíčové funkce a jak začít?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Stáhnout →"
|
||||
showMeAround = "Proveďte mě"
|
||||
skipTheTour = "Přeskočit průvodce"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Tour Overview"
|
||||
body = "Stirling PDF V2 ships with dozens of tools and a refreshed layout. Take a quick tour to see what changed and where to find the features you need."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Zatím přeskočit"
|
||||
seePlans = "Zobrazit plány →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Upgradovat nyní →"
|
||||
freeTitle = "Serverová licence"
|
||||
overLimitTitle = "Vyžadována serverová licence"
|
||||
overLimitBody = "Naše licencování umožňuje až <strong>{{freeTierLimit}}</strong> uživatelů zdarma na server. Máte <strong>{{overLimitUserCopy}}</strong> uživatelů Stirling. Pro nepřerušené používání přejděte na plán Stirling Server – <strong>neomezený počet míst</strong>, úpravy textu PDF a plná správa za 99 $/server/měsíc."
|
||||
freeBody = "Naše licencování <strong>Open-Core</strong> umožňuje až <strong>{{freeTierLimit}}</strong> uživatelů zdarma na server. Pro nepřerušený růst a přednostní přístup k našemu novému <strong>nástroji pro úpravu textu PDF</strong> doporučujeme plán Stirling Server – plné úpravy a <strong>neomezený počet míst</strong> za 99 $/server/měsíc."
|
||||
freeBody = "Naše licencování <strong>Open-Core</strong> umožňuje až <strong>{{freeTierLimit}}</strong> uživatelů zdarma na server. Pro nepřerušované škálování doporučujeme plán Stirling Server - <strong>neomezený počet míst</strong> a <strong>podpora SSO</strong> za $99/server/měs."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Stáhnout"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Kontaktovat obchod"
|
||||
contactToUpgrade = "Kontaktujte nás pro upgrade nebo úpravu plánu"
|
||||
maxUsers = "Max. počet uživatelů"
|
||||
upTo = "Až"
|
||||
getLicense = "Get Server License"
|
||||
upgradeToEnterprise = "Upgrade to Enterprise"
|
||||
selectPeriod = "Select Billing Period"
|
||||
monthlyBilling = "Monthly Billing"
|
||||
yearlyBilling = "Yearly Billing"
|
||||
checkoutOpened = "Checkout Opened"
|
||||
checkoutInstructions = "Complete your purchase in the Stripe tab. After payment, return here and refresh the page to activate your license. You will also receive an email with your license key."
|
||||
activateLicense = "Activate Your License"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout Opened in New Tab"
|
||||
instructions = "Complete your purchase in the Stripe tab. Once your payment is complete, you will receive an email with your license key."
|
||||
enterKey = "Enter your license key below to activate your plan:"
|
||||
keyDescription = "Paste the license key from your email"
|
||||
activate = "Activate License"
|
||||
doLater = "I'll do this later"
|
||||
success = "License Activated!"
|
||||
successMessage = "Your license has been successfully activated. You can now close this window."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Email Verification Required"
|
||||
message = "You will need to verify your email address in the Stripe billing portal. Check your email for a login link."
|
||||
|
||||
[plan.period]
|
||||
month = "měsíc"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Systém auditu není k dispozici"
|
||||
notAvailableMessage = "Systém auditu není nakonfigurován nebo není k dispozici."
|
||||
disabled = "Záznam auditu je vypnutý"
|
||||
disabledMessage = "Pro sledování systémových událostí povolte záznam auditu v konfiguraci aplikace."
|
||||
enterpriseRequired = "Enterprise License Required"
|
||||
enterpriseRequiredMessage = "The audit logging system is an enterprise feature. Please upgrade to an enterprise license to access audit logs and analytics."
|
||||
|
||||
[audit.error]
|
||||
title = "Chyba při načítání systému auditu"
|
||||
@@ -6292,7 +5864,7 @@ title = "Graf využití endpointů"
|
||||
|
||||
[usage.table]
|
||||
title = "Podrobné statistiky"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Koncový bod"
|
||||
visits = "Návštěvy"
|
||||
percentage = "Procenta"
|
||||
noData = "Žádná data nejsou k dispozici"
|
||||
@@ -6370,7 +5942,6 @@ description = "Zadejte úplnou URL vašeho samohostovaného serveru Stirling PDF
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Zadejte URL serveru"
|
||||
invalidUrl = "Neplatný formát URL. Zadejte prosím platné URL, například https://your-server.com"
|
||||
unreachable = "Nelze se připojit k serveru"
|
||||
testFailed = "Test připojení selhal"
|
||||
configFetch = "Nepodařilo se načíst konfiguraci serveru. Zkontrolujte prosím URL a zkuste to znovu."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Připojuji se k:"
|
||||
submit = "Přihlásit se"
|
||||
signInWith = "Přihlásit se pomocí"
|
||||
oauthPending = "Otevírám prohlížeč pro ověření..."
|
||||
sso = "Jednotné přihlášení"
|
||||
orContinueWith = "Nebo pokračovat e-mailem"
|
||||
serverRequirement = "Poznámka: Na serveru musí být povoleno přihlášení."
|
||||
showInstructions = "Jak povolit?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Odstavcová stránka"
|
||||
sparse = "Řídký text"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automaticky"
|
||||
paragraph = "Odstavec"
|
||||
singleLine = "Jeden řádek"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Obnovit změny"
|
||||
downloadJson = "Stáhnout JSON"
|
||||
generatePdf = "Vytvořit PDF"
|
||||
saveChanges = "Uložit změny"
|
||||
applyChanges = "Apply Changes"
|
||||
downloadCopy = "Download Copy"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automaticky přizpůsobit text rámečkům"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tip: Podržením Ctrl (Cmd) nebo Shift vyberete více texto
|
||||
title = "Uzamknout upravený text do jednoho prvku PDF"
|
||||
description = "Při zapnutí editor exportuje každý upravený textový rámeček jako jeden textový prvek PDF, aby se předešlo překrývání znaků nebo míchání fontů."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Advanced Settings"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Preview Limitations"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Text and Image Focus"
|
||||
text = "This workspace focuses on editing text and repositioning embedded images. Complex page artwork, form widgets, and layered graphics are preserved for export but are not fully editable here."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Preview Variance"
|
||||
text = "Some visuals (such as table borders, shapes, or annotation appearances) may not display exactly in the preview. The exported PDF keeps the original drawing commands whenever possible."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha Viewer"
|
||||
text = "This alpha viewer is still evolving—certain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Sloučit vybrané rámečky"
|
||||
merge = "Sloučit výběr"
|
||||
@@ -6556,13 +6106,13 @@ warnings = "Varování"
|
||||
suggestions = "Poznámky"
|
||||
currentPageFonts = "Fonty na této stránce"
|
||||
allFonts = "Všechny fonty"
|
||||
fallback = "fallback"
|
||||
fallback = "náhradní"
|
||||
missing = "chybí"
|
||||
perfectMessage = "Všechny fonty lze reprodukovat dokonale."
|
||||
warningMessage = "Některé fonty se nemusí vykreslit správně."
|
||||
infoMessage = "K dispozici jsou informace o reprodukci fontů."
|
||||
perfect = "perfect"
|
||||
subset = "subset"
|
||||
perfect = "dokonalé"
|
||||
subset = "podmnožina"
|
||||
|
||||
[pdfTextEditor.errors]
|
||||
invalidJson = "Nelze přečíst soubor JSON. Ujistěte se, že byl vytvořen nástrojem PDF to JSON."
|
||||
@@ -6614,58 +6164,3 @@ title = "Výsledky přidání textu"
|
||||
|
||||
[addText.error]
|
||||
failed = "Při přidávání textu do PDF došlo k chybě."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Nahrát z mobilu"
|
||||
description = "Naskenujte pro nahrání fotografií. Obrázky se automaticky převedou do PDF."
|
||||
descriptionNoConvert = "Naskenujte pro nahrání fotografií z mobilního zařízení."
|
||||
error = "Chyba připojení"
|
||||
pollingError = "Chyba při kontrole souborů"
|
||||
sessionId = "ID relace"
|
||||
sessionCreateError = "Nepodařilo se vytvořit relaci"
|
||||
expiryWarning = "Relace brzy vyprší"
|
||||
expiryWarningMessage = "Tento QR kód vyprší za {{seconds}} s. Nový kód bude vygenerován automaticky."
|
||||
filesReceived = "Přijato {{count}} soubor(ů)"
|
||||
connected = "Mobilní zařízení připojeno"
|
||||
instructions = "Naskenujte fotoaparátem telefonu. Obrázky se automaticky převedou do PDF."
|
||||
instructionsNoConvert = "Naskenujte fotoaparátem telefonu pro nahrání souborů."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobilní skener"
|
||||
noSession = "Neplatná relace"
|
||||
noSessionMessage = "Pro přístup na tuto stránku naskenujte platný QR kód."
|
||||
validating = "Ověřuje se relace..."
|
||||
sessionInvalid = "Chyba relace"
|
||||
sessionExpired = "Tato relace vypršela. Obnovte stránku a zkuste to znovu."
|
||||
sessionNotFound = "Relace nebyla nalezena. Obnovte stránku a zkuste to znovu."
|
||||
sessionValidationError = "Relaci se nepodařilo ověřit. Zkuste to prosím znovu."
|
||||
uploadSuccess = "Nahrávání úspěšné!"
|
||||
uploadSuccessMessage = "Vaše obrázky byly přeneseny."
|
||||
httpsRequired = "Přístup ke kameře vyžaduje HTTPS nebo localhost. Použijte prosím HTTPS nebo přístup přes localhost."
|
||||
uploadFailed = "Nahrávání se nezdařilo. Zkuste to prosím znovu."
|
||||
uploading = "Nahrává se..."
|
||||
connected = "Připojeno"
|
||||
connecting = "Připojuje se..."
|
||||
chooseMethod = "Zvolte způsob nahrávání"
|
||||
chooseMethodDescription = "Vyberte, jak chcete skenovat a nahrávat dokumenty"
|
||||
camera = "Fotoaparát"
|
||||
cameraDescription = "Skenujte dokumenty fotoaparátem zařízení s automatickou detekcí okrajů"
|
||||
fileUpload = "Nahrání souboru"
|
||||
fileDescription = "Nahrajte existující fotografie nebo dokumenty ze zařízení"
|
||||
cameraAccessDenied = "Přístup ke kameře odepřen. Povolte prosím přístup ke kameře."
|
||||
back = "Zpět"
|
||||
settings = "Nastavení"
|
||||
edgeDetection = "Detekce okrajů"
|
||||
flashlight = "Svítilna"
|
||||
flash = "Blesk"
|
||||
processing = "Zpracovává se..."
|
||||
capture = "Pořídit snímek"
|
||||
selectFilesPrompt = "Vyberte soubory k nahrání"
|
||||
selectImage = "Vybrat obrázek"
|
||||
preview = "Náhled"
|
||||
retake = "Znovu vyfotit"
|
||||
addToBatch = "Přidat do dávky"
|
||||
upload = "Nahrát"
|
||||
batchImages = "Dávka"
|
||||
clearBatch = "Vymazat"
|
||||
uploadAll = "Nahrát vše"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Du har ikke-gemte ændringer i din PDF."
|
||||
pendingRedactionsTitle = "Ikke-anvendte maskeringer"
|
||||
pendingRedactions = "Du har ikke-anvendte maskeringer, som vil gå tabt."
|
||||
areYouSure = "Er du sikker på, at du vil forlade?"
|
||||
unsavedChangesTitle = "Ikke-gemte ændringer"
|
||||
keepWorking = "Fortsæt med at arbejde"
|
||||
discardChanges = "Kassér og forlad"
|
||||
discardRedactions = "Kassér og forlad"
|
||||
applyAndContinue = "Gem og forlad"
|
||||
exportAndContinue = "Eksportér og fortsæt"
|
||||
cancel = "Annuller"
|
||||
@@ -343,10 +340,6 @@ advance = "Avanceret"
|
||||
edit = "Vis & Redigér"
|
||||
popular = "Populære"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Præferencer"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Teams"
|
||||
title = "Konfiguration"
|
||||
systemSettings = "Systemindstillinger"
|
||||
features = "Funktioner"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Slutpunkter"
|
||||
database = "Database"
|
||||
advanced = "Avanceret"
|
||||
|
||||
@@ -367,12 +360,11 @@ advanced = "Avanceret"
|
||||
title = "Sikkerhed og autentificering"
|
||||
security = "Sikkerhed"
|
||||
connections = "Forbindelser"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licensering & Analytics"
|
||||
plan = "Plan"
|
||||
audit = "Audit"
|
||||
audit = "Revision"
|
||||
usageAnalytics = "Brugsanalyse"
|
||||
|
||||
[settings.policiesPrivacy]
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Nuværende version"
|
||||
latestVersion = "Seneste version"
|
||||
checkForUpdates = "Søg efter opdateringer"
|
||||
viewDetails = "Vis detaljer"
|
||||
serverNeedsUpdate = "Serveren skal opdateres af administratoren"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Versionsoplysninger"
|
||||
description = "Detaljer om desktop- og serverversion"
|
||||
desktop = "Desktopversion"
|
||||
server = "Serverversion"
|
||||
|
||||
[settings.security]
|
||||
title = "Sikkerhed"
|
||||
description = "Opdater din adgangskode for at holde din konto sikker."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Skift din adgangskode. Du bliver logget ud efter opdatering."
|
||||
required = "Alle felter er obligatoriske."
|
||||
mismatch = "Nye adgangskoder matcher ikke."
|
||||
error = "Kan ikke opdatere adgangskode. Bekræft din nuværende adgangskode og prøv igen."
|
||||
success = "Adgangskoden er opdateret. Log ind igen."
|
||||
ssoDisabled = "Adgangskodeændringer administreres af din identitetsudbyder."
|
||||
current = "Nuværende adgangskode"
|
||||
currentPlaceholder = "Indtast din nuværende adgangskode"
|
||||
new = "Ny adgangskode"
|
||||
newPlaceholder = "Indtast en ny adgangskode"
|
||||
confirm = "Bekræft ny adgangskode"
|
||||
confirmPlaceholder = "Indtast din nye adgangskode igen"
|
||||
update = "Opdater adgangskode"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Tastaturgenveje"
|
||||
@@ -522,16 +488,11 @@ low = "Lav"
|
||||
title = "Skift Legitimationsoplysninger"
|
||||
header = "Opdater Dine Kontooplysninger"
|
||||
changePassword = "Du bruger standard loginoplysninger. Indtast venligst en ny adgangskode"
|
||||
ssoManaged = "Din konto administreres af din identitetsudbyder."
|
||||
newUsername = "Nyt Brugernavn"
|
||||
oldPassword = "Nuværende Adgangskode"
|
||||
newPassword = "Ny Adgangskode"
|
||||
confirmNewPassword = "Bekræft Ny Adgangskode"
|
||||
submit = "Indsend Ændringer"
|
||||
credsUpdated = "Konto opdateret"
|
||||
description = "Ændringer gemt. Log ind igen."
|
||||
error = "Kan ikke opdatere brugernavn. Bekræft din adgangskode og prøv igen."
|
||||
changeUsername = "Opdater dit brugernavn. Du bliver logget ud efter opdatering."
|
||||
|
||||
[account]
|
||||
title = "Kontoindstillinger"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Kontoindstillinger"
|
||||
adminSettings = "Administratorindstillinger - Se og Tilføj Brugere"
|
||||
userControlSettings = "Brugerkontrolindstillinger"
|
||||
changeUsername = "Skift Brugernavn"
|
||||
changeUsernameDescription = "Opdater dit brugernavn. Du bliver logget ud efter opdatering."
|
||||
newUsernamePlaceholder = "Indtast dit nye brugernavn"
|
||||
newUsername = "Nyt Brugernavn"
|
||||
password = "Bekræftelsesadgangskode"
|
||||
oldPassword = "Gammel adgangskode"
|
||||
@@ -602,13 +561,13 @@ totalEndpoints = "Endpoints i alt"
|
||||
totalVisits = "Besøg i alt"
|
||||
showing = "Viser"
|
||||
selectedVisits = "Valgte besøg"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Slutpunkt"
|
||||
visits = "Besøg"
|
||||
percentage = "Procent"
|
||||
loading = "Laster..."
|
||||
failedToLoad = "Kunne ikke indlæse endpoint-data. Prøv at opdatere."
|
||||
home = "Hjem"
|
||||
login = "Login"
|
||||
login = "Log ind"
|
||||
top = "Top"
|
||||
numberOfVisits = "Antal besøg"
|
||||
visitsTooltip = "Besøg: {0} ({1}% af totalen)"
|
||||
@@ -749,11 +708,6 @@ tags = "underskrift,autograf"
|
||||
title = "Underskriv"
|
||||
desc = "Tilføjer underskrift til PDF ved tegning, tekst eller billede"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annoter,fremhæv,tegn"
|
||||
title = "Annotér"
|
||||
desc = "Fremhæv, tegn, tilføj noter og figurer i fremviseren"
|
||||
|
||||
[home.flatten]
|
||||
tags = "forenkle,fjern,interaktiv"
|
||||
title = "Udjævn"
|
||||
@@ -965,7 +919,7 @@ title = "Overlejr PDF'er"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF-teksteditor"
|
||||
desc = "Gennemse og rediger Stirling PDF JSON-eksporter med grupperet tekstredigering og regenerering af PDF"
|
||||
desc = "Rediger eksisterende tekst og billeder i PDF'er"
|
||||
|
||||
[home.addText]
|
||||
tags = "tekst,annotering,etiket"
|
||||
@@ -976,7 +930,6 @@ desc = "Tilføj brugerdefineret tekst hvor som helst i din PDF"
|
||||
addFiles = "Tilføj filer"
|
||||
uploadFromComputer = "Upload fra computer"
|
||||
openFromComputer = "Åbn fra computer"
|
||||
mobileUpload = "Upload fra mobil"
|
||||
|
||||
[viewPdf]
|
||||
tags = "se,læs,annotér,tekst,billede"
|
||||
@@ -1228,7 +1181,7 @@ selectFilesPlaceholder = "Vælg filer i hovedvisningen for at komme i gang"
|
||||
settings = "Indstillinger"
|
||||
conversionCompleted = "Konvertering fuldført"
|
||||
results = "Resultater"
|
||||
defaultFilename = "converted_file"
|
||||
defaultFilename = "konverteret_fil"
|
||||
conversionResults = "Konverteringsresultater"
|
||||
convertFrom = "Konvertér fra"
|
||||
convertTo = "Konvertér til"
|
||||
@@ -1268,9 +1221,9 @@ pdfaDigitalSignatureWarning = "PDF'en indeholder en digital signatur. Dette vil
|
||||
fileFormat = "Filformat"
|
||||
wordDoc = "Word-dokument"
|
||||
wordDocExt = "Word-dokument (.docx)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
odtExt = "OpenDocument-tekst (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
odpExt = "OpenDocument-præsentation (.odp)"
|
||||
txtExt = "Almindelig tekst (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "Valgte filer"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ til PDF-indstillinger"
|
||||
optimizeForEbook = "Optimer PDF til e-bogslæsere (bruger Ghostscript)"
|
||||
cbzOutputOptions = "PDF til CBZ-indstillinger"
|
||||
cbzDpi = "DPI for billedgengivelse"
|
||||
cbrOptions = "CBR-indstillinger"
|
||||
cbrOutputOptions = "PDF til CBR-indstillinger"
|
||||
cbrDpi = "DPI for billedgengivelse"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "e-bog til PDF-indstillinger"
|
||||
ebookOptionsDesc = "Indstillinger for konvertering af e-bøger til PDF"
|
||||
embedAllFonts = "Indlejr alle skrifttyper"
|
||||
embedAllFontsDesc = "Indlejr alle skrifttyper fra e-bogen i den genererede PDF"
|
||||
includeTableOfContents = "Medtag indholdsfortegnelse"
|
||||
includeTableOfContentsDesc = "Tilføj en genereret indholdsfortegnelse til den resulterende PDF"
|
||||
includePageNumbers = "Medtag sidetal"
|
||||
includePageNumbersDesc = "Tilføj sidetal til den genererede PDF"
|
||||
optimizeForEbookPdf = "Optimer til e-boglæsere"
|
||||
optimizeForEbookPdfDesc = "Optimer PDF'en til e-bogslæsning (mindre filstørrelse, bedre gengivelse på e-Ink-enheder)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF til e-bog-indstillinger"
|
||||
epubOptionsDesc = "Indstillinger for konvertering af PDF til EPUB/AZW3"
|
||||
detectChapters = "Find kapitler"
|
||||
detectChaptersDesc = "Find overskrifter, der ligner kapitler, og indsæt EPUB-sideombrydninger"
|
||||
targetDevice = "Målenhed"
|
||||
targetDeviceDesc = "Vælg en outputprofil optimeret til læseenheden"
|
||||
outputFormat = "Outputformat"
|
||||
outputFormatDesc = "Vælg outputformat for e-bogen"
|
||||
tabletPhone = "Tablet/telefon (med billeder)"
|
||||
kindleEink = "Kindle e-Ink (tekstoptimeret)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konvertering,img,jpg,billede,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Tilføj vedhæftning"
|
||||
remove = "Fjern vedhæftning"
|
||||
embed = "Indlejr vedhæftning"
|
||||
convertToPdfA3b = "Konverter til PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Opretter en arkiv-PDF med indlejrede vedhæftninger"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b er et arkivformat, der sikrer langtidsbevarelse. Det tillader indlejring af vilkårlige filformater som vedhæftninger. Konvertering kræver Ghostscript og kan tage længere tid for store filer."
|
||||
convertToPdfA3bTooltipHeader = "Om konvertering til PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Hvad den gør"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Gemt"
|
||||
label = "Upload billede af underskrift"
|
||||
placeholder = "Vælg billedfil"
|
||||
hint = "Upload et PNG- eller JPG-billede af din underskrift"
|
||||
removeBackground = "Fjern hvid baggrund (gør gennemsigtig)"
|
||||
processing = "Behandler billede..."
|
||||
backgroundRemovalFailedTitle = "Fjernelse af baggrund mislykkedes"
|
||||
backgroundRemovalFailedMessage = "Kunne ikke fjerne baggrunden fra billedet. Bruger i stedet det originale billede."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Sådan tilføjer du underskrift"
|
||||
@@ -2434,11 +2351,6 @@ note = "Udfladning fjerner interaktive elementer fra PDF'en, så de ikke kan red
|
||||
label = "Udjævn kun formularer"
|
||||
desc = "Udflad kun formularfelter og lad andre interaktive elementer være intakte"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Renderings-DPI (valgfrit, anbefalet 150 DPI)"
|
||||
help = "Lad være tom for at bruge systemets standard. Højere DPI skærper output men øger behandlingstid og filstørrelse."
|
||||
placeholder = "f.eks. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultater for udfladning"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Beskær PDF"
|
||||
submit = "Indsend"
|
||||
noFileSelected = "Vælg en PDF for at begynde beskæring"
|
||||
reset = "Nulstil til fuld PDF"
|
||||
autoCrop = "Auto-beskær hvidt område"
|
||||
|
||||
[crop.preview]
|
||||
title = "Valg af beskæringsområde"
|
||||
@@ -3244,7 +3155,6 @@ title = "Maskeringsmetode"
|
||||
mode = "Tilstand"
|
||||
automatic = "Automatisk"
|
||||
automaticDesc = "Maskér tekst baseret på søgetermer"
|
||||
automaticDisabledTooltip = "Vælg filer i filhåndteringen for at maskere flere filer på én gang"
|
||||
manual = "Manuel"
|
||||
manualDesc = "Klik og træk for at maskere bestemte områder"
|
||||
manualComingSoon = "Manuel maskering kommer snart"
|
||||
@@ -3315,35 +3225,8 @@ text = "Match kun hele ord, ikke delvise match. 'John' matcher ikke 'Johnson', n
|
||||
title = "Konvertér til PDF-billede"
|
||||
text = "Konverterer PDF'en til en billedbaseret PDF efter maskering. Dette sikrer, at tekst bag maskeringsboksene fjernes fuldstændigt og ikke kan genskabes."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Manuelle maskeringskontroller"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Værktøj til markering af tekst"
|
||||
text = "Markér tekst direkte på PDF'en for at markere den til maskering. Klik og træk for at fremhæve specifik tekst, du vil maskere."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Værktøj til områdemarkering"
|
||||
text = "Tegn rektangulære områder på PDF'en for at markere områder til maskering. Nyttigt til at maskere billeder, underskrifter eller uregelmæssige former."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Anvend maskeringer"
|
||||
text = "Når indhold er markeret, klik 'Anvend' for permanent at maskere alle markerede områder. Tælleren viser, hvor mange maskeringer er klar til at blive anvendt."
|
||||
bullet1 = "Markér så mange områder som nødvendigt før anvendelse"
|
||||
bullet2 = "Alle afventende maskeringer anvendes på én gang"
|
||||
bullet3 = "Maskeringer kan ikke fortrydes efter anvendelse"
|
||||
|
||||
[redact.manual]
|
||||
title = "Maskeringsværktøjer"
|
||||
instructions = "Vælg tekst eller tegn områder på PDF'en for at markere indhold til maskering."
|
||||
markText = "Markér tekst"
|
||||
markArea = "Markér område"
|
||||
pendingLabel = "Afventer:"
|
||||
applyWarning = "⚠️ Permanent handling, kan ikke fortrydes, og dataene nedenunder bliver slettet"
|
||||
apply = "Anvend"
|
||||
noMarks = "Ingen maskeringsmarkeringer. Brug værktøjerne ovenfor til at markere indhold til maskering."
|
||||
header = "Manuel maskering"
|
||||
controlsTitle = "Manuelle maskeringskontroller"
|
||||
textBasedRedaction = "Tekstbaseret maskering"
|
||||
pageBasedRedaction = "Sidebaseret maskering"
|
||||
convertPDFToImageLabel = "Konvertér PDF til PDF-billede (bruges til at fjerne tekst bag boksen)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Indtast antal horisontale delinger"
|
||||
label = "Vertikal Deling"
|
||||
placeholder = "Indtast antal af vertikale delinger"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Opdelingsmetode"
|
||||
description = "Vælg hvordan siderne skal opdeles"
|
||||
splitAll = "Opdel alle sider"
|
||||
splitAllExceptFirst = "Opdel alle undtagen første"
|
||||
splitAllExceptLast = "Opdel alle undtagen sidste"
|
||||
splitAllExceptFirstAndLast = "Opdel alle undtagen første og sidste"
|
||||
custom = "Brugerdefinerede sider"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Brugerdefinerede sidetal"
|
||||
placeholder = "f.eks. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Stempel, Tilføj billede, centrer billede, Vandmærke, PDF, Indlejr, Tilpas"
|
||||
header = "Stempel PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Filstørrelse"
|
||||
[compress.grayscale]
|
||||
label = "Anvend gråskala til komprimering"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Lineariser PDF for hurtig webvisning"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Konvertér billeder til stregtegning"
|
||||
description = "Bruger ImageMagick til at reducere sider til højkontrast sort/hvid for maksimal størrelsesreduktion."
|
||||
unavailable = "ImageMagick er ikke installeret eller aktiveret på denne server"
|
||||
detailLevel = "Detaljeniveau"
|
||||
edgeEmphasis = "Kantfremhævning"
|
||||
edgeLow = "Let"
|
||||
edgeMedium = "Balanceret"
|
||||
edgeHigh = "Kraftig"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Overblik over komprimeringsindstillinger"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Højere værdier reducerer filstørrelsen"
|
||||
title = "Gråtoner"
|
||||
text = "Vælg denne indstilling for at konvertere alle billeder til sort/hvid, hvilket kan reducere filstørrelsen betydeligt, især for scannede PDF'er eller dokumenter med mange billeder."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Stregtegning"
|
||||
text = "Konvertér sider til højkontrast sort/hvid med ImageMagick. Brug detaljeniveau til at styre, hvor meget indhold bliver sort, og kantfremhævning til at styre, hvor aggressivt kanter detekteres."
|
||||
|
||||
[compress.error]
|
||||
failed = "Der opstod en fejl under komprimering af PDF'en."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Der opstod en fejl under komprimering af PDF'en."
|
||||
_value = "Komprimeringsindstillinger"
|
||||
1 = "1-3 PDF-komprimering,</br> 4-6 let billedkomprimering,</br> 7-9 intens billedkomprimering vil markant reducere billedkvaliteten"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Lavere værdier bevarer kvaliteten men giver større filer"
|
||||
range4to6 = "Mellem komprimering med moderat kvalitetsreduktion"
|
||||
range7to9 = "Højere værdier reducerer filstørrelsen markant, men kan reducere billedklarhed"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Denne fil er adgangskodebeskyttet. Indtast adgangskoden:"
|
||||
cancelled = "Handling annulleret for PDF: {0}"
|
||||
@@ -4027,7 +3875,7 @@ version = "Nuværende udgivelse"
|
||||
title = "API-dokumentation"
|
||||
header = "API-dokumentation"
|
||||
desc = "Se og test Stirling PDF API-endpoints"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,dokumentation,swagger,endepunkter,udvikling"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Sådan bruger vi cookies"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Slet valgte sider"
|
||||
closePdf = "Luk PDF"
|
||||
exportAll = "Eksporter PDF"
|
||||
downloadSelected = "Download valgte filer"
|
||||
annotations = "Anmærkninger"
|
||||
exportSelected = "Eksporter valgte sider"
|
||||
saveChanges = "Gem ændringer"
|
||||
downloadAll = "Download alle"
|
||||
saveAll = "Gem alle"
|
||||
toggleTheme = "Skift tema"
|
||||
toggleBookmarks = "Skift bogmærker"
|
||||
language = "Sprog"
|
||||
toggleAnnotations = "Skift visning af annoteringer"
|
||||
search = "Søg i PDF"
|
||||
panMode = "Pan-tilstand"
|
||||
applyRedactionsFirst = "Anvend maskeringer først"
|
||||
rotateLeft = "Rotér venstre"
|
||||
rotateRight = "Rotér højre"
|
||||
toggleSidebar = "Skift sidepanel"
|
||||
toggleBookmarks = "Skift bogmærker"
|
||||
exportSelected = "Eksporter valgte sider"
|
||||
toggleAnnotations = "Skift visning af annoteringer"
|
||||
annotationMode = "Skift annoteringstilstand"
|
||||
print = "Udskriv PDF"
|
||||
draw = "Tegn"
|
||||
redact = "Maskér"
|
||||
exitRedaction = "Afslut maskeringstilstand"
|
||||
save = "Gem"
|
||||
downloadAll = "Download alle"
|
||||
saveAll = "Gem alle"
|
||||
|
||||
[textAlign]
|
||||
left = "Venstre"
|
||||
center = "Centreret"
|
||||
right = "Højre"
|
||||
|
||||
[annotation]
|
||||
title = "Annotér"
|
||||
desc = "Brug fremhævning, pen, tekst og noter. Ændringer er aktive—ingen udfladning påkrævet."
|
||||
highlight = "Fremhæv"
|
||||
pen = "Pen"
|
||||
text = "Tekstboks"
|
||||
note = "Note"
|
||||
rectangle = "Rektangel"
|
||||
ellipse = "Ellipse"
|
||||
select = "Vælg"
|
||||
exit = "Afslut anmærkningstilstand"
|
||||
strokeWidth = "Bredde"
|
||||
opacity = "Gennemsigtighed"
|
||||
strokeOpacity = "Konturgennemsigtighed"
|
||||
fillOpacity = "Fyldgennemsigtighed"
|
||||
fontSize = "Skriftstørrelse"
|
||||
chooseColor = "Vælg farve"
|
||||
color = "Farve"
|
||||
strokeColor = "Konturfarve"
|
||||
fillColor = "Fyldfarve"
|
||||
underline = "Understreg"
|
||||
strikeout = "Gennemstregning"
|
||||
squiggly = "Bølget understregning"
|
||||
inkHighlighter = "Frihåndsmarkering"
|
||||
freehandHighlighter = "Frihåndsmarkering"
|
||||
square = "Firkant"
|
||||
circle = "Cirkel"
|
||||
polygon = "Polygon"
|
||||
line = "Linje"
|
||||
stamp = "Tilføj billede"
|
||||
textMarkup = "Tekstmarkering"
|
||||
drawing = "Tegning"
|
||||
shapes = "Figurer"
|
||||
notesStamps = "Noter og stempler"
|
||||
settings = "Indstillinger"
|
||||
borderOn = "Kant: Til"
|
||||
borderOff = "Kant: Fra"
|
||||
editInk = "Redigér pen"
|
||||
editLine = "Redigér linje"
|
||||
editNote = "Redigér note"
|
||||
editText = "Redigér tekstboks"
|
||||
editTextMarkup = "Redigér tekstmarkering"
|
||||
editSelected = "Redigér anmærkning"
|
||||
editSquare = "Redigér firkant"
|
||||
editCircle = "Redigér cirkel"
|
||||
editPolygon = "Redigér polygon"
|
||||
unsupportedType = "Denne anmærkningstype understøttes ikke fuldt ud til redigering."
|
||||
textAlignment = "Tekstjustering"
|
||||
noteIcon = "Noteikon"
|
||||
imagePreview = "Forhåndsvisning"
|
||||
contents = "Tekst"
|
||||
backgroundColor = "Baggrundsfarve"
|
||||
clearBackground = "Fjern baggrund"
|
||||
noBackground = "Ingen baggrund"
|
||||
stampSettings = "Stempelindstillinger"
|
||||
savingCopy = "Forbereder download..."
|
||||
saveFailed = "Kan ikke gemme kopi"
|
||||
saveReady = "Download klar"
|
||||
selectAndMove = "Vælg og redigér"
|
||||
editSelectDescription = "Klik på en eksisterende anmærkning for at redigere dens farve, gennemsigtighed, tekst eller størrelse."
|
||||
editStampHint = "For at ændre billedet skal du slette dette stempel og tilføje et nyt."
|
||||
editSwitchToSelect = "Skift til Vælg og redigér for at redigere denne anmærkning."
|
||||
undo = "Fortryd"
|
||||
redo = "Omgør"
|
||||
applyChanges = "Anvend ændringer"
|
||||
saveChanges = "Gem ændringer"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Indstil."
|
||||
adminSettings = "Admin Indstil."
|
||||
allTools = "All Tools"
|
||||
reader = "Læser"
|
||||
tours = "Rundvisninger"
|
||||
showMeAround = "Vis mig rundt"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Se gennemgange her: Værktøjsrundvisning, rundvisning i det nye V2-layout og Admin-rundvisningen."
|
||||
user = "Se gennemgange her: Værktøjsrundvisning og rundvisning i det nye V2-layout."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Rundtur i værktøjer"
|
||||
toolsTourDesc = "Lær hvad værktøjerne kan"
|
||||
adminTour = "Admin-rundtur"
|
||||
adminTourDesc = "Udforsk adminindstillinger og funktioner"
|
||||
whatsNewTour = "Se det nye i V2"
|
||||
whatsNewTourDesc = "Rundvisning i det opdaterede layout"
|
||||
|
||||
[admin]
|
||||
error = "Fejl"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Kunne ikke indlæse indstillinger"
|
||||
saveError = "Kunne ikke gemme indstillinger"
|
||||
saved = "Indstillinger gemt"
|
||||
saveSuccess = "Indstillinger gemt"
|
||||
success = "Indstillinger gemt"
|
||||
error = "Kunne ikke gemme indstillinger"
|
||||
save = "Gem ændringer"
|
||||
discard = "Kassér"
|
||||
restartRequired = "Genstart påkrævet"
|
||||
@@ -4422,13 +4185,6 @@ description = "Sti til WeasyPrint-eksekverbar for HTML til PDF-konvertering (lad
|
||||
label = "Unoconvert-eksekverbar"
|
||||
description = "Sti til LibreOffice unoconvert til dokumentkonverteringer (lad tom for standard: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend-URL"
|
||||
description = "Basis-URL for frontend (f.eks. https://pdf.example.com). Bruges til e-mail-invitationslinks og mobil-upload via QR-kode. Lad være tom for at bruge backend-URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Klik for at se plandetaljer"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sikkerhed"
|
||||
description = "Konfigurer godkendelse, loginadfærd og sikkerhedspolitikker."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Forbind"
|
||||
disconnect = "Afbryd"
|
||||
disconnected = "Udbyder afbrudt"
|
||||
disconnectError = "Kunne ikke afbryde udbyder"
|
||||
mobileScannerConvertToPdf = "Konvertér billeder til PDF"
|
||||
mobileScannerConvertToPdfDesc = "Konvertér automatisk uploadede billeder til PDF-format. Hvis deaktiveret, bevares billederne som de er."
|
||||
mobileScannerImageResolution = "Billedopløsning"
|
||||
mobileScannerImageResolutionDesc = "Opløsning af uploadede billeder. \"Reduceret\" skalerer billeder til maks. 1200 px for at reducere filstørrelse."
|
||||
imageResolutionFull = "Fuld (original størrelse)"
|
||||
imageResolutionReduced = "Reduceret (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Sideformat"
|
||||
mobileScannerPageFormatDesc = "PDF-sidestørrelse for konverterede billeder. \"Behold\" bruger billedets originale dimensioner."
|
||||
pageFormatKeep = "Behold (originale dimensioner)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8.5×11 in)"
|
||||
mobileScannerStretchToFit = "Stræk for at udfylde"
|
||||
mobileScannerStretchToFitDesc = "Stræk billeder, så de fylder hele siden. Hvis deaktiveret, centreres billeder med bevaret aspektforhold."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO automatisk login"
|
||||
@@ -4600,11 +4343,11 @@ label = "Issuer-URL"
|
||||
description = "OAuth2-udbyderens issuer-URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "Klient-ID"
|
||||
description = "OAuth2 Client ID fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "Klienthemmelighed"
|
||||
description = "OAuth2 Client Secret fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4646,122 +4389,6 @@ description = "Opret automatisk brugerkonti ved første SAML2-login"
|
||||
label = "Blokér registrering"
|
||||
description = "Forhindre ny brugerregistrering via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Upload fra mobiltelefon"
|
||||
enable = "Aktivér upload via QR-kode"
|
||||
description = "Tillad brugere at uploade filer fra mobile enheder ved at scanne en QR-kode"
|
||||
note = "Bemærk: Kræver at Frontend URL er konfigureret. "
|
||||
link = "Konfigurer i systemindstillinger"
|
||||
mobileScannerConvertToPdf = "Konvertér billeder til PDF"
|
||||
mobileScannerConvertToPdfDesc = "Konvertér automatisk uploadede billeder til PDF-format. Hvis deaktiveret, bevares billederne som de er."
|
||||
mobileScannerImageResolution = "Billedopløsning"
|
||||
mobileScannerImageResolutionDesc = "Opløsning af uploadede billeder. \"Reduceret\" skalerer billeder til maks. 1200 px for at reducere filstørrelse."
|
||||
imageResolutionFull = "Fuld (original størrelse)"
|
||||
imageResolutionReduced = "Reduceret (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Sideformat"
|
||||
mobileScannerPageFormatDesc = "PDF-sidestørrelse for konverterede billeder. \"Behold\" bruger billedets originale dimensioner."
|
||||
pageFormatKeep = "Behold (originale dimensioner)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8.5×11 in)"
|
||||
mobileScannerStretchToFit = "Stræk for at udfylde"
|
||||
mobileScannerStretchToFitDesc = "Stræk billeder, så de fylder hele siden. Hvis deaktiveret, centreres billeder med bevaret aspektforhold."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram-bot"
|
||||
description = "Konfigurer Telegram-botforbindelse, adgangskontrol og feedbackadfærd."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Aktivér Telegram-bot"
|
||||
description = "Tillad brugere at interagere med Stirling PDF via din konfigurerede Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot-brugernavn"
|
||||
description = "Det offentlige brugernavn for din Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot-token"
|
||||
description = "API-token leveret af BotFather til din Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Indbakke-mappe"
|
||||
description = "Mappe under pipeline-mappen, hvor indgående Telegram-filer gemmes."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Brug brugerdefineret mappesuffiks"
|
||||
description = "Tilføj chat ID til indgående filmapper for at isolere uploads pr. chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Adgangskontrol"
|
||||
description = "Begræns hvilke brugere eller kanaler der kan interagere med botten."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Tillad specifikke bruger-ID'er"
|
||||
description = "Når aktiveret, kan kun de angivne bruger-ID'er bruge botten."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Tilladte bruger-ID'er"
|
||||
description = "Angiv Telegram-bruger-ID'er, der må interagere med botten."
|
||||
placeholder = "Tilføj bruger-ID og tryk Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Tillad specifikke kanal-ID'er"
|
||||
description = "Når aktiveret, kan kun de angivne kanal-ID'er bruge botten."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Tilladte kanal-ID'er"
|
||||
description = "Angiv Telegram-kanal-ID'er, der må interagere med botten."
|
||||
placeholder = "Tilføj kanal-ID og tryk Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Behandling"
|
||||
description = "Styr pollingintervaller og behandlingstimeouts for Telegram-uploads."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Behandlingstimeout (sekunder)"
|
||||
description = "Maksimal ventetid på en behandlingsopgave før fejl meldes."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Polling-interval (ms)"
|
||||
description = "Interval mellem tjek for nye Telegram-opdateringer."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Feedbackbeskeder"
|
||||
description = "Vælg hvornår botten skal sende feedback til brugere og kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Aktivér feedback"
|
||||
description = "Styr om botten overhovedet sender feedbackbeskeder."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regler for kanal-feedback"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Vis \"Intet gyldigt dokument\" (kanal)"
|
||||
description = "Undertryk svaret 'Intet gyldigt dokument' for kanaluploads."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Vis behandlingsfejl (kanal)"
|
||||
description = "Send beskeder om behandlingsfejl til kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Vis fejlmeddelelser (kanal)"
|
||||
description = "Vis detaljerede fejlmeddelelser for kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regler for bruger-feedback"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Vis \"Intet gyldigt dokument\" (bruger)"
|
||||
description = "Undertryk svaret 'Intet gyldigt dokument' for brugeruploads."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Vis behandlingsfejl (bruger)"
|
||||
description = "Send beskeder om behandlingsfejl til brugere."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Vis fejlmeddelelser (bruger)"
|
||||
description = "Vis detaljerede fejlmeddelelser for brugere."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
description = "Konfigurer brugerdefinerede databaseforbindelser til virksomhedsinstallationer."
|
||||
@@ -4824,7 +4451,7 @@ features = "Funktionsflag"
|
||||
processing = "Behandling"
|
||||
|
||||
[admin.settings.advanced.endpoints]
|
||||
label = "Endpoints"
|
||||
label = "Slutpunkter"
|
||||
manage = "Administrer API-endpoints"
|
||||
description = "Endpointstyring konfigureres via YAML. Se dokumentationen for detaljer om aktivering/deaktivering af specifikke endpoints."
|
||||
|
||||
@@ -4943,10 +4570,6 @@ description = "Tillad administratorer at invitere brugere via e-mail med automat
|
||||
label = "Frontend-URL"
|
||||
description = "Basis-URL for frontend (fx https://pdf.example.com). Bruges til at generere invitationslinks i e-mails. Lad være tom for at bruge backend-URL."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Bemærk: Kræver at Frontend URL er konfigureret. "
|
||||
link = "Konfigurer i systemindstillinger"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Juridiske dokumenter"
|
||||
description = "Konfigurer links til juridiske dokumenter og politikker."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Mine filer"
|
||||
noRecentFiles = "Ingen seneste filer fundet"
|
||||
googleDriveNotAvailable = "Google Drive-integration ikke tilgængelig"
|
||||
mobileUpload = "Upload fra mobil"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "Upload fra mobil er ikke aktiveret"
|
||||
downloadSelected = "Download valgte"
|
||||
saveSelected = "Gem valgte"
|
||||
openFiles = "Åbn filer"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Indlæser..."
|
||||
back = "Tilbage"
|
||||
continue = "Fortsæt"
|
||||
error = "Fejl"
|
||||
save = "Gem"
|
||||
|
||||
[config.overview]
|
||||
title = "Applikationskonfiguration"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Eventuelle applikationer eller tjenester, der i øjeblikket bruger dis
|
||||
confirmPrompt = "Er du sikker på, at du vil fortsætte?"
|
||||
confirmCta = "Opdatér nøgler"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API-nøglefejl"
|
||||
failedToCreateApiKey = "Kunne ikke oprette API-nøgle."
|
||||
failedToRetrieveApiKey = "Kunne ikke hente API-nøgle fra svaret."
|
||||
failedToFetchApiKey = "Kunne ikke hente API-nøgle."
|
||||
apiKeyRefreshed = "API-nøgle opdateret"
|
||||
apiKeyRefreshedBody = "Din API-nøgle er blevet opdateret."
|
||||
failedToRefreshApiKey = "Kunne ikke opdatere API-nøgle."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Vælg vedhæftede filer"
|
||||
info = "Vælg filer, der skal vedhæftes din PDF. Disse filer bliver indlejret og tilgængelige via PDF'ens panel for vedhæftede filer."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Færdig"
|
||||
startTour = "Start rundtur"
|
||||
startTourDescription = "Tag en guidet tur gennem Stirling PDFs nøglefunktioner"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Start i <strong>Hurtig adgang</strong>-panelet for at hoppe mellem Reader, Automate, dine filer og alle rundvisningerne."
|
||||
leftPanel = "Det venstre <strong>Værktøjer</strong>-panel viser alt, du kan gøre. Gennemse kategorier eller søg for hurtigt at finde et værktøj."
|
||||
fileUpload = "Brug <strong>Filer</strong>-knappen til at uploade eller vælge en nylig PDF. Vi indlæser et eksempel, så du kan se arbejdsområdet."
|
||||
rightRail = "Det <strong>højre sidepanel</strong> rummer hurtige handlinger til at vælge filer, ændre tema eller sprog og downloade resultater."
|
||||
topBar = "Topbjælken lader dig skifte mellem <strong>Fremviser</strong>, <strong>Sideeditor</strong> og <strong>Aktive filer</strong>."
|
||||
pageEditorView = "Skift til Sideeditor for at omarrangere, rotere eller slette sider."
|
||||
activeFilesView = "Brug Aktive filer til at se alt, du har åbent, og vælge, hvad du vil arbejde på."
|
||||
wrapUp = "Det var det nye i V2. Åbn menuen <strong>Rundvisninger</strong> når som helst for at afspille dette, værktøjsrundvisningen eller admin-rundvisningen."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Velkommen til Stirling PDF!"
|
||||
description = "Vil du tage en hurtig rundtur på 1 minut for at lære nøglefunktionerne og hvordan du kommer i gang?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Download →"
|
||||
showMeAround = "Vis mig rundt"
|
||||
skipTheTour = "Spring rundvisningen over"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Oversigt over rundvisning"
|
||||
body = "Stirling PDF V2 kommer med dusinvis af værktøjer og et fornyet layout. Tag en hurtig rundvisning for at se, hvad der er ændret, og hvor du finder de funktioner, du har brug for."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Spring over for nu"
|
||||
seePlans = "Se planer →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Opgrader nu →"
|
||||
freeTitle = "Serverlicens"
|
||||
overLimitTitle = "Serverlicens påkrævet"
|
||||
overLimitBody = "Vores licens tillader op til <strong>{{freeTierLimit}}</strong> brugere gratis pr. server. Du har <strong>{{overLimitUserCopy}}</strong> Stirling-brugere. For at fortsætte uden afbrydelser skal du opgradere til Stirling Server-abonnementet – <strong>ubegrænsede pladser</strong>, PDF-tekstredigering og fuld admin-kontrol for $99/server/md."
|
||||
freeBody = "Vores <strong>Open-Core</strong>-licens tillader op til <strong>{{freeTierLimit}}</strong> brugere gratis pr. server. For at skalere uden afbrydelser og få tidlig adgang til vores nye <strong>PDF-tekstredigeringsværktøj</strong> anbefaler vi Stirling Server-planen – fuld redigering og <strong>ubegrænsede pladser</strong> for $99/server/md."
|
||||
freeBody = "Vores <strong>Open-Core</strong>-licens tillader op til <strong>{{freeTierLimit}}</strong> brugere gratis pr. server. For at skalere uden afbrydelser anbefaler vi Stirling Server-planen – <strong>ubegrænsede pladser</strong> og <strong>SSO-understøttelse</strong> for $99/server/md."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5847,8 +5443,8 @@ emailDisabled = "E-mailinvitationer kræver SMTP-konfiguration og mail.enableInv
|
||||
[workspace.people.license]
|
||||
users = "brugere"
|
||||
availableSlots = "Tilgængelige pladser"
|
||||
grandfathered = "Grandfathered"
|
||||
grandfatheredShort = "{{count}} grandfathered"
|
||||
grandfathered = "På gamle vilkår"
|
||||
grandfatheredShort = "{{count}} på gamle vilkår"
|
||||
fromLicense = "fra licens"
|
||||
slotsAvailable = "{{count}} ledig(e) brugerplads(er)"
|
||||
noSlotsAvailable = "Ingen pladser tilgængelige"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Kontakt salg"
|
||||
contactToUpgrade = "Kontakt os for at opgradere eller tilpasse din plan"
|
||||
maxUsers = "Maks. brugere"
|
||||
upTo = "Op til"
|
||||
getLicense = "Få serverlicens"
|
||||
upgradeToEnterprise = "Opgrader til Enterprise"
|
||||
selectPeriod = "Vælg faktureringsperiode"
|
||||
monthlyBilling = "Månedlig fakturering"
|
||||
yearlyBilling = "Årlig fakturering"
|
||||
checkoutOpened = "Checkout åbnet"
|
||||
checkoutInstructions = "Gennemfør dit køb i Stripe-fanen. Efter betaling skal du vende tilbage hertil og opdatere siden for at aktivere din licens. Du modtager også en e-mail med din licensnøgle."
|
||||
activateLicense = "Aktivér din licens"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout åbnet i ny fane"
|
||||
instructions = "Gennemfør dit køb i Stripe-fanen. Når din betaling er gennemført, modtager du en e-mail med din licensnøgle."
|
||||
enterKey = "Indtast din licensnøgle nedenfor for at aktivere din plan:"
|
||||
keyDescription = "Indsæt licensnøglen fra din e-mail"
|
||||
activate = "Aktivér licens"
|
||||
doLater = "Jeg gør det senere"
|
||||
success = "Licens aktiveret!"
|
||||
successMessage = "Din licens er aktiveret. Du kan nu lukke dette vindue."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "E-mailbekræftelse påkrævet"
|
||||
message = "Du skal bekræfte din e-mailadresse i Stripes faktureringsportal. Tjek din e-mail for et loginlink."
|
||||
|
||||
[plan.period]
|
||||
month = "måned"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Auditsystem ikke tilgængeligt"
|
||||
notAvailableMessage = "Auditsystemet er ikke konfigureret eller ikke tilgængeligt."
|
||||
disabled = "Auditlogning er deaktiveret"
|
||||
disabledMessage = "Aktivér auditlogning i din applikationskonfiguration for at spore systemhændelser."
|
||||
enterpriseRequired = "Enterprise-licens påkrævet"
|
||||
enterpriseRequiredMessage = "Revisionslogsystemet er en Enterprise-funktion. Opgrader venligst til en Enterprise-licens for at få adgang til revisionslogs og analyser."
|
||||
|
||||
[audit.error]
|
||||
title = "Fejl ved indlæsning af auditsystem"
|
||||
@@ -6292,7 +5864,7 @@ title = "Diagram over endpoint-brug"
|
||||
|
||||
[usage.table]
|
||||
title = "Detaljeret statistik"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Slutpunkt"
|
||||
visits = "Besøg"
|
||||
percentage = "Procent"
|
||||
noData = "Ingen data tilgængelige"
|
||||
@@ -6335,7 +5907,7 @@ label = "Vælg server"
|
||||
description = "Selvhostet server"
|
||||
|
||||
[setup.step3]
|
||||
label = "Login"
|
||||
label = "Log ind"
|
||||
description = "Indtast loginoplysninger"
|
||||
|
||||
[setup.mode.saas]
|
||||
@@ -6370,7 +5942,6 @@ description = "Indtast den fulde URL til din selvhostede Stirling PDF-server"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Indtast en server-URL"
|
||||
invalidUrl = "Ugyldigt URL-format. Angiv en gyldig URL som https://your-server.com"
|
||||
unreachable = "Kunne ikke forbinde til server"
|
||||
testFailed = "Forbindelsestest mislykkedes"
|
||||
configFetch = "Kunne ikke hente serverkonfiguration. Kontrollér URL'en, og prøv igen."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Forbinder til:"
|
||||
submit = "Log ind"
|
||||
signInWith = "Log ind med"
|
||||
oauthPending = "Åbner browser for godkendelse..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Eller fortsæt med email"
|
||||
serverRequirement = "Bemærk: Serveren skal have login aktiveret."
|
||||
showInstructions = "Hvordan aktiveres det?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Nulstil ændringer"
|
||||
downloadJson = "Download JSON"
|
||||
generatePdf = "Generer PDF"
|
||||
saveChanges = "Gem ændringer"
|
||||
applyChanges = "Anvend ændringer"
|
||||
downloadCopy = "Download kopi"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoskalér tekst, så den passer i bokse"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tip: Hold Ctrl (Cmd) eller Shift for at multivælge tekstbo
|
||||
title = "Lås redigeret tekst til ét enkelt PDF-element"
|
||||
description = "Når aktiveret, eksporterer editoren hver redigeret tekstboks som ét PDF-textelement for at undgå overlap af glyffer eller blandede skrifttyper."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Avancerede indstillinger"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Begrænsninger i forhåndsvisning"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus på tekst og billeder"
|
||||
text = "Dette arbejdsområde fokuserer på redigering af tekst og omplacering af indlejrede billeder. Komplekst sidegrafik, formular-widgets og lagdelte grafikker bevares til eksport, men kan ikke redigeres fuldt ud her."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Afvigelser i forhåndsvisning"
|
||||
text = "Nogle visuelle elementer (såsom tabelkanter, former eller anmærkningsudseender) vises muligvis ikke præcist i forhåndsvisningen. Den eksporterede PDF beholder de originale tegnekommandoer, når det er muligt."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alfa-fremviser"
|
||||
text = "Denne alfa-fremviser er stadig under udvikling—visse skrifttyper, farver, gennemsigtighedseffekter og layoutdetaljer kan ændre sig en smule. Kontrollér den genererede PDF før deling."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Flet valgte bokse"
|
||||
merge = "Flet markering"
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultater af tilføjelse af tekst"
|
||||
|
||||
[addText.error]
|
||||
failed = "Der opstod en fejl under tilføjelse af tekst til PDF'en."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Upload fra mobil"
|
||||
description = "Scan for at uploade fotos. Billeder konverteres automatisk til PDF."
|
||||
descriptionNoConvert = "Scan for at uploade fotos fra din mobilenhed."
|
||||
error = "Forbindelsesfejl"
|
||||
pollingError = "Fejl ved tjek for filer"
|
||||
sessionId = "Sessions-ID"
|
||||
sessionCreateError = "Kunne ikke oprette session"
|
||||
expiryWarning = "Session udløber snart"
|
||||
expiryWarningMessage = "Denne QR-kode udløber om {{seconds}} sekunder. En ny kode genereres automatisk."
|
||||
filesReceived = "{{count}} fil(er) modtaget"
|
||||
connected = "Mobilenhed tilsluttet"
|
||||
instructions = "Scan med din telefons kamera. Billeder konverteres automatisk til PDF."
|
||||
instructionsNoConvert = "Scan med din telefons kamera for at uploade filer."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobilscanner"
|
||||
noSession = "Ugyldig session"
|
||||
noSessionMessage = "Scan en gyldig QR-kode for at få adgang til denne side."
|
||||
validating = "Validerer session..."
|
||||
sessionInvalid = "Sessionsfejl"
|
||||
sessionExpired = "Denne session er udløbet. Opdater og prøv igen."
|
||||
sessionNotFound = "Session ikke fundet. Opdater og prøv igen."
|
||||
sessionValidationError = "Kan ikke verificere session. Prøv igen."
|
||||
uploadSuccess = "Upload gennemført!"
|
||||
uploadSuccessMessage = "Dine billeder er overført."
|
||||
httpsRequired = "Kameradgang kræver HTTPS eller localhost. Brug venligst HTTPS eller få adgang via localhost."
|
||||
uploadFailed = "Upload mislykkedes. Prøv igen."
|
||||
uploading = "Uploader..."
|
||||
connected = "Tilsluttet"
|
||||
connecting = "Tilslutter..."
|
||||
chooseMethod = "Vælg uploadmetode"
|
||||
chooseMethodDescription = "Vælg hvordan du vil scanne og uploade dokumenter"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Scan dokumenter med din enheds kamera med automatisk kantdetektion"
|
||||
fileUpload = "Filupload"
|
||||
fileDescription = "Upload eksisterende fotos eller dokumenter fra din enhed"
|
||||
cameraAccessDenied = "Kameradgang nægtet. Aktivér venligst kameradgang."
|
||||
back = "Tilbage"
|
||||
settings = "Indstillinger"
|
||||
edgeDetection = "Kantdetektion"
|
||||
flashlight = "Lommelygte"
|
||||
flash = "Blitz"
|
||||
processing = "Behandler..."
|
||||
capture = "Tag foto"
|
||||
selectFilesPrompt = "Vælg filer til upload"
|
||||
selectImage = "Vælg billede"
|
||||
preview = "Forhåndsvisning"
|
||||
retake = "Tag igen"
|
||||
addToBatch = "Tilføj til batch"
|
||||
upload = "Upload"
|
||||
batchImages = "Batch"
|
||||
clearBatch = "Ryd"
|
||||
uploadAll = "Upload alle"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Sie haben ungespeicherte Änderungen an Ihrer PDF. Was möchten Sie tun?"
|
||||
pendingRedactionsTitle = "Unapplied Redactions"
|
||||
pendingRedactions = "You have unapplied redactions that will be lost."
|
||||
areYouSure = "Möchten Sie die Seite wirklich verlassen?"
|
||||
areYouSure = "Möchten Sie wirklich verlassen?"
|
||||
unsavedChangesTitle = "Ungespeicherte Änderungen"
|
||||
keepWorking = "Weiterarbeiten"
|
||||
discardChanges = "Änderungen verwerfen"
|
||||
discardRedactions = "Discard & Leave"
|
||||
applyAndContinue = "Anwenden & Fortfahren"
|
||||
exportAndContinue = "Exportieren & Fortfahren"
|
||||
cancel = "Abbrechen"
|
||||
@@ -21,8 +18,8 @@ multiPdfDropPrompt = "Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie si
|
||||
imgPrompt = "Wählen Sie ein Bild"
|
||||
genericSubmit = "Absenden"
|
||||
uploadLimit = "Maximale Dateigröße:"
|
||||
uploadLimitExceededSingular = "ist zu groß. Die maximal zulässige Größe beträgt"
|
||||
uploadLimitExceededPlural = "sind zu groß. Die maximal zulässige Größe beträgt"
|
||||
uploadLimitExceededSingular = "ist zu groß. Die maximal zulässige Größe ist"
|
||||
uploadLimitExceededPlural = "sind zu groß. Die maximal zulässige Größe ist"
|
||||
processTimeWarning = "Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern"
|
||||
pageOrderPrompt = "Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):"
|
||||
goToPage = "Gehe zu"
|
||||
@@ -32,16 +29,16 @@ unknown = "Unbekannt"
|
||||
save = "Speichern"
|
||||
saveToBrowser = "Im Browser speichern"
|
||||
download = "Herunterladen"
|
||||
downloadUnavailable = "Download für dieses Element ist nicht verfügbar"
|
||||
saveUnavailable = "Speichern für dieses Element ist nicht verfügbar"
|
||||
downloadUnavailable = "Download für dieses Element nicht verfügbar"
|
||||
saveUnavailable = "Speichern für dieses Element nicht verfügbar"
|
||||
pin = "Datei anheften (nach Tool-Ausführung aktiv halten)"
|
||||
unpin = "Datei lösen (nach Tool-Ausführung ersetzen)"
|
||||
undoOperationTooltip = "Klicken Sie, um die letzte Operation rückgängig zu machen und die ursprünglichen Dateien wiederherzustellen"
|
||||
undoOperationTooltip = "Klicken zum Rückgängigmachen der letzten Operation und Wiederherstellen der ursprünglichen Dateien"
|
||||
undo = "Rückgängig"
|
||||
back = "Zurück"
|
||||
nothingToUndo = "Nichts zum Rückgängig machen"
|
||||
moreOptions = "Weitere Optionen"
|
||||
editYourNewFiles = "Ihre neuen Dateien bearbeiten"
|
||||
editYourNewFiles = "Ihre neue(n) Datei(en) bearbeiten"
|
||||
close = "Schließen"
|
||||
openInViewer = "Im Viewer öffnen"
|
||||
confirmClose = "Schließen bestätigen"
|
||||
@@ -72,9 +69,9 @@ white = "Weiß"
|
||||
red = "Rot"
|
||||
green = "Grün"
|
||||
blue = "Blau"
|
||||
custom = "Benutzerdefiniert..."
|
||||
custom = "benutzerdefiniert..."
|
||||
comingSoon = "Demnächst verfügbar"
|
||||
WorkInProgess = "In Arbeit: funktioniert möglicherweise nicht oder ist fehlerhaft. Bitte melden Sie alle Probleme."
|
||||
WorkInProgess = "In Arbeit, funktioniert möglicherweise nicht oder ist fehlerhaft. Bitte melden Sie alle Probleme!"
|
||||
poweredBy = "Bereitgestellt von"
|
||||
yes = "Ja"
|
||||
no = "Nein"
|
||||
@@ -261,7 +258,7 @@ _value = "Fehler"
|
||||
dismissAllErrors = "Alle Fehler ausblenden"
|
||||
sorry = "Entschuldigung für das Problem!"
|
||||
needHelp = "Brauchen Sie Hilfe / Ein Problem gefunden?"
|
||||
contactTip = "Wenn Sie weiterhin Probleme haben, zögern Sie nicht, uns um Hilfe zu bitten. Sie können ein Ticket auf unserer GitHub-Seite einreichen oder uns über Discord kontaktieren:"
|
||||
contactTip = "Wenn Sie weiterhin Probleme haben, zögern Sie nicht, uns um Hilfe zu bitten. Du kannst ein Ticket auf unserer GitHub-Seite einreichen oder uns über Discord kontaktieren:"
|
||||
github = "Ein Ticket auf GitHub einreichen"
|
||||
showStack = "Stack-Trace anzeigen"
|
||||
copyStack = "Stack-Trace kopieren"
|
||||
@@ -283,7 +280,7 @@ terms = "AGB"
|
||||
accessibility = "Barrierefreiheit"
|
||||
cookie = "Cookie-Richtlinie"
|
||||
impressum = "Impressum"
|
||||
showCookieBanner = "Cookie-Einstellungen"
|
||||
showCookieBanner = "Cookie Einstellungen"
|
||||
|
||||
[pipeline]
|
||||
header = "Pipeline-Menü (Beta)"
|
||||
@@ -294,7 +291,7 @@ submitButton = "Ausführen"
|
||||
help = "Hilfe für Pipeline"
|
||||
scanHelp = "Hilfe zum Ordnerscan"
|
||||
deletePrompt = "Möchten Sie die Pipeline wirklich löschen?"
|
||||
tags = "automatisieren,sequenzieren,skriptgesteuert,batch-prozess"
|
||||
tags = "automatisieren,sequenzieren,skriptgesteuert,batch prozess"
|
||||
title = "Pipeline"
|
||||
|
||||
[pipelineOptions]
|
||||
@@ -343,10 +340,6 @@ advance = "Erweiterte Funktionen"
|
||||
edit = "Anzeigen und Bearbeiten"
|
||||
popular = "Beliebt"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Einstellungen"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Erweitert"
|
||||
title = "Sicherheit & Authentifizierung"
|
||||
security = "Sicherheit"
|
||||
connections = "Verbindungen"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Lizenzierung & Analytics"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Aktuelle Version"
|
||||
latestVersion = "Neueste Version"
|
||||
checkForUpdates = "Nach Updates suchen"
|
||||
viewDetails = "Details anzeigen"
|
||||
serverNeedsUpdate = "Server needs to be updated by administrator"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Version Information"
|
||||
description = "Desktop and server version details"
|
||||
desktop = "Desktop Version"
|
||||
server = "Server Version"
|
||||
|
||||
[settings.security]
|
||||
title = "Sicherheit"
|
||||
description = "Aktualisieren Sie Ihr Passwort, um Ihr Konto zu schützen."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Ändern Sie Ihr Passwort. Nach dem Update werden Sie abgemeldet."
|
||||
required = "Alle Felder sind erforderlich."
|
||||
mismatch = "Die neuen Passwörter stimmen nicht überein."
|
||||
error = "Passwort konnte nicht aktualisiert werden. Bitte überprüfen Sie Ihr aktuelles Passwort und versuchen Sie es erneut."
|
||||
success = "Passwort erfolgreich aktualisiert. Bitte melden Sie sich erneut an."
|
||||
ssoDisabled = "Passwortänderungen werden von Ihrem Identity-Provider verwaltet."
|
||||
current = "Aktuelles Passwort"
|
||||
currentPlaceholder = "Geben Sie Ihr aktuelles Passwort ein"
|
||||
new = "Neues Passwort"
|
||||
newPlaceholder = "Neues Passwort eingeben"
|
||||
confirm = "Neues Passwort bestätigen"
|
||||
confirmPlaceholder = "Neues Passwort erneut eingeben"
|
||||
update = "Passwort aktualisieren"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Tastenkürzel"
|
||||
@@ -522,25 +488,18 @@ low = "Niedrig"
|
||||
title = "Anmeldeinformationen ändern"
|
||||
header = "Aktualisieren Sie Ihre Kontodaten"
|
||||
changePassword = "Sie verwenden die Standard-Zugangsdaten. Bitte geben Sie ein neues Passwort ein."
|
||||
ssoManaged = "Ihr Konto wird von Ihrem Identity-Provider verwaltet."
|
||||
newUsername = "Neuer Benutzername"
|
||||
oldPassword = "Aktuelles Passwort"
|
||||
newPassword = "Neues Passwort"
|
||||
confirmNewPassword = "Neues Passwort bestätigen"
|
||||
submit = "Änderung speichern"
|
||||
credsUpdated = "Konto aktualisiert"
|
||||
description = "Änderungen gespeichert. Bitte melden Sie sich erneut an."
|
||||
error = "Benutzername konnte nicht aktualisiert werden. Bitte überprüfen Sie Ihr Passwort und versuchen Sie es erneut."
|
||||
changeUsername = "Aktualisieren Sie Ihren Benutzernamen. Nach dem Update werden Sie abgemeldet."
|
||||
|
||||
[account]
|
||||
title = "Kontoeinstellungen"
|
||||
accountSettings = "Kontoeinstellungen"
|
||||
adminSettings = "Admin-Einstellungen – Benutzer anzeigen und hinzufügen"
|
||||
adminSettings = "Admin Einstellungen - Benutzer anzeigen und hinzufügen"
|
||||
userControlSettings = "Benutzerkontrolle"
|
||||
changeUsername = "Benutzername ändern"
|
||||
changeUsernameDescription = "Update your username. You will be logged out after updating."
|
||||
newUsernamePlaceholder = "Enter your new username"
|
||||
newUsername = "Neuer Benutzername"
|
||||
password = "Bestätigungspasswort"
|
||||
oldPassword = "Altes Passwort"
|
||||
@@ -548,13 +507,13 @@ newPassword = "Neues Passwort"
|
||||
changePassword = "Passwort ändern"
|
||||
confirmNewPassword = "Neues Passwort bestätigen"
|
||||
signOut = "Abmelden"
|
||||
yourApiKey = "Ihr API-Schlüssel"
|
||||
yourApiKey = "Dein API-Schlüssel"
|
||||
syncTitle = "Browsereinstellungen mit Konto synchronisieren"
|
||||
settingsCompare = "Einstellungen vergleichen:"
|
||||
property = "Eigenschaft"
|
||||
webBrowserSettings = "Webbrowser-Einstellung"
|
||||
syncToBrowser = "Konto → Browser synchronisieren"
|
||||
syncToAccount = "Konto ← Browser synchronisieren"
|
||||
syncToBrowser = "Synchronisiere Konto -> Browser"
|
||||
syncToAccount = "Synchronisiere Konto <- Browser"
|
||||
|
||||
[adminUserSettings]
|
||||
title = "Benutzerkontrolle"
|
||||
@@ -749,11 +708,6 @@ tags = "unterschrift,autogramm"
|
||||
title = "Signieren"
|
||||
desc = "Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotieren,highlight,zeichnen"
|
||||
title = "Annotieren"
|
||||
desc = "Im Viewer markieren, zeichnen, Notizen und Formen hinzufügen"
|
||||
|
||||
[home.flatten]
|
||||
tags = "vereinfachen,entfernen,interaktiv"
|
||||
title = "Abflachen"
|
||||
@@ -976,7 +930,6 @@ desc = "Beliebigen Text überall in Ihrem PDF hinzufügen"
|
||||
addFiles = "Dateien hinzufügen"
|
||||
uploadFromComputer = "Vom Computer hochladen"
|
||||
openFromComputer = "Vom Computer öffnen"
|
||||
mobileUpload = "Upload from Mobile"
|
||||
|
||||
[viewPdf]
|
||||
tags = "anzeigen,lesen,kommentieren,text,bild"
|
||||
@@ -984,7 +937,7 @@ title = "PDF anzeigen/bearbeiten"
|
||||
header = "PDF anzeigen"
|
||||
|
||||
[multiTool]
|
||||
tags = "Multi-Tool,Mehrfachoperation,UI,Klicken und Ziehen,Frontend,clientseitig"
|
||||
tags = "Multi Tool,Multi operation,UI,click drag,front end,client side"
|
||||
title = "PDF-Multitool"
|
||||
header = "PDF-Multitool"
|
||||
uploadPrompts = "Dateiname"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Optionen: CBZ zu PDF"
|
||||
optimizeForEbook = "PDF für E-Book-Reader optimieren (verwendet Ghostscript)"
|
||||
cbzOutputOptions = "Optionen: PDF zu CBZ"
|
||||
cbzDpi = "DPI für Bildrendering"
|
||||
cbrOptions = "CBR-Optionen"
|
||||
cbrOutputOptions = "Optionen: PDF zu CBR"
|
||||
cbrDpi = "DPI für Bildrendering"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Optionen: E-Book zu PDF"
|
||||
ebookOptionsDesc = "Optionen zum Konvertieren von E-Books in PDF"
|
||||
embedAllFonts = "Alle Schriftarten einbetten"
|
||||
embedAllFontsDesc = "Alle Schriftarten aus dem E-Book in das erzeugte PDF einbetten"
|
||||
includeTableOfContents = "Inhaltsverzeichnis einfügen"
|
||||
includeTableOfContentsDesc = "Ein erzeugtes Inhaltsverzeichnis zum Ergebnis-PDF hinzufügen"
|
||||
includePageNumbers = "Seitenzahlen einfügen"
|
||||
includePageNumbersDesc = "Seitenzahlen zum erzeugten PDF hinzufügen"
|
||||
optimizeForEbookPdf = "Für E-Book-Reader optimieren"
|
||||
optimizeForEbookPdfDesc = "PDF für das Lesen auf E-Book-Readern optimieren (kleinere Dateigröße, bessere Darstellung auf E-Ink-Geräten)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF to eBook Options"
|
||||
epubOptionsDesc = "Options for converting PDF to EPUB/AZW3"
|
||||
detectChapters = "Detect chapters"
|
||||
detectChaptersDesc = "Detect headings that look like chapters and insert EPUB page breaks"
|
||||
targetDevice = "Target device"
|
||||
targetDeviceDesc = "Choose an output profile optimized for the reader device"
|
||||
outputFormat = "Output format"
|
||||
outputFormatDesc = "Choose the output format for the ebook"
|
||||
tabletPhone = "Tablet/Phone (with images)"
|
||||
kindleEink = "Kindle e-Ink (text optimized)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konvertierung,img,jpg,bild,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Anhänge hinzufügen"
|
||||
add = "Anhang hinzufügen"
|
||||
remove = "Anhang entfernen"
|
||||
embed = "Anhang einbetten"
|
||||
convertToPdfA3b = "In PDF/A-3b konvertieren"
|
||||
convertToPdfA3bDescription = "Erstellt ein Archiv-PDF mit eingebetteten Anhängen"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b ist ein Archivformat, das die langfristige Aufbewahrung sicherstellt. Es erlaubt das Einbetten beliebiger Dateiformate als Anhänge. Die Konvertierung erfordert Ghostscript und kann bei großen Dateien länger dauern."
|
||||
convertToPdfA3bTooltipHeader = "Über die PDF/A-3b-Konvertierung"
|
||||
convertToPdfA3bTooltipTitle = "Funktion"
|
||||
submit = "Anhänge hinzufügen"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Gespeichert"
|
||||
label = "Unterschriftsbild hochladen"
|
||||
placeholder = "Bilddatei auswählen"
|
||||
hint = "Laden Sie ein PNG- oder JPG-Bild Ihrer Unterschrift hoch"
|
||||
removeBackground = "Weißen Hintergrund entfernen (transparent machen)"
|
||||
processing = "Bild wird verarbeitet..."
|
||||
backgroundRemovalFailedTitle = "Hintergrund konnte nicht entfernt werden"
|
||||
backgroundRemovalFailedMessage = "Der Hintergrund konnte nicht aus dem Bild entfernt werden. Das Originalbild wird stattdessen verwendet."
|
||||
|
||||
[sign.instructions]
|
||||
title = "So fügen Sie eine Unterschrift hinzu"
|
||||
@@ -2434,11 +2351,6 @@ note = "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie ni
|
||||
label = "Nur Formulare vereinfachen"
|
||||
desc = "Nur Formularfelder vereinfachen, andere interaktive Elemente unverändert lassen"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Rendering-DPI (optional, empfohlen 150 DPI)"
|
||||
help = "Lassen Sie das Feld leer, um die Systemvorgabe zu verwenden. Höhere DPI schärfen das Ergebnis, erhöhen aber die Verarbeitungszeit und die Dateigröße."
|
||||
placeholder = "z. B. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Reduzierungs-Ergebnisse"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "PDF zuschneiden"
|
||||
submit = "Abschicken"
|
||||
noFileSelected = "Wählen Sie eine PDF-Datei aus, um mit dem Zuschneiden zu beginnen"
|
||||
reset = "Auf vollständiges PDF zurücksetzen"
|
||||
autoCrop = "Auto-crop whitespace"
|
||||
|
||||
[crop.preview]
|
||||
title = "Zuschneidebereich-Auswahl"
|
||||
@@ -3078,7 +2989,7 @@ submit = "Aufteilen"
|
||||
tags = "sauber,sicher,sicher,bedrohungen entfernen"
|
||||
|
||||
[URLToPDF]
|
||||
tags = "webaufnahme,seite speichern,web-zu-dokument,archiv"
|
||||
tags = "web capture,seite speichern,web to doc,archiv"
|
||||
title = "URL zu PDF"
|
||||
header = "URL zu PDF"
|
||||
submit = "Konvertieren"
|
||||
@@ -3244,7 +3155,6 @@ title = "Schwärzungs-Methode"
|
||||
mode = "Modus"
|
||||
automatic = "Automatisch"
|
||||
automaticDesc = "Text basierend auf Suchbegriffen schwärzen"
|
||||
automaticDisabledTooltip = "Select files in the file manager to redact multiple files at once"
|
||||
manual = "Manuell"
|
||||
manualDesc = "Klicken und ziehen zum Schwärzen bestimmter Bereiche"
|
||||
manualComingSoon = "Manuelle Schwärzung kommt bald"
|
||||
@@ -3315,35 +3225,8 @@ text = "Nur vollständige Wörter abgleichen, keine Teilübereinstimmungen. 'Joh
|
||||
title = "In PDF-Bild konvertieren"
|
||||
text = "Konvertiert das PDF nach der Schwärzung in ein bildbasiertes PDF. Dies stellt sicher, dass Text hinter Schwärzungskästen vollständig entfernt und nicht wiederherstellbar ist."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Manual Redaction Controls"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Mark Text Tool"
|
||||
text = "Select text directly on the PDF to mark it for redaction. Click and drag to highlight specific text that you want to redact."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Mark Area Tool"
|
||||
text = "Draw rectangular areas on the PDF to mark regions for redaction. Useful for redacting images, signatures, or irregular shapes."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Apply Redactions"
|
||||
text = "After marking content, click 'Apply' to permanently redact all marked areas. The pending count shows how many redactions are ready to be applied."
|
||||
bullet1 = "Mark as many areas as needed before applying"
|
||||
bullet2 = "All pending redactions are applied at once"
|
||||
bullet3 = "Redactions cannot be undone after applying"
|
||||
|
||||
[redact.manual]
|
||||
title = "Redaction Tools"
|
||||
instructions = "Select text or draw areas on the PDF to mark content for redaction."
|
||||
markText = "Mark Text"
|
||||
markArea = "Mark Area"
|
||||
pendingLabel = "Pending:"
|
||||
applyWarning = "⚠️ Permanent application, cannot be undone and the data underneath will be deleted"
|
||||
apply = "Apply"
|
||||
noMarks = "No redaction marks. Use the tools above to mark content for redaction."
|
||||
header = "Manuelle Schwärzung"
|
||||
controlsTitle = "Manual Redaction Controls"
|
||||
textBasedRedaction = "Textbasierte Schwärzung"
|
||||
pageBasedRedaction = "Seitenbasierte Schwärzung"
|
||||
convertPDFToImageLabel = "PDF zu PDF-Bild konvertieren (Verwendet, um Text hinter dem Kasten zu entfernen)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Anzahl horizontaler Teiler eingeben"
|
||||
label = "Vertikale Teiler"
|
||||
placeholder = "Anzahl vertikaler Teiler eingeben"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Teilmodus"
|
||||
description = "Wählen Sie, wie die Seiten geteilt werden sollen"
|
||||
splitAll = "Alle Seiten teilen"
|
||||
splitAllExceptFirst = "Alle außer der ersten teilen"
|
||||
splitAllExceptLast = "Alle außer der letzten teilen"
|
||||
splitAllExceptFirstAndLast = "Alle außer der ersten und letzten teilen"
|
||||
custom = "Benutzerdefinierte Seiten"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Benutzerdefinierte Seitenzahlen"
|
||||
placeholder = "z. B. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "stempeln,bild hinzufügen,bild zentrieren,wasserzeichen,pdf,einbetten,anpassen"
|
||||
header = "PDF Stempel"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Dateigröße"
|
||||
[compress.grayscale]
|
||||
label = "Graustufen für Komprimierung anwenden"
|
||||
|
||||
[compress.linearize]
|
||||
label = "PDF für schnelles Web-Viewing linearisieren"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Bilder in Strichzeichnungen umwandeln"
|
||||
description = "Verwendet ImageMagick, um Seiten in kontrastreiches Schwarzweiß umzuwandeln und die Dateigröße maximal zu reduzieren."
|
||||
unavailable = "ImageMagick ist auf diesem Server nicht installiert oder aktiviert"
|
||||
detailLevel = "Detailgrad"
|
||||
edgeEmphasis = "Kantenbetonung"
|
||||
edgeLow = "Sanft"
|
||||
edgeMedium = "Ausgewogen"
|
||||
edgeHigh = "Stark"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Kompressions-Einstellungen - Übersicht"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Höhere Werte reduzieren die Dateigröße"
|
||||
title = "Graustufen"
|
||||
text = "Wählen Sie diese Option, um alle Bilder in Schwarz-Weiß zu konvertieren, was die Dateigröße erheblich reduzieren kann, insbesondere bei gescannten PDFs oder bildreichen Dokumenten."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Strichzeichnung"
|
||||
text = "Konvertiert Seiten mit ImageMagick in kontrastreiches Schwarzweiß. Mit der Detailstufe steuern Sie, wie viel Inhalt schwarz wird, und mit der Kantenbetonung, wie aggressiv Kanten erkannt werden."
|
||||
|
||||
[compress.error]
|
||||
failed = "Ein Fehler ist beim Komprimieren der PDF aufgetreten."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Ein Fehler ist beim Komprimieren der PDF aufgetreten."
|
||||
_value = "Kompressionseinstellungen"
|
||||
1 = "1-3 PDF-Komprimierung, </br> 4-6 Leichte Bildkomprimierung, </br> 7-9 Intensive Bildkomprimierung verringert die Bildqualität dramatisch"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Niedrigere Werte bewahren die Qualität, führen aber zu größeren Dateien"
|
||||
range4to6 = "Mittlere Komprimierung mit moderater Qualitätsreduktion"
|
||||
range7to9 = "Höhere Werte reduzieren die Dateigröße deutlich, können aber die Bildschärfe verringern"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Diese Datei ist passwortgeschützt. Bitte geben Sie das Passwort ein:"
|
||||
cancelled = "Vorgang für PDF abgebrochen: {0}"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "Ausgewählte Seiten löschen"
|
||||
closePdf = "PDF schließen"
|
||||
exportAll = "PDF exportieren"
|
||||
downloadSelected = "Ausgewählte Dateien herunterladen"
|
||||
annotations = "Annotations"
|
||||
exportSelected = "Ausgewählte Seiten exportieren"
|
||||
saveChanges = "Änderungen speichern"
|
||||
downloadAll = "Alle herunterladen"
|
||||
saveAll = "Alle speichern"
|
||||
toggleTheme = "Design wechseln"
|
||||
toggleBookmarks = "Lesezeichen ein-/ausblenden"
|
||||
language = "Sprache"
|
||||
toggleAnnotations = "Anmerkungen ein-/ausblenden"
|
||||
search = "PDF durchsuchen"
|
||||
panMode = "Verschiebemodus"
|
||||
applyRedactionsFirst = "Apply redactions first"
|
||||
rotateLeft = "Nach links drehen"
|
||||
rotateRight = "Nach rechts drehen"
|
||||
toggleSidebar = "Seitenleiste umschalten"
|
||||
toggleBookmarks = "Lesezeichen ein-/ausblenden"
|
||||
exportSelected = "Ausgewählte Seiten exportieren"
|
||||
toggleAnnotations = "Anmerkungen ein-/ausblenden"
|
||||
annotationMode = "Anmerkungsmodus umschalten"
|
||||
print = "PDF drucken"
|
||||
draw = "Draw"
|
||||
redact = "Redact"
|
||||
exitRedaction = "Exit Redaction Mode"
|
||||
save = "Save"
|
||||
downloadAll = "Alle herunterladen"
|
||||
saveAll = "Alle speichern"
|
||||
|
||||
[textAlign]
|
||||
left = "Links"
|
||||
center = "Zentriert"
|
||||
right = "Rechts"
|
||||
|
||||
[annotation]
|
||||
title = "Annotieren"
|
||||
desc = "Markieren, Stift, Text und Notizen verwenden. Änderungen bleiben live – kein Abflachen erforderlich."
|
||||
highlight = "Markieren"
|
||||
pen = "Stift"
|
||||
text = "Textfeld"
|
||||
note = "Notiz"
|
||||
rectangle = "Rechteck"
|
||||
ellipse = "Ellipse"
|
||||
select = "Auswählen"
|
||||
exit = "Anmerkungsmodus beenden"
|
||||
strokeWidth = "Breite"
|
||||
opacity = "Deckkraft"
|
||||
strokeOpacity = "Linien-Deckkraft"
|
||||
fillOpacity = "Fülldeckkraft"
|
||||
fontSize = "Schriftgröße"
|
||||
chooseColor = "Farbe wählen"
|
||||
color = "Farbe"
|
||||
strokeColor = "Linienfarbe"
|
||||
fillColor = "Füllfarbe"
|
||||
underline = "Unterstreichen"
|
||||
strikeout = "Durchstreichen"
|
||||
squiggly = "Wellenlinie"
|
||||
inkHighlighter = "Freihand-Textmarker"
|
||||
freehandHighlighter = "Freihand-Textmarker"
|
||||
square = "Quadrat"
|
||||
circle = "Kreis"
|
||||
polygon = "Polygon"
|
||||
line = "Linie"
|
||||
stamp = "Bild hinzufügen"
|
||||
textMarkup = "Textmarkierung"
|
||||
drawing = "Zeichnung"
|
||||
shapes = "Formen"
|
||||
notesStamps = "Notizen & Stempel"
|
||||
settings = "Einstellungen"
|
||||
borderOn = "Rahmen: Ein"
|
||||
borderOff = "Rahmen: Aus"
|
||||
editInk = "Stift bearbeiten"
|
||||
editLine = "Linie bearbeiten"
|
||||
editNote = "Notiz bearbeiten"
|
||||
editText = "Textfeld bearbeiten"
|
||||
editTextMarkup = "Textmarkierung bearbeiten"
|
||||
editSelected = "Anmerkung bearbeiten"
|
||||
editSquare = "Quadrat bearbeiten"
|
||||
editCircle = "Kreis bearbeiten"
|
||||
editPolygon = "Polygon bearbeiten"
|
||||
unsupportedType = "Dieser Anmerkungstyp wird für die Bearbeitung nicht vollständig unterstützt."
|
||||
textAlignment = "Textausrichtung"
|
||||
noteIcon = "Notizsymbol"
|
||||
imagePreview = "Vorschau"
|
||||
contents = "Text"
|
||||
backgroundColor = "Hintergrundfarbe"
|
||||
clearBackground = "Hintergrund entfernen"
|
||||
noBackground = "Kein Hintergrund"
|
||||
stampSettings = "Stempel-Einstellungen"
|
||||
savingCopy = "Download wird vorbereitet..."
|
||||
saveFailed = "Kopie konnte nicht gespeichert werden"
|
||||
saveReady = "Download bereit"
|
||||
selectAndMove = "Auswählen und Bearbeiten"
|
||||
editSelectDescription = "Klicken Sie auf eine vorhandene Anmerkung, um Farbe, Deckkraft, Text oder Größe zu bearbeiten."
|
||||
editStampHint = "Um das Bild zu ändern, löschen Sie diesen Stempel und fügen Sie einen neuen hinzu."
|
||||
editSwitchToSelect = "Wechseln Sie zu „Auswählen und Bearbeiten“, um diese Anmerkung zu bearbeiten."
|
||||
undo = "Rückgängig"
|
||||
redo = "Wiederholen"
|
||||
applyChanges = "Änderungen anwenden"
|
||||
saveChanges = "Save Changes"
|
||||
draw = "Zeichnen"
|
||||
save = "Speichern"
|
||||
saveChanges = "Änderungen speichern"
|
||||
|
||||
[search]
|
||||
title = "PDF durchsuchen"
|
||||
@@ -4265,20 +4038,12 @@ settings = "Optionen"
|
||||
adminSettings = "Admin Optionen"
|
||||
allTools = "Werkzeuge"
|
||||
reader = "Reader"
|
||||
tours = "Touren"
|
||||
showMeAround = "Rundgang starten"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Sehen Sie sich hier Touren an: Tools-Tour, V2-Layout-Tour und Admin-Tour."
|
||||
user = "Sehen Sie sich hier Touren an: Tools-Tour und V2-Layout-Tour."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tool-Tour"
|
||||
toolsTourDesc = "Erfahren Sie, was die Tools können"
|
||||
adminTour = "Admin-Tour"
|
||||
adminTourDesc = "Entdecken Sie Admin-Einstellungen & Funktionen"
|
||||
whatsNewTour = "Neu in V2"
|
||||
whatsNewTourDesc = "Tour zum aktualisierten Layout"
|
||||
|
||||
[admin]
|
||||
error = "Fehler"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Einstellungen konnten nicht geladen werden"
|
||||
saveError = "Einstellungen konnten nicht gespeichert werden"
|
||||
saved = "Einstellungen erfolgreich gespeichert"
|
||||
saveSuccess = "Einstellungen erfolgreich gespeichert"
|
||||
success = "Settings saved successfully"
|
||||
error = "Failed to save settings"
|
||||
save = "Änderungen speichern"
|
||||
discard = "Verwerfen"
|
||||
restartRequired = "Neustart erforderlich"
|
||||
@@ -4422,13 +4185,6 @@ description = "Pfad zur WeasyPrint-Ausführungsdatei für HTML-zu-PDF-Konvertier
|
||||
label = "Unoconvert-Ausführbare Datei"
|
||||
description = "Pfad zu LibreOffice unoconvert für Dokumentkonvertierungen (leer lassen für Standard: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Base URL for frontend (e.g., https://pdf.example.com). Used for email invite links and mobile QR code uploads. Leave empty to use backend URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Click to view plan details"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sicherheit"
|
||||
description = "Authentifizierung, Anmeldeverhalten und Sicherheitsrichtlinien konfigurieren."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Verbinden"
|
||||
disconnect = "Trennen"
|
||||
disconnected = "Anbieter erfolgreich getrennt"
|
||||
disconnectError = "Anbieter konnte nicht getrennt werden"
|
||||
mobileScannerConvertToPdf = "Convert Images to PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is."
|
||||
mobileScannerImageResolution = "Image Resolution"
|
||||
mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size."
|
||||
imageResolutionFull = "Full (Original Size)"
|
||||
imageResolutionReduced = "Reduced (Max 1200px)"
|
||||
mobileScannerPageFormat = "Page Format"
|
||||
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
|
||||
pageFormatKeep = "Keep (Original Dimensions)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Stretch to Fit"
|
||||
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO-Autoanmeldung"
|
||||
@@ -4646,122 +4389,6 @@ description = "Benutzerkonten bei der ersten SAML2-Anmeldung automatisch erstell
|
||||
label = "Registrierung blockieren"
|
||||
description = "Neue Benutzerregistrierung über SAML2 verhindern"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Mobile Phone Upload"
|
||||
enable = "Enable QR Code Upload"
|
||||
description = "Allow users to upload files from mobile devices by scanning a QR code"
|
||||
note = "Note: Requires Frontend URL to be configured. "
|
||||
link = "Configure in System Settings"
|
||||
mobileScannerConvertToPdf = "Convert Images to PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is."
|
||||
mobileScannerImageResolution = "Image Resolution"
|
||||
mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size."
|
||||
imageResolutionFull = "Full (Original Size)"
|
||||
imageResolutionReduced = "Reduced (Max 1200px)"
|
||||
mobileScannerPageFormat = "Page Format"
|
||||
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
|
||||
pageFormatKeep = "Keep (Original Dimensions)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Stretch to Fit"
|
||||
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram Bot"
|
||||
description = "Configure Telegram bot connectivity, access controls, and feedback behavior."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Enable Telegram Bot"
|
||||
description = "Allow users to interact with Stirling PDF through your configured Telegram bot."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot Username"
|
||||
description = "The public username of your Telegram bot."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "API token provided by BotFather for your Telegram bot."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Inbox Folder"
|
||||
description = "Folder under the pipeline directory where incoming Telegram files are stored."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Use Custom Folder Suffix"
|
||||
description = "Append the chat ID to incoming file folders to isolate uploads per chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Access Control"
|
||||
description = "Restrict which users or channels can interact with the bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Allow Specific User IDs"
|
||||
description = "When enabled, only listed user IDs can use the bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Allowed User IDs"
|
||||
description = "Enter Telegram user IDs allowed to interact with the bot."
|
||||
placeholder = "Add user ID and press enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Allow Specific Channel IDs"
|
||||
description = "When enabled, only listed channel IDs can use the bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Allowed Channel IDs"
|
||||
description = "Enter Telegram channel IDs allowed to interact with the bot."
|
||||
placeholder = "Add channel ID and press enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Processing"
|
||||
description = "Control polling intervals and processing timeouts for Telegram uploads."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Processing Timeout (seconds)"
|
||||
description = "Maximum time to wait for a processing job before reporting an error."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Polling Interval (ms)"
|
||||
description = "Interval between checks for new Telegram updates."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Feedback Messages"
|
||||
description = "Choose when the bot should send feedback to users and channels."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Enable Feedback"
|
||||
description = "Control whether the bot sends feedback messages at all."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Channel Feedback Rules"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Show \"No valid document\" (Channel)"
|
||||
description = "Suppress the no valid document response for channel uploads."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Show processing errors (Channel)"
|
||||
description = "Send processing error messages to channels."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Show error messages (Channel)"
|
||||
description = "Show detailed error messages for channels."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "User Feedback Rules"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Show \"No valid document\" (User)"
|
||||
description = "Suppress the no valid document response for user uploads."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Show processing errors (User)"
|
||||
description = "Send processing error messages to users."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Show error messages (User)"
|
||||
description = "Show detailed error messages for users."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Datenbank"
|
||||
description = "Benutzerdefinierte Datenbankverbindungseinstellungen für Enterprise-Bereitstellungen konfigurieren."
|
||||
@@ -4943,10 +4570,6 @@ description = "Admins erlauben, Benutzer per E-Mail mit automatisch generierten
|
||||
label = "Frontend-URL"
|
||||
description = "Basis-URL für das Frontend (z. B. https://pdf.example.com). Wird zum Erzeugen von Einladungslinks in E-Mails verwendet. Leer lassen, um Backend-URL zu verwenden."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Note: Requires Frontend URL to be configured. "
|
||||
link = "Configure in System Settings"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Rechtliche Dokumente"
|
||||
description = "Links zu rechtlichen Dokumenten und Richtlinien konfigurieren."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Meine Dateien"
|
||||
noRecentFiles = "Keine kürzlichen Dateien gefunden"
|
||||
googleDriveNotAvailable = "Google Drive-Integration nicht verfügbar"
|
||||
mobileUpload = "Mobile Upload"
|
||||
mobileShort = "Mobile"
|
||||
mobileUploadNotAvailable = "Mobile upload not enabled"
|
||||
downloadSelected = "Ausgewählte herunterladen"
|
||||
saveSelected = "Auswahl speichern"
|
||||
openFiles = "Dateien öffnen"
|
||||
@@ -5418,7 +5038,7 @@ securePdfIngestionDesc = "Umfassender PDF-Verarbeitungsworkflow, der Dokumente b
|
||||
emailPreparation = "E-Mail-Vorbereitung"
|
||||
emailPreparationDesc = "Optimiert PDFs für E-Mail-Verteilung durch Komprimierung von Dateien, Aufteilen großer Dokumente in 20MB-Blöcke für E-Mail-Kompatibilität und Entfernen von Metadaten für den Datenschutz."
|
||||
secureWorkflow = "Sicherheits-Workflow"
|
||||
secureWorkflowDesc = "Sichert PDF-Dokumente durch Entfernen potenziell schädlicher Inhalte wie JavaScript und eingebetteter Dateien und fügt anschließend Passwortschutz hinzu, um unbefugten Zugriff zu verhindern. Das Passwort ist standardmäßig auf „password“ gesetzt."
|
||||
secureWorkflowDesc = "Sichert PDF-Dokumente durch Entfernen potentiell schädlicher Inhalte wie JavaScript und eingebettete Dateien, dann fügt Passwortschutz hinzu, um unbefugten Zugriff zu verhindern. Passwort ist standardmäßig auf 'password' gesetzt."
|
||||
processImages = "Bilder verarbeiten"
|
||||
processImagesDesc = "Konvertiert mehrere Bilddateien in ein einzelnes PDF-Dokument und wendet dann OCR-Technologie an, um durchsuchbaren Text aus den Bildern zu extrahieren."
|
||||
prePublishSanitization = "Bereinigung vor Veröffentlichung"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Laden..."
|
||||
back = "Zurück"
|
||||
continue = "Weiter"
|
||||
error = "Fehler"
|
||||
save = "Save"
|
||||
|
||||
[config.overview]
|
||||
title = "Anwendungskonfiguration"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Alle Anwendungen oder Dienste, die derzeit diese Schlüssel verwenden,
|
||||
confirmPrompt = "Sind Sie sicher, dass Sie fortfahren möchten?"
|
||||
confirmCta = "Schlüssel aktualisieren"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API Key Error"
|
||||
failedToCreateApiKey = "Failed to create API key."
|
||||
failedToRetrieveApiKey = "Failed to retrieve API key from response."
|
||||
failedToFetchApiKey = "Failed to fetch API key."
|
||||
apiKeyRefreshed = "API Key Refreshed"
|
||||
apiKeyRefreshedBody = "Your API key has been successfully refreshed."
|
||||
failedToRefreshApiKey = "Failed to refresh API key."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Anhänge auswählen"
|
||||
info = "Wählen Sie Dateien aus, die Sie Ihrer PDF anhängen möchten. Diese Dateien werden eingebettet und über das Anhangs-Panel der PDF zugänglich sein."
|
||||
@@ -5601,44 +5211,34 @@ noSearchResults = "Keine Tools gefunden"
|
||||
noTools = "Keine Tools verfügbar"
|
||||
|
||||
[onboarding]
|
||||
allTools = "Dies ist das Panel <strong>Alle Tools</strong>, in dem Sie alle verfügbaren PDF-Tools durchsuchen und auswählen können."
|
||||
selectCropTool = "Wählen wir das Tool <strong>Zuschneiden</strong> aus, um zu zeigen, wie eines der Tools verwendet wird."
|
||||
toolInterface = "Dies ist die Oberfläche des Tools <strong>Zuschneiden</strong>. Wie Sie sehen, ist hier noch nicht viel zu sehen, da wir noch keine PDF-Dateien hinzugefügt haben."
|
||||
allTools = "This is the <strong>All Tools</strong> panel, where you can browse and select from all available PDF tools."
|
||||
selectCropTool = "Wählen wir das Tool <strong>Crop</strong> aus, um zu zeigen, wie eines der Tools verwendet wird."
|
||||
toolInterface = "Dies ist die Oberfläche des Tools <strong>Crop</strong>. Wie Sie sehen, ist hier noch nicht viel zu sehen, da wir noch keine PDF-Dateien hinzugefügt haben."
|
||||
filesButton = "Mit der Schaltfläche <strong>Dateien</strong> in der Schnellzugriffsleiste können Sie PDFs hochladen, um die Tools darauf anzuwenden."
|
||||
fileSources = "Sie können hier neue Dateien hochladen oder auf zuletzt verwendete Dateien zugreifen. Für die Tour verwenden wir eine Beispieldatei."
|
||||
workbench = "Dies ist der <strong>Arbeitsbereich</strong> – der Hauptbereich, in dem Sie Ihre PDFs ansehen und bearbeiten."
|
||||
workbench = "Dies ist die <strong>Workbench</strong> – der Hauptbereich, in dem Sie Ihre PDFs ansehen und bearbeiten."
|
||||
viewSwitcher = "Verwenden Sie diese Steuerelemente, um auszuwählen, wie Sie Ihre PDFs ansehen möchten."
|
||||
viewer = "Der <strong>Viewer</strong> ermöglicht es, Ihre PDFs zu lesen und zu annotieren."
|
||||
pageEditor = "Der <strong>Seiteneditor</strong> ermöglicht verschiedene Aktionen an den Seiten Ihrer PDFs, wie Neuanordnen, Drehen und Löschen."
|
||||
activeFiles = "Die Ansicht <strong>Aktive Dateien</strong> zeigt alle PDFs, die Sie im Tool geladen haben, und ermöglicht es Ihnen, auszuwählen, welche verarbeitet werden sollen."
|
||||
pageEditor = "Der <strong>Page Editor</strong> ermöglicht verschiedene Aktionen an den Seiten Ihrer PDFs, wie Neuanordnen, Drehen und Löschen."
|
||||
activeFiles = "Die Ansicht <strong>Active Files</strong> zeigt alle PDFs, die Sie im Tool geladen haben, und ermöglicht es Ihnen, auszuwählen, welche verarbeitet werden sollen."
|
||||
fileCheckbox = "Durch Klicken auf eine der Dateien wählen Sie diese zur Verarbeitung aus. Sie können mehrere Dateien für Batch-Operationen auswählen."
|
||||
selectControls = "Die <strong>rechte Leiste</strong> enthält Schaltflächen, um alle aktiven PDFs schnell zu (de-)selektieren, sowie Schaltflächen zum Ändern des App-Themas oder der Sprache."
|
||||
cropSettings = "Nachdem wir die Datei ausgewählt haben, die wir zuschneiden möchten, können wir das Tool Zuschneiden konfigurieren, um den Bereich auszuwählen, auf den das PDF zugeschnitten werden soll."
|
||||
selectControls = "Die <strong>Rechte Leiste</strong> enthält Schaltflächen, um alle aktiven PDFs schnell zu (de-)selektieren, sowie Schaltflächen zum Ändern des App-Themas oder der Sprache."
|
||||
cropSettings = "Nachdem wir die Datei ausgewählt haben, die wir zuschneiden möchten, können wir das Tool Crop konfigurieren, um den Bereich auszuwählen, auf den das PDF zugeschnitten werden soll."
|
||||
runButton = "Sobald das Tool konfiguriert ist, können Sie mit dieser Schaltfläche das Tool auf alle ausgewählten PDFs ausführen."
|
||||
results = "Nachdem das Tool fertig ist, zeigt der Schritt <strong>Überprüfen</strong> in diesem Bereich eine Vorschau der Ergebnisse und ermöglicht es Ihnen, den Vorgang rückgängig zu machen oder die Datei herunterzuladen."
|
||||
fileReplacement = "Die geänderte Datei ersetzt automatisch die Originaldatei im Arbeitsbereich, sodass Sie sie einfach mit weiteren Tools verarbeiten können."
|
||||
pinButton = "Mit der Schaltfläche <strong>Anheften</strong> können Sie dafür sorgen, dass Ihre Dateien nach dem Ausführen von Tools aktiv bleiben."
|
||||
wrapUp = "Alles fertig! Sie haben die Hauptbereiche der App und deren Verwendung kennengelernt. Klicken Sie jederzeit auf die Schaltfläche <strong>Hilfe</strong>, um diese Tour erneut zu sehen."
|
||||
results = "Nachdem das Tool fertig ist, zeigt der Schritt <strong>Review</strong> in diesem Bereich eine Vorschau der Ergebnisse und ermöglicht es Ihnen, den Vorgang rückgängig zu machen oder die Datei herunterzuladen."
|
||||
fileReplacement = "Die geänderte Datei ersetzt automatisch die Originaldatei in der Workbench, sodass Sie sie einfach mit weiteren Tools verarbeiten können."
|
||||
pinButton = "Mit der Schaltfläche <strong>Pin</strong> können Sie dafür sorgen, dass Ihre Dateien nach dem Ausführen von Tools aktiv bleiben."
|
||||
wrapUp = "Alles fertig! Sie haben die Hauptbereiche der App und deren Verwendung kennengelernt. Klicken Sie jederzeit auf die Schaltfläche <strong>Help</strong>, um diese Tour erneut zu sehen."
|
||||
previous = "Zurück"
|
||||
next = "Weiter"
|
||||
finish = "Fertigstellen"
|
||||
startTour = "Tour starten"
|
||||
startTourDescription = "Geführte Tour zu den wichtigsten Funktionen von Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Starten Sie im Bereich <strong>Schnellzugriff</strong>, um zwischen Reader, Automate, Ihren Dateien und allen Touren zu wechseln."
|
||||
leftPanel = "Die linke <strong>Tools</strong>-Leiste zeigt alles, was Sie tun können. Durchsuchen Sie Kategorien oder suchen Sie, um schnell ein Tool zu finden."
|
||||
fileUpload = "Verwenden Sie die Schaltfläche <strong>Dateien</strong>, um eine PDF hochzuladen oder eine kürzlich verwendete auszuwählen. Wir laden ein Beispiel, damit Sie den Arbeitsbereich sehen können."
|
||||
rightRail = "Die <strong>rechte Leiste</strong> enthält Schnellaktionen zum Auswählen von Dateien, Ändern des Designs oder der Sprache und zum Herunterladen von Ergebnissen."
|
||||
topBar = "Die obere Leiste ermöglicht den Wechsel zwischen <strong>Viewer</strong>, <strong>Seiteneditor</strong> und <strong>Aktive Dateien</strong>."
|
||||
pageEditorView = "Wechseln Sie zum Seiteneditor, um Seiten neu anzuordnen, zu drehen oder zu löschen."
|
||||
activeFilesView = "Verwenden Sie „Aktive Dateien“, um alles Geöffnete zu sehen und auszuwählen, woran Sie arbeiten möchten."
|
||||
wrapUp = "Das ist neu in V2. Öffnen Sie jederzeit das Menü <strong>Touren</strong>, um diese, die Tools-Tour oder die Admin-Tour erneut abzuspielen."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Willkommen bei Stirling PDF!"
|
||||
description = "Möchten Sie eine kurze 1‑Minuten‑Tour machen, um die wichtigsten Funktionen kennenzulernen und zu erfahren, wie Sie loslegen?"
|
||||
helpHint = "Sie können diese Tour jederzeit über die Schaltfläche <strong>Hilfe</strong> unten links aufrufen."
|
||||
helpHint = "Sie können diese Tour jederzeit über die Schaltfläche <strong>Help</strong> unten links aufrufen."
|
||||
startTour = "Tour starten"
|
||||
maybeLater = "Vielleicht später"
|
||||
dontShowAgain = "Nicht mehr anzeigen"
|
||||
@@ -5651,14 +5251,10 @@ body = "Stirling PDF ist jetzt bereit für Teams jeder Größe. Dieses Update br
|
||||
next = "Weiter →"
|
||||
back = "Zurück"
|
||||
skipForNow = "Für jetzt überspringen"
|
||||
download = "Herunterladen →"
|
||||
download = "Download →"
|
||||
showMeAround = "Rundgang starten"
|
||||
skipTheTour = "Rundgang überspringen"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Tour-Übersicht"
|
||||
body = "Stirling PDF V2 wird mit Dutzenden Tools und einem aufgefrischten Layout ausgeliefert. Machen Sie eine kurze Tour, um zu sehen, was sich geändert hat und wo Sie die benötigten Funktionen finden."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Für jetzt überspringen"
|
||||
seePlans = "Pläne ansehen →"
|
||||
@@ -5669,8 +5265,8 @@ overLimitBody = "Unsere Lizenz erlaubt bis zu <strong>{{freeTierLimit}}</strong>
|
||||
freeBody = "Unsere <strong>Open-Core</strong>-Lizenz erlaubt bis zu <strong>{{freeTierLimit}}</strong> Nutzern pro Server kostenlos. Um unterbrechungsfrei zu skalieren, empfehlen wir den Stirling Server-Plan - <strong>unbegrenzte Plätze</strong> und <strong>SSO-Unterstützung</strong> für $99/Server/Monat."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Herunterladen"
|
||||
titleWithOs = "Herunterladen für {{osLabel}}"
|
||||
title = "Download"
|
||||
titleWithOs = "Download für {{osLabel}}"
|
||||
body = "Stirling funktioniert am besten als Desktop-App. Sie können es offline nutzen, schneller auf Dokumente zugreifen und lokal auf Ihrem Computer bearbeiten."
|
||||
|
||||
[onboarding.planOverview]
|
||||
@@ -5685,14 +5281,14 @@ message = "Die Anwendung hat kürzlich bedeutende Änderungen erfahren. Möglich
|
||||
|
||||
[adminOnboarding]
|
||||
welcome = "Willkommen zur <strong>Admin-Tour</strong>! Entdecken wir die leistungsstarken Enterprise-Funktionen und Einstellungen für Systemadministratoren."
|
||||
configButton = "Klicken Sie auf die Schaltfläche <strong>Konfiguration</strong>, um alle Systemeinstellungen und Administrationskontrollen aufzurufen."
|
||||
configButton = "Klicken Sie auf die Schaltfläche <strong>Config</strong>, um alle Systemeinstellungen und Administrationskontrollen aufzurufen."
|
||||
settingsOverview = "Dies ist das <strong>Einstellungsfeld</strong>. Admin-Einstellungen sind zur einfachen Navigation nach Kategorien organisiert."
|
||||
teamsAndUsers = "Verwalten Sie hier <strong>Teams</strong> und einzelne Benutzer. Sie können neue Benutzer per E-Mail, teilbaren Links einladen oder selbst benutzerdefinierte Konten erstellen."
|
||||
systemCustomization = "Wir bieten umfangreiche Möglichkeiten zur UI-Anpassung: <strong>Systemeinstellungen</strong> ermöglichen Änderungen am App-Namen und an Sprachen, <strong>Funktionen</strong> ermöglicht die Verwaltung von Serverzertifikaten und <strong>Endpunkte</strong> das Aktivieren oder Deaktivieren spezifischer Tools für Ihre Benutzer."
|
||||
systemCustomization = "Wir bieten umfangreiche Möglichkeiten zur UI-Anpassung: <strong>System Settings</strong> ermöglichen Änderungen am App-Namen und an Sprachen, <strong>Features</strong> ermöglicht die Verwaltung von Serverzertifikaten und <strong>Endpoints</strong> das Aktivieren oder Deaktivieren spezifischer Tools für Ihre Benutzer."
|
||||
databaseSection = "Für erweiterte Produktionsumgebungen gibt es Einstellungen für <strong>externe Datenbankanbindungen</strong>, damit Sie Ihre bestehende Infrastruktur integrieren können."
|
||||
connectionsSection = "Der Bereich <strong>Verbindungen</strong> unterstützt verschiedene Anmeldemethoden, einschließlich benutzerdefiniertem SSO und SAML-Anbietern wie Google und GitHub, sowie E-Mail-Integrationen für Benachrichtigungen und Kommunikation."
|
||||
adminTools = "Abschließend bieten wir erweiterte Administrationstools wie <strong>Audit-Protokollierung</strong> zur Nachverfolgung der Systemaktivität und <strong>Nutzungsanalysen</strong> zur Überwachung, wie Ihre Benutzer mit der Plattform interagieren."
|
||||
wrapUp = "Das war die Admin-Tour! Sie haben die Enterprise-Funktionen gesehen, die Stirling PDF zu einer leistungsstarken, anpassbaren Lösung für Organisationen machen. Sie können diese Tour jederzeit über das <strong>Hilfe</strong>-Menü aufrufen."
|
||||
connectionsSection = "Der Bereich <strong>Connections</strong> unterstützt verschiedene Anmeldemethoden, einschließlich benutzerdefiniertem SSO und SAML-Anbietern wie Google und GitHub, sowie E-Mail-Integrationen für Benachrichtigungen und Kommunikation."
|
||||
adminTools = "Abschließend bieten wir erweiterte Administrationstools wie <strong>Auditing</strong> zur Nachverfolgung der Systemaktivität und <strong>Nutzungsanalysen</strong> zur Überwachung, wie Ihre Benutzer mit der Plattform interagieren."
|
||||
wrapUp = "Das war die Admin-Tour! Sie haben die Enterprise-Funktionen gesehen, die Stirling PDF zu einer leistungsstarken, anpassbaren Lösung für Organisationen machen. Sie können diese Tour jederzeit über das <strong>Help</strong>-Menü aufrufen."
|
||||
|
||||
[workspace]
|
||||
title = "Arbeitsbereich"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Vertrieb kontaktieren"
|
||||
contactToUpgrade = "Kontaktieren Sie uns, um Ihren Plan zu upgraden oder anzupassen"
|
||||
maxUsers = "Max. Benutzer"
|
||||
upTo = "Bis zu"
|
||||
getLicense = "Server-Lizenz erhalten"
|
||||
upgradeToEnterprise = "Auf Enterprise upgraden"
|
||||
selectPeriod = "Abrechnungszeitraum auswählen"
|
||||
monthlyBilling = "Monatliche Abrechnung"
|
||||
yearlyBilling = "Jährliche Abrechnung"
|
||||
checkoutOpened = "Checkout geöffnet"
|
||||
checkoutInstructions = "Schließen Sie Ihren Kauf im Stripe-Tab ab. Kehren Sie danach hierher zurück und aktualisieren Sie die Seite, um Ihre Lizenz zu aktivieren. Sie erhalten außerdem eine E-Mail mit Ihrem Lizenzschlüssel."
|
||||
activateLicense = "Lizenz aktivieren"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout in neuem Tab geöffnet"
|
||||
instructions = "Schließen Sie den Kauf im Stripe-Tab ab. Nach Abschluss der Zahlung erhalten Sie eine E-Mail mit Ihrem Lizenzschlüssel."
|
||||
enterKey = "Geben Sie unten Ihren Lizenzschlüssel ein, um Ihren Plan zu aktivieren:"
|
||||
keyDescription = "Fügen Sie den Lizenzschlüssel aus Ihrer E-Mail ein"
|
||||
activate = "Lizenz aktivieren"
|
||||
doLater = "Ich mache das später"
|
||||
success = "Lizenz aktiviert!"
|
||||
successMessage = "Ihre Lizenz wurde erfolgreich aktiviert. Sie können dieses Fenster nun schließen."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "E-Mail-Verifizierung erforderlich"
|
||||
message = "Sie müssen Ihre E-Mail-Adresse im Stripe-Abrechnungsportal verifizieren. Prüfen Sie Ihre E-Mails auf einen Login-Link."
|
||||
|
||||
[plan.period]
|
||||
month = "Monat"
|
||||
@@ -6122,7 +5696,7 @@ emailInvalid = "Bitte geben Sie eine gültige E-Mail-Adresse ein"
|
||||
title = "E-Mail eingeben"
|
||||
description = "Wir verwenden diese, um Ihren Lizenzschlüssel und Belege zu senden."
|
||||
emailLabel = "E-Mail-Adresse"
|
||||
emailPlaceholder = "ihre@email.com"
|
||||
emailPlaceholder = "your@email.com"
|
||||
continue = "Weiter"
|
||||
modalTitle = "Loslegen – {{planName}}"
|
||||
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Audit-System nicht verfügbar"
|
||||
notAvailableMessage = "Das Audit-System ist nicht konfiguriert oder nicht verfügbar."
|
||||
disabled = "Audit-Protokollierung ist deaktiviert"
|
||||
disabledMessage = "Aktivieren Sie die Audit-Protokollierung in Ihrer Anwendungskonfiguration, um Systemereignisse nachzuverfolgen."
|
||||
enterpriseRequired = "Enterprise-Lizenz erforderlich"
|
||||
enterpriseRequiredMessage = "Das Audit-Protokollierungssystem ist eine Enterprise-Funktion. Bitte upgraden Sie auf eine Enterprise-Lizenz, um Audit-Logs und Analysen zu nutzen."
|
||||
|
||||
[audit.error]
|
||||
title = "Fehler beim Laden des Audit-Systems"
|
||||
@@ -6370,7 +5942,6 @@ description = "Geben Sie die vollständige URL Ihres selbst gehosteten Stirling
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Bitte eine Server-URL eingeben"
|
||||
invalidUrl = "Invalid URL format. Please enter a valid URL like https://your-server.com"
|
||||
unreachable = "Verbindung zum Server konnte nicht hergestellt werden"
|
||||
testFailed = "Verbindungstest fehlgeschlagen"
|
||||
configFetch = "Serverkonfiguration konnte nicht abgerufen werden. Bitte überprüfen Sie die URL und versuchen Sie es erneut."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Verbinden mit:"
|
||||
submit = "Anmelden"
|
||||
signInWith = "Anmelden mit"
|
||||
oauthPending = "Browser zur Authentifizierung wird geöffnet..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Oder mit E-Mail fortfahren"
|
||||
serverRequirement = "Hinweis: Auf dem Server muss die Anmeldung aktiviert sein."
|
||||
showInstructions = "Wie aktivieren?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Änderungen zurücksetzen"
|
||||
downloadJson = "JSON herunterladen"
|
||||
generatePdf = "PDF generieren"
|
||||
saveChanges = "Änderungen speichern"
|
||||
applyChanges = "Änderungen anwenden"
|
||||
downloadCopy = "Kopie herunterladen"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Text automatisch in Rahmen einpassen"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tipp: Halten Sie Strg (Cmd) oder Umschalt, um mehrere Textf
|
||||
title = "Bearbeiteten Text auf ein einzelnes PDF-Element fixieren"
|
||||
description = "Wenn aktiviert, exportiert der Editor jedes bearbeitete Textfeld als ein PDF-Textelement, um überlappende Glyphen oder gemischte Schriften zu vermeiden."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Advanced Settings"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Vorschau-Einschränkungen"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus auf Text und Bilder"
|
||||
text = "Dieser Arbeitsbereich konzentriert sich auf das Bearbeiten von Text und das Neupositionieren eingebetteter Bilder. Komplexe Seitengrafiken, Formular-Widgets und Ebenengrafiken bleiben für den Export erhalten, sind hier jedoch nicht vollständig bearbeitbar."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Abweichungen in der Vorschau"
|
||||
text = "Einige Darstellungen (z. B. Tabellenränder, Formen oder das Erscheinungsbild von Anmerkungen) werden in der Vorschau möglicherweise nicht exakt angezeigt. Die exportierte PDF behält die ursprünglichen Zeichenbefehle nach Möglichkeit bei."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha-Viewer"
|
||||
text = "Dieser Alpha-Viewer wird noch weiterentwickelt – bestimmte Schriftarten, Farben, Transparenzeffekte und Layoutdetails können leicht abweichen. Bitte prüfen Sie die erzeugte PDF vor dem Teilen."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Ausgewählte Felder zusammenführen"
|
||||
merge = "Auswahl zusammenführen"
|
||||
@@ -6614,58 +6164,3 @@ title = "Ergebnisse: Text hinzufügen"
|
||||
|
||||
[addText.error]
|
||||
failed = "Beim Hinzufügen von Text zum PDF ist ein Fehler aufgetreten."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Upload from Mobile"
|
||||
description = "Scan to upload photos. Images auto-convert to PDF."
|
||||
descriptionNoConvert = "Scan to upload photos from your mobile device."
|
||||
error = "Connection Error"
|
||||
pollingError = "Error checking for files"
|
||||
sessionId = "Session ID"
|
||||
sessionCreateError = "Failed to create session"
|
||||
expiryWarning = "Session Expiring Soon"
|
||||
expiryWarningMessage = "This QR code will expire in {{seconds}} seconds. A new code will be generated automatically."
|
||||
filesReceived = "{{count}} file(s) received"
|
||||
connected = "Mobile device connected"
|
||||
instructions = "Scan with your phone camera. Images convert to PDF automatically."
|
||||
instructionsNoConvert = "Scan with your phone camera to upload files."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobile Scanner"
|
||||
noSession = "Invalid Session"
|
||||
noSessionMessage = "Please scan a valid QR code to access this page."
|
||||
validating = "Validating session..."
|
||||
sessionInvalid = "Session Error"
|
||||
sessionExpired = "This session has expired. Please refresh and try again."
|
||||
sessionNotFound = "Session not found. Please refresh and try again."
|
||||
sessionValidationError = "Unable to verify session. Please try again."
|
||||
uploadSuccess = "Upload Successful!"
|
||||
uploadSuccessMessage = "Your images have been transferred."
|
||||
httpsRequired = "Camera access requires HTTPS or localhost. Please use HTTPS or access via localhost."
|
||||
uploadFailed = "Upload failed. Please try again."
|
||||
uploading = "Uploading..."
|
||||
connected = "Connected"
|
||||
connecting = "Connecting..."
|
||||
chooseMethod = "Choose Upload Method"
|
||||
chooseMethodDescription = "Select how you want to scan and upload documents"
|
||||
camera = "Camera"
|
||||
cameraDescription = "Scan documents using your device camera with automatic edge detection"
|
||||
fileUpload = "File Upload"
|
||||
fileDescription = "Upload existing photos or documents from your device"
|
||||
cameraAccessDenied = "Camera access denied. Please enable camera access."
|
||||
back = "Back"
|
||||
settings = "Settings"
|
||||
edgeDetection = "Edge Detection"
|
||||
flashlight = "Flashlight"
|
||||
flash = "Flash"
|
||||
processing = "Processing..."
|
||||
capture = "Capture Photo"
|
||||
selectFilesPrompt = "Select files to upload"
|
||||
selectImage = "Select Image"
|
||||
preview = "Preview"
|
||||
retake = "Retake"
|
||||
addToBatch = "Add to Batch"
|
||||
upload = "Upload"
|
||||
batchImages = "Batch"
|
||||
clearBatch = "Clear"
|
||||
uploadAll = "Upload All"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Έχετε μη αποθηκευμένες αλλαγές στο PDF σας."
|
||||
pendingRedactionsTitle = "Μη εφαρμοσμένες αποκρύψεις"
|
||||
pendingRedactions = "Έχετε μη εφαρμοσμένες αποκρύψεις που θα χαθούν."
|
||||
areYouSure = "Είστε βέβαιοι ότι θέλετε να αποχωρήσετε;"
|
||||
unsavedChangesTitle = "Μη αποθηκευμένες αλλαγές"
|
||||
keepWorking = "Συνέχεια εργασίας"
|
||||
discardChanges = "Απόρριψη & Έξοδος"
|
||||
discardRedactions = "Απόρριψη & Έξοδος"
|
||||
applyAndContinue = "Αποθήκευση & Έξοδος"
|
||||
exportAndContinue = "Εξαγωγή & Συνέχεια"
|
||||
cancel = "Άκυρο"
|
||||
@@ -295,7 +292,7 @@ help = "Βοήθεια Pipeline"
|
||||
scanHelp = "Βοήθεια σάρωσης φακέλων"
|
||||
deletePrompt = "Είστε βέβαιοι ότι θέλετε να διαγράψετε το pipeline;"
|
||||
tags = "αυτοματοποίηση,ακολουθία,προγραμματισμένο,επεξεργασία-παρτίδας"
|
||||
title = "Pipeline"
|
||||
title = "Ροή"
|
||||
|
||||
[pipelineOptions]
|
||||
header = "Διαμόρφωση Pipeline"
|
||||
@@ -304,7 +301,7 @@ saveSettings = "Αποθήκευση ρυθμίσεων λειτουργίας"
|
||||
pipelineNamePrompt = "Εισάγετε όνομα pipeline εδώ"
|
||||
selectOperation = "Επιλογή λειτουργίας"
|
||||
addOperationButton = "Προσθήκη λειτουργίας"
|
||||
pipelineHeader = "Pipeline:"
|
||||
pipelineHeader = "Ροή:"
|
||||
saveButton = "Λήψη"
|
||||
validateButton = "Επικύρωση"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Προχωρημένα"
|
||||
edit = "Προβολή & Επεξεργασία"
|
||||
popular = "Δημοφιλή"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Προτιμήσεις"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Ομάδες"
|
||||
title = "Διαμόρφωση"
|
||||
systemSettings = "Ρυθμίσεις συστήματος"
|
||||
features = "Δυνατότητες"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Σημεία τερματισμού"
|
||||
database = "Βάση δεδομένων"
|
||||
advanced = "Προχωρημένα"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Προχωρημένα"
|
||||
title = "Ασφάλεια & Αυθεντικοποίηση"
|
||||
security = "Ασφάλεια"
|
||||
connections = "Συνδέσεις"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Άδειες & Αναλύσεις"
|
||||
@@ -382,7 +374,7 @@ privacy = "Απόρρητο"
|
||||
|
||||
[settings.developer]
|
||||
title = "Προγραμματιστής"
|
||||
apiKeys = "API Keys"
|
||||
apiKeys = "Κλειδιά API"
|
||||
|
||||
[settings.tooltips]
|
||||
enableLoginFirst = "Ενεργοποιήστε πρώτα τη λειτουργία σύνδεσης"
|
||||
@@ -396,7 +388,7 @@ logout = "Αποσύνδεση"
|
||||
|
||||
[settings.connection.mode]
|
||||
saas = "Stirling Cloud"
|
||||
selfhosted = "Self-Hosted"
|
||||
selfhosted = "Αυτο-φιλοξενούμενο"
|
||||
|
||||
[settings.general]
|
||||
title = "Γενικά"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Τρέχουσα έκδοση"
|
||||
latestVersion = "Νεότερη έκδοση"
|
||||
checkForUpdates = "Έλεγχος για ενημερώσεις"
|
||||
viewDetails = "Προβολή λεπτομερειών"
|
||||
serverNeedsUpdate = "Ο διακομιστής πρέπει να ενημερωθεί από διαχειριστή"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Πληροφορίες έκδοσης"
|
||||
description = "Λεπτομέρειες έκδοσης για Desktop και διακομιστή"
|
||||
desktop = "Έκδοση Desktop"
|
||||
server = "Έκδοση διακομιστή"
|
||||
|
||||
[settings.security]
|
||||
title = "Ασφάλεια"
|
||||
description = "Ενημερώστε τον κωδικό σας για να διατηρήσετε τον λογαριασμό σας ασφαλή."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Αλλάξτε τον κωδικό σας. Θα αποσυνδεθείτε μετά την ενημέρωση."
|
||||
required = "Όλα τα πεδία είναι υποχρεωτικά."
|
||||
mismatch = "Οι νέοι κωδικοί δεν ταιριάζουν."
|
||||
error = "Αδυναμία ενημέρωσης κωδικού. Επαληθεύστε τον τρέχοντα κωδικό και δοκιμάστε ξανά."
|
||||
success = "Ο κωδικός ενημερώθηκε με επιτυχία. Συνδεθείτε ξανά."
|
||||
ssoDisabled = "Οι αλλαγές κωδικού διαχειρίζονται από τον πάροχο ταυτότητάς σας."
|
||||
current = "Τρέχων κωδικός"
|
||||
currentPlaceholder = "Εισαγάγετε τον τρέχοντα κωδικό"
|
||||
new = "Νέος κωδικός"
|
||||
newPlaceholder = "Εισαγάγετε νέο κωδικό"
|
||||
confirm = "Επιβεβαίωση νέου κωδικού"
|
||||
confirmPlaceholder = "Εισαγάγετε ξανά τον νέο κωδικό"
|
||||
update = "Ενημέρωση κωδικού"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Συντομεύσεις πληκτρολογίου"
|
||||
@@ -522,16 +488,11 @@ low = "Χαμηλή"
|
||||
title = "Αλλαγή διαπιστευτηρίων"
|
||||
header = "Ενημέρωση στοιχείων λογαριασμού"
|
||||
changePassword = "Χρησιμοποιείτε προεπιλεγμένα διαπιστευτήρια σύνδεσης. Παρακαλώ εισάγετε νέο κωδικό"
|
||||
ssoManaged = "Ο λογαριασμός σας διαχειρίζεται από τον πάροχο ταυτότητάς σας."
|
||||
newUsername = "Νέο όνομα χρήστη"
|
||||
oldPassword = "Τρέχων κωδικός"
|
||||
newPassword = "Νέος κωδικός"
|
||||
confirmNewPassword = "Επιβεβαίωση νέου κωδικού"
|
||||
submit = "Υποβολή αλλαγών"
|
||||
credsUpdated = "Ο λογαριασμός ενημερώθηκε"
|
||||
description = "Οι αλλαγές αποθηκεύτηκαν. Συνδεθείτε ξανά."
|
||||
error = "Αδυναμία ενημέρωσης ονόματος χρήστη. Επαληθεύστε τον κωδικό σας και δοκιμάστε ξανά."
|
||||
changeUsername = "Ενημερώστε το όνομα χρήστη σας. Θα αποσυνδεθείτε μετά την ενημέρωση."
|
||||
|
||||
[account]
|
||||
title = "Ρυθμίσεις λογαριασμού"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Ρυθμίσεις λογαριασμού"
|
||||
adminSettings = "Ρυθμίσεις διαχειριστή - Προβολή και προσθήκη χρηστών"
|
||||
userControlSettings = "Ρυθμίσεις ελέγχου χρηστών"
|
||||
changeUsername = "Αλλαγή ονόματος χρήστη"
|
||||
changeUsernameDescription = "Ενημερώστε το όνομα χρήστη σας. Θα αποσυνδεθείτε μετά την ενημέρωση."
|
||||
newUsernamePlaceholder = "Εισαγάγετε το νέο όνομα χρήστη"
|
||||
newUsername = "Νέο όνομα χρήστη"
|
||||
password = "Κωδικός επιβεβαίωσης"
|
||||
oldPassword = "Παλιός κωδικός"
|
||||
@@ -749,11 +708,6 @@ tags = "υπογραφή,αυτόγραφο"
|
||||
title = "Υπογραφή"
|
||||
desc = "Προσθήκη υπογραφής σε PDF με σχεδίαση, κείμενο ή εικόνα"
|
||||
|
||||
[home.annotate]
|
||||
tags = "σχολιασμός,επισήμανση,σχεδίαση"
|
||||
title = "Σχολιασμός"
|
||||
desc = "Επισημάνετε, σχεδιάστε, προσθέστε σημειώσεις και σχήματα στον προβολέα"
|
||||
|
||||
[home.flatten]
|
||||
tags = "απλοποίηση,αφαίρεση,διαδραστικό"
|
||||
title = "Ισοπέδωση"
|
||||
@@ -965,7 +919,7 @@ title = "Επικάλυψη PDF"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Επεξεργαστής κειμένου PDF"
|
||||
desc = "Επιθεωρήστε και επεξεργαστείτε εξαγωγές JSON του Stirling PDF με ομαδοποιημένη επεξεργασία κειμένου και αναδημιουργία PDF"
|
||||
desc = "Επεξεργαστείτε υπάρχον κείμενο και εικόνες μέσα σε αρχεία PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "κείμενο,σχολιασμός,ετικέτα"
|
||||
@@ -976,7 +930,6 @@ desc = "Προσθέστε προσαρμοσμένο κείμενο οπουδ
|
||||
addFiles = "Προσθήκη αρχείων"
|
||||
uploadFromComputer = "Μεταφόρτωση από υπολογιστή"
|
||||
openFromComputer = "Άνοιγμα από τον υπολογιστή"
|
||||
mobileUpload = "Μεταφόρτωση από κινητό"
|
||||
|
||||
[viewPdf]
|
||||
tags = "προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα"
|
||||
@@ -1228,7 +1181,7 @@ selectFilesPlaceholder = "Επιλέξτε αρχεία στην κύρια πρ
|
||||
settings = "Ρυθμίσεις"
|
||||
conversionCompleted = "Η μετατροπή ολοκληρώθηκε"
|
||||
results = "Αποτελέσματα"
|
||||
defaultFilename = "converted_file"
|
||||
defaultFilename = "μετατραπμένο_αρχείο"
|
||||
conversionResults = "Αποτελέσματα μετατροπής"
|
||||
convertFrom = "Μετατροπή από"
|
||||
convertTo = "Μετατροπή σε"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Επιλογές CBZ σε PDF"
|
||||
optimizeForEbook = "Βελτιστοποίηση PDF για συσκευές ανάγνωσης ebook (χρησιμοποιεί Ghostscript)"
|
||||
cbzOutputOptions = "Επιλογές PDF σε CBZ"
|
||||
cbzDpi = "DPI για απόδοση εικόνας"
|
||||
cbrOptions = "Επιλογές CBR"
|
||||
cbrOutputOptions = "Επιλογές PDF σε CBR"
|
||||
cbrDpi = "DPI για απόδοση εικόνων"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Επιλογές eBook σε PDF"
|
||||
ebookOptionsDesc = "Επιλογές μετατροπής eBook σε PDF"
|
||||
embedAllFonts = "Ενσωμάτωση όλων των γραμματοσειρών"
|
||||
embedAllFontsDesc = "Ενσωματώστε όλες τις γραμματοσειρές του eBook στο παραγόμενο PDF"
|
||||
includeTableOfContents = "Συμπερίληψη πίνακα περιεχομένων"
|
||||
includeTableOfContentsDesc = "Προσθήκη δημιουργημένου πίνακα περιεχομένων στο τελικό PDF"
|
||||
includePageNumbers = "Συμπερίληψη αριθμών σελίδων"
|
||||
includePageNumbersDesc = "Προσθέστε αριθμούς σελίδων στο παραγόμενο PDF"
|
||||
optimizeForEbookPdf = "Βελτιστοποίηση για συσκευές ανάγνωσης eBook"
|
||||
optimizeForEbookPdfDesc = "Βελτιστοποιήστε το PDF για ανάγνωση eBook (μικρότερο μέγεθος, καλύτερη απόδοση σε συσκευές eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Επιλογές PDF σε eBook"
|
||||
epubOptionsDesc = "Επιλογές μετατροπής PDF σε EPUB/AZW3"
|
||||
detectChapters = "Εντοπισμός κεφαλαίων"
|
||||
detectChaptersDesc = "Εντοπίστε επικεφαλίδες που μοιάζουν με κεφάλαια και εισαγάγετε αλλαγές σελίδας EPUB"
|
||||
targetDevice = "Συσκευή προορισμού"
|
||||
targetDeviceDesc = "Επιλέξτε προφίλ εξόδου βελτιστοποιημένο για τη συσκευή ανάγνωσης"
|
||||
outputFormat = "Μορφή εξόδου"
|
||||
outputFormatDesc = "Επιλέξτε τη μορφή εξόδου για το eBook"
|
||||
tabletPhone = "Tablet/Τηλέφωνο (με εικόνες)"
|
||||
kindleEink = "Kindle e-Ink (βελτιστοποιημένο για κείμενο)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "μετατροπή,εικόνα,jpg,φωτογραφία"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Προσθήκη συνημμένου"
|
||||
remove = "Αφαίρεση συνημμένου"
|
||||
embed = "Ενσωμάτωση συνημμένου"
|
||||
convertToPdfA3b = "Μετατροπή σε PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Δημιουργεί αρχειακό PDF με ενσωματωμένα συνημμένα"
|
||||
convertToPdfA3bTooltip = "Το PDF/A-3b είναι αρχειακή μορφή που εξασφαλίζει μακροχρόνια διατήρηση. Επιτρέπει την ενσωμάτωση οποιωνδήποτε μορφών αρχείων ως συνημμένα. Η μετατροπή απαιτεί το Ghostscript και μπορεί να διαρκέσει περισσότερο για μεγάλα αρχεία."
|
||||
convertToPdfA3bTooltipHeader = "Σχετικά με τη μετατροπή σε PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Τι κάνει"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1447,7 +1368,7 @@ title = "Προσθήκη υδατογραφήματος"
|
||||
desc = "Προσθέστε υδατογραφήματα κειμένου ή εικόνας σε αρχεία PDF"
|
||||
completed = "Το υδατογράφημα προστέθηκε"
|
||||
submit = "Προσθήκη υδατογραφήματος"
|
||||
filenamePrefix = "watermarked"
|
||||
filenamePrefix = "υδατογραφημένο"
|
||||
|
||||
[watermark.error]
|
||||
failed = "Παρουσιάστηκε σφάλμα κατά την προσθήκη υδατογραφήματος στο PDF."
|
||||
@@ -2385,10 +2306,6 @@ saved = "Αποθηκευμένες"
|
||||
label = "Μεταφορτώστε εικόνα υπογραφής"
|
||||
placeholder = "Επιλέξτε αρχείο εικόνας"
|
||||
hint = "Μεταφορτώστε εικόνα PNG ή JPG της υπογραφής σας"
|
||||
removeBackground = "Αφαίρεση λευκού φόντου (διαφάνεια)"
|
||||
processing = "Επεξεργασία εικόνας..."
|
||||
backgroundRemovalFailedTitle = "Αποτυχία αφαίρεσης φόντου"
|
||||
backgroundRemovalFailedMessage = "Αδυναμία αφαίρεσης φόντου από την εικόνα. Χρήση της αρχικής εικόνας."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Πώς να προσθέσετε υπογραφή"
|
||||
@@ -2434,11 +2351,6 @@ note = "Η επιπέδωση αφαιρεί διαδραστικά στοιχε
|
||||
label = "Ισοπέδωση μόνο φορμών"
|
||||
desc = "Επιπέδωση μόνο πεδίων φόρμας, αφήνοντας τα υπόλοιπα διαδραστικά στοιχεία ανέπαφα"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI απόδοσης (προαιρετικό, προτείνεται 150 DPI)"
|
||||
help = "Αφήστε κενό για χρήση της προεπιλογής συστήματος. Υψηλότερο DPI βελτιώνει την ευκρίνεια αλλά αυξάνει τον χρόνο επεξεργασίας και το μέγεθος αρχείου."
|
||||
placeholder = "π.χ. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Αποτελέσματα επιπέδωσης"
|
||||
|
||||
@@ -2805,7 +2717,7 @@ header = "Αφαίρεση της ψηφιακής υπογραφής από τ
|
||||
selectPDF = "Επιλέξτε ένα αρχείο PDF:"
|
||||
submit = "Αφαίρεση υπογραφής"
|
||||
description = "Αυτό το εργαλείο θα αφαιρέσει τις υπογραφές ψηφιακού πιστοποιητικού από το PDF σας."
|
||||
filenamePrefix = "unsigned"
|
||||
filenamePrefix = "ανυπόγραφο"
|
||||
|
||||
[removeCertSign.files]
|
||||
placeholder = "Επιλέξτε ένα αρχείο PDF στην κύρια προβολή για να ξεκινήσετε"
|
||||
@@ -3013,7 +2925,6 @@ header = "Περικοπή PDF"
|
||||
submit = "Υποβολή"
|
||||
noFileSelected = "Επιλέξτε ένα αρχείο PDF για να ξεκινήσετε την περικοπή"
|
||||
reset = "Επαναφορά σε πλήρες PDF"
|
||||
autoCrop = "Αυτόματη περικοπή κενού"
|
||||
|
||||
[crop.preview]
|
||||
title = "Επιλογή περιοχής περικοπής"
|
||||
@@ -3244,7 +3155,6 @@ title = "Μέθοδος απόκρυψης"
|
||||
mode = "Λειτουργία"
|
||||
automatic = "Αυτόματη"
|
||||
automaticDesc = "Απόκρυψη κειμένου βάσει όρων αναζήτησης"
|
||||
automaticDisabledTooltip = "Επιλέξτε αρχεία στη διαχείριση αρχείων για απόκρυψη σε πολλά αρχεία ταυτόχρονα"
|
||||
manual = "Χειροκίνητη"
|
||||
manualDesc = "Κάντε κλικ και σύρετε για να αποκρύψετε συγκεκριμένες περιοχές"
|
||||
manualComingSoon = "Η χειροκίνητη απόκρυψη σύντομα διαθέσιμη"
|
||||
@@ -3315,35 +3225,8 @@ text = "Ταιριάζει μόνο πλήρεις λέξεις, όχι μερι
|
||||
title = "Μετατροπή σε PDF-Image"
|
||||
text = "Μετατρέπει το PDF σε PDF βασισμένο σε εικόνα μετά την απόκρυψη. Αυτό διασφαλίζει ότι το κείμενο πίσω από τα πλαίσια απόκρυψης αφαιρείται πλήρως και δεν είναι ανακτήσιμο."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Χειροκίνητα χειριστήρια απόκρυψης"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Εργαλείο σήμανσης κειμένου"
|
||||
text = "Επιλέξτε κείμενο απευθείας στο PDF για να το σημάνετε προς απόκρυψη. Κάντε κλικ και σύρετε για να επισημάνετε συγκεκριμένο κείμενο που θέλετε να αποκρύψετε."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Εργαλείο σήμανσης περιοχής"
|
||||
text = "Σχεδιάστε ορθογώνιες περιοχές στο PDF για να σημάνετε τμήματα προς απόκρυψη. Χρήσιμο για απόκρυψη εικόνων, υπογραφών ή ακανόνιστων σχημάτων."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Εφαρμογή αποκρύψεων"
|
||||
text = "Αφού σημάνετε περιεχόμενο, κάντε κλικ στην «Εφαρμογή» για μόνιμη απόκρυψη όλων των σημειωμένων περιοχών. Ο μετρητής σε αναμονή δείχνει πόσες αποκρύψεις είναι έτοιμες για εφαρμογή."
|
||||
bullet1 = "Σημάνετε όσες περιοχές χρειάζονται πριν την εφαρμογή"
|
||||
bullet2 = "Όλες οι εκκρεμείς αποκρύψεις εφαρμόζονται ταυτόχρονα"
|
||||
bullet3 = "Οι αποκρύψεις δεν μπορούν να αναιρεθούν μετά την εφαρμογή"
|
||||
|
||||
[redact.manual]
|
||||
title = "Εργαλεία απόκρυψης"
|
||||
instructions = "Επιλέξτε κείμενο ή σχεδιάστε περιοχές στο PDF για να σημάνετε περιεχόμενο προς απόκρυψη."
|
||||
markText = "Σήμανση κειμένου"
|
||||
markArea = "Σήμανση περιοχής"
|
||||
pendingLabel = "Σε αναμονή:"
|
||||
applyWarning = "⚠️ Μόνιμη εφαρμογή, δεν μπορεί να αναιρεθεί και τα υποκείμενα δεδομένα θα διαγραφούν"
|
||||
apply = "Εφαρμογή"
|
||||
noMarks = "Καμία σήμανση απόκρυψης. Χρησιμοποιήστε τα παραπάνω εργαλεία για να σημάνετε περιεχόμενο προς απόκρυψη."
|
||||
header = "Χειροκίνητη απόκρυψη"
|
||||
controlsTitle = "Χειροκίνητα χειριστήρια απόκρυψης"
|
||||
textBasedRedaction = "Απόκρυψη βάσει κειμένου"
|
||||
pageBasedRedaction = "Απόκρυψη βάσει σελίδας"
|
||||
convertPDFToImageLabel = "Μετατροπή PDF σε PDF-Image (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Εισάγετε αριθμό οριζόντιων διαιρέσ
|
||||
label = "Κάθετες διαιρέσεις"
|
||||
placeholder = "Εισάγετε αριθμό κάθετων διαιρέσεων"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Λειτουργία διαχωρισμού"
|
||||
description = "Επιλέξτε πώς να διαχωρίσετε τις σελίδες"
|
||||
splitAll = "Διαχωρισμός όλων των σελίδων"
|
||||
splitAllExceptFirst = "Διαχωρισμός όλων εκτός της πρώτης"
|
||||
splitAllExceptLast = "Διαχωρισμός όλων εκτός της τελευταίας"
|
||||
splitAllExceptFirstAndLast = "Διαχωρισμός όλων εκτός της πρώτης και της τελευταίας"
|
||||
custom = "Προσαρμοσμένες σελίδες"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Προσαρμοσμένοι αριθμοί σελίδων"
|
||||
placeholder = "π.χ. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "σφραγίδα,προσθήκη εικόνας,κεντράρισμα εικόνας,υδατογράφημα,PDF,ενσωμάτωση,προσαρμογή"
|
||||
header = "Σφράγισμα PDF"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDF σε μία σελίδα"
|
||||
header = "PDF σε μία σελίδα"
|
||||
submit = "Μετατροπή σε μία σελίδα"
|
||||
description = "Αυτό το εργαλείο θα συγχωνεύσει όλες τις σελίδες του PDF σας σε μία μεγάλη ενιαία σελίδα. Το πλάτος θα παραμείνει ίδιο με των αρχικών σελίδων, αλλά το ύψος θα είναι το άθροισμα όλων των υψών."
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "μονοσέλιδο"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Επιλέξτε ένα αρχείο PDF στην κύρια προβολή για να ξεκινήσετε"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Μέγεθος αρχείου"
|
||||
[compress.grayscale]
|
||||
label = "Εφαρμογή κλίμακας του γκρι για συμπίεση"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Γραμμικοποίηση PDF για ταχεία προβολή στον ιστό"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Μετατροπή εικόνων σε γραμμικό σχέδιο"
|
||||
description = "Χρησιμοποιεί το ImageMagick για να μειώσει τις σελίδες σε ασπρόμαυρο υψηλής αντίθεσης για μέγιστη μείωση μεγέθους."
|
||||
unavailable = "Το ImageMagick δεν είναι εγκατεστημένο ή ενεργοποιημένο σε αυτόν τον διακομιστή"
|
||||
detailLevel = "Επίπεδο λεπτομέρειας"
|
||||
edgeEmphasis = "Έμφαση ακμών"
|
||||
edgeLow = "Ήπια"
|
||||
edgeMedium = "Ισορροπημένη"
|
||||
edgeHigh = "Ισχυρή"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Επισκόπηση ρυθμίσεων συμπίεσης"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Οι υψηλές τιμές μειώνουν το μέγεθος α
|
||||
title = "Κλίμακα του γκρι"
|
||||
text = "Επιλέξτε αυτήν την επιλογή για να μετατρέψετε όλες τις εικόνες σε ασπρόμαυρες, κάτι που μπορεί να μειώσει σημαντικά το μέγεθος αρχείου ειδικά για σαρωμένα PDF ή έγγραφα με πολλές εικόνες."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Γραμμικό σχέδιο"
|
||||
text = "Μετατρέψτε σελίδες σε ασπρόμαυρο υψηλής αντίθεσης με χρήση του ImageMagick. Χρησιμοποιήστε το επίπεδο λεπτομέρειας για να ελέγξετε πόσο περιεχόμενο γίνεται μαύρο και την έμφαση ακμών για να ελέγξετε πόσο επιθετικά εντοπίζονται οι ακμές."
|
||||
|
||||
[compress.error]
|
||||
failed = "Παρουσιάστηκε σφάλμα κατά τη συμπίεση του PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Παρουσιάστηκε σφάλμα κατά τη συμπίεση
|
||||
_value = "Ρυθμίσεις συμπίεσης"
|
||||
1 = "1-3 συμπίεση PDF,</br> 4-6 ελαφριά συμπίεση εικόνας,</br> 7-9 έντονη συμπίεση εικόνας Θα μειώσει δραστικά την ποιότητα εικόνας"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Χαμηλότερες τιμές διατηρούν την ποιότητα αλλά οδηγούν σε μεγαλύτερα αρχεία"
|
||||
range4to6 = "Μεσαία συμπίεση με μέτρια μείωση ποιότητας"
|
||||
range7to9 = "Υψηλότερες τιμές μειώνουν σημαντικά το μέγεθος αρχείου αλλά μπορεί να μειώσουν την ευκρίνεια εικόνας"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Αυτό το αρχείο προστατεύεται με κωδικό πρόσβασης. Παρακαλώ εισάγετε τον κωδικό:"
|
||||
cancelled = "Η λειτουργία ακυρώθηκε για το PDF: {0}"
|
||||
@@ -4027,7 +3875,7 @@ version = "Τρέχουσα έκδοση"
|
||||
title = "Τεκμηρίωση API"
|
||||
header = "Τεκμηρίωση API"
|
||||
desc = "Προβάλετε και δοκιμάστε τα endpoints του Stirling PDF API"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,τεκμηρίωση,swagger,τελικά σημεία,ανάπτυξη"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Πώς χρησιμοποιούμε τα cookies"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Διαγραφή επιλεγμένων σελίδων"
|
||||
closePdf = "Κλείσιμο PDF"
|
||||
exportAll = "Εξαγωγή PDF"
|
||||
downloadSelected = "Λήψη επιλεγμένων αρχείων"
|
||||
annotations = "Σχολιασμοί"
|
||||
exportSelected = "Εξαγωγή επιλεγμένων σελίδων"
|
||||
saveChanges = "Αποθήκευση αλλαγών"
|
||||
downloadAll = "Λήψη όλων"
|
||||
saveAll = "Αποθήκευση όλων"
|
||||
toggleTheme = "Εναλλαγή θέματος"
|
||||
toggleBookmarks = "Εναλλαγή σελιδοδεικτών"
|
||||
language = "Γλώσσα"
|
||||
toggleAnnotations = "Εναλλαγή ορατότητας σχολιασμών"
|
||||
search = "Αναζήτηση PDF"
|
||||
panMode = "Λειτουργία μετακίνησης"
|
||||
applyRedactionsFirst = "Εφαρμόστε πρώτα τις αποκρύψεις"
|
||||
rotateLeft = "Περιστροφή αριστερά"
|
||||
rotateRight = "Περιστροφή δεξιά"
|
||||
toggleSidebar = "Εναλλαγή πλευρικής γραμμής"
|
||||
toggleBookmarks = "Εναλλαγή σελιδοδεικτών"
|
||||
exportSelected = "Εξαγωγή επιλεγμένων σελίδων"
|
||||
toggleAnnotations = "Εναλλαγή ορατότητας σχολιασμών"
|
||||
annotationMode = "Εναλλαγή λειτουργίας σχολιασμού"
|
||||
print = "Εκτύπωση PDF"
|
||||
draw = "Σχεδίαση"
|
||||
redact = "Απόκρυψη"
|
||||
exitRedaction = "Έξοδος από λειτουργία απόκρυψης"
|
||||
save = "Αποθήκευση"
|
||||
downloadAll = "Λήψη όλων"
|
||||
saveAll = "Αποθήκευση όλων"
|
||||
|
||||
[textAlign]
|
||||
left = "Αριστερά"
|
||||
center = "Κέντρο"
|
||||
right = "Δεξιά"
|
||||
|
||||
[annotation]
|
||||
title = "Σχολιασμός"
|
||||
desc = "Χρησιμοποιήστε επισήμανση, πένα, κείμενο και σημειώσεις. Οι αλλαγές παραμένουν ενεργές—δεν απαιτείται επίπεδωση."
|
||||
highlight = "Επισήμανση"
|
||||
pen = "Πένα"
|
||||
text = "Πλαίσιο κειμένου"
|
||||
note = "Σημείωση"
|
||||
rectangle = "Ορθογώνιο"
|
||||
ellipse = "Έλλειψη"
|
||||
select = "Επιλογή"
|
||||
exit = "Έξοδος από λειτουργία σχολιασμού"
|
||||
strokeWidth = "Πλάτος"
|
||||
opacity = "Αδιαφάνεια"
|
||||
strokeOpacity = "Αδιαφάνεια περιγράμματος"
|
||||
fillOpacity = "Αδιαφάνεια γεμίσματος"
|
||||
fontSize = "Μέγεθος γραμματοσειράς"
|
||||
chooseColor = "Επιλογή χρώματος"
|
||||
color = "Χρώμα"
|
||||
strokeColor = "Χρώμα περιγράμματος"
|
||||
fillColor = "Χρώμα γεμίσματος"
|
||||
underline = "Υπογράμμιση"
|
||||
strikeout = "Διακριτή διαγραφή"
|
||||
squiggly = "Κυματιστό"
|
||||
inkHighlighter = "Ελεύθερη επισήμανση"
|
||||
freehandHighlighter = "Ελεύθερη επισήμανση"
|
||||
square = "Τετράγωνο"
|
||||
circle = "Κύκλος"
|
||||
polygon = "Πολύγωνο"
|
||||
line = "Γραμμή"
|
||||
stamp = "Προσθήκη εικόνας"
|
||||
textMarkup = "Επισημάνσεις κειμένου"
|
||||
drawing = "Σχεδίαση"
|
||||
shapes = "Σχήματα"
|
||||
notesStamps = "Σημειώσεις & Σφραγίδες"
|
||||
settings = "Ρυθμίσεις"
|
||||
borderOn = "Περίγραμμα: Ενεργό"
|
||||
borderOff = "Περίγραμμα: Ανενεργό"
|
||||
editInk = "Επεξεργασία πένας"
|
||||
editLine = "Επεξεργασία γραμμής"
|
||||
editNote = "Επεξεργασία σημείωσης"
|
||||
editText = "Επεξεργασία πλαισίου κειμένου"
|
||||
editTextMarkup = "Επεξεργασία επισημάνσεων κειμένου"
|
||||
editSelected = "Επεξεργασία σχολιασμού"
|
||||
editSquare = "Επεξεργασία τετραγώνου"
|
||||
editCircle = "Επεξεργασία κύκλου"
|
||||
editPolygon = "Επεξεργασία πολυγώνου"
|
||||
unsupportedType = "Αυτός ο τύπος σχολιασμού δεν υποστηρίζεται πλήρως για επεξεργασία."
|
||||
textAlignment = "Στοίχιση κειμένου"
|
||||
noteIcon = "Εικονίδιο σημείωσης"
|
||||
imagePreview = "Προεπισκόπηση"
|
||||
contents = "Κείμενο"
|
||||
backgroundColor = "Χρώμα φόντου"
|
||||
clearBackground = "Αφαίρεση φόντου"
|
||||
noBackground = "Χωρίς φόντο"
|
||||
stampSettings = "Ρυθμίσεις σφραγίδας"
|
||||
savingCopy = "Προετοιμασία λήψης..."
|
||||
saveFailed = "Αδυναμία αποθήκευσης αντιγράφου"
|
||||
saveReady = "Έτοιμο για λήψη"
|
||||
selectAndMove = "Επιλογή και επεξεργασία"
|
||||
editSelectDescription = "Κάντε κλικ σε υπάρχον σχολιασμό για να επεξεργαστείτε το χρώμα, την αδιαφάνεια, το κείμενο ή το μέγεθός του."
|
||||
editStampHint = "Για να αλλάξετε την εικόνα, διαγράψτε αυτή τη σφραγίδα και προσθέστε μία νέα."
|
||||
editSwitchToSelect = "Μεταβείτε σε «Επιλογή & επεξεργασία» για να επεξεργαστείτε αυτόν τον σχολιασμό."
|
||||
undo = "Αναίρεση"
|
||||
redo = "Επανάληψη"
|
||||
applyChanges = "Εφαρμογή αλλαγών"
|
||||
saveChanges = "Αποθήκευση αλλαγών"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Ρυθμ."
|
||||
adminSettings = "Ρυθμ. διαχ."
|
||||
allTools = "All Tools"
|
||||
reader = "Ανάγνωση"
|
||||
tours = "Ξεναγήσεις"
|
||||
showMeAround = "Ξενάγηση"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Δείτε εδώ παρουσιάσεις: ξενάγηση εργαλείων, ξενάγηση νέας διάταξης V2 και ξενάγηση διαχειριστή."
|
||||
user = "Δείτε εδώ παρουσιάσεις: ξενάγηση εργαλείων και ξενάγηση νέας διάταξης V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Ξενάγηση στα εργαλεία"
|
||||
toolsTourDesc = "Μάθετε τι μπορούν να κάνουν τα εργαλεία"
|
||||
adminTour = "Ξενάγηση διαχειριστή"
|
||||
adminTourDesc = "Εξερευνήστε τις ρυθμίσεις και τις δυνατότητες διαχειριστή"
|
||||
whatsNewTour = "Δείτε τι νέο υπάρχει στο V2"
|
||||
whatsNewTourDesc = "Ξεναγηθείτε στη νέα διάταξη"
|
||||
|
||||
[admin]
|
||||
error = "Σφάλμα"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Αποτυχία φόρτωσης ρυθμίσεων"
|
||||
saveError = "Αποτυχία αποθήκευσης ρυθμίσεων"
|
||||
saved = "Οι ρυθμίσεις αποθηκεύτηκαν με επιτυχία"
|
||||
saveSuccess = "Οι ρυθμίσεις αποθηκεύτηκαν με επιτυχία"
|
||||
success = "Οι ρυθμίσεις αποθηκεύτηκαν με επιτυχία"
|
||||
error = "Αποτυχία αποθήκευσης ρυθμίσεων"
|
||||
save = "Αποθήκευση αλλαγών"
|
||||
discard = "Απόρριψη"
|
||||
restartRequired = "Απαιτείται επανεκκίνηση"
|
||||
@@ -4422,13 +4185,6 @@ description = "Διαδρομή προς το εκτελέσιμο WeasyPrint γ
|
||||
label = "Εκτελέσιμο Unoconvert"
|
||||
description = "Διαδρομή προς το LibreOffice unoconvert για μετατροπές εγγράφων (αφήστε κενό για προεπιλογή: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Βασικό URL για το frontend (π.χ., https://pdf.example.com). Χρησιμοποιείται για συνδέσμους πρόσκλησης email και μεταφορές μέσω QR από κινητό. Αφήστε κενό για χρήση του backend URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Κάντε κλικ για προβολή λεπτομερειών πλάνου"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Ασφάλεια"
|
||||
description = "Ρυθμίστε τον έλεγχο ταυτότητας, τη συμπεριφορά σύνδεσης και τις πολιτικές ασφάλειας."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Σύνδεση"
|
||||
disconnect = "Αποσύνδεση"
|
||||
disconnected = "Ο πάροχος αποσυνδέθηκε με επιτυχία"
|
||||
disconnectError = "Αποτυχία αποσύνδεσης παρόχου"
|
||||
mobileScannerConvertToPdf = "Μετατροπή εικόνων σε PDF"
|
||||
mobileScannerConvertToPdfDesc = "Αυτόματη μετατροπή των μεταφορτωμένων εικόνων σε μορφή PDF. Αν απενεργοποιηθεί, οι εικόνες θα παραμείνουν ως έχουν."
|
||||
mobileScannerImageResolution = "Ανάλυση εικόνας"
|
||||
mobileScannerImageResolutionDesc = "Ανάλυση των μεταφορτωμένων εικόνων. Το «Μειωμένη» κλιμακώνει τις εικόνες έως 1200px για μείωση μεγέθους."
|
||||
imageResolutionFull = "Πλήρης (Αρχικό μέγεθος)"
|
||||
imageResolutionReduced = "Μειωμένη (Μέχρι 1200px)"
|
||||
mobileScannerPageFormat = "Μορφή σελίδας"
|
||||
mobileScannerPageFormatDesc = "Μέγεθος σελίδας PDF για τις μετατρεπόμενες εικόνες. Το «Διατήρηση» χρησιμοποιεί τις αρχικές διαστάσεις της εικόνας."
|
||||
pageFormatKeep = "Διατήρηση (Αρχικές διαστάσεις)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Προσαρμογή με τέντωμα"
|
||||
mobileScannerStretchToFitDesc = "Τεντώστε τις εικόνες ώστε να καλύπτουν όλη τη σελίδα. Αν απενεργοποιηθεί, οι εικόνες κεντράρονται με διατήρηση αναλογιών."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Αυτόματη σύνδεση SSO"
|
||||
@@ -4600,11 +4343,11 @@ label = "URL εκδότη"
|
||||
description = "Το URL εκδότη του παρόχου OAuth2"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "Αναγνωριστικό πελάτη (Client ID)"
|
||||
description = "Το Client ID OAuth2 από τον πάροχό σας"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "Μυστικό πελάτη (Client Secret)"
|
||||
description = "Το Client Secret OAuth2 από τον πάροχό σας"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4646,122 +4389,6 @@ description = "Αυτόματη δημιουργία λογαριασμών χρ
|
||||
label = "Αποκλεισμός εγγραφής"
|
||||
description = "Αποτροπή εγγραφής νέων χρηστών μέσω SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Μεταφόρτωση από κινητό"
|
||||
enable = "Ενεργοποίηση μεταφόρτωσης μέσω QR code"
|
||||
description = "Επιτρέψτε στους χρήστες να μεταφορτώνουν αρχεία από κινητές συσκευές σαρώνοντας έναν κωδικό QR"
|
||||
note = "Σημείωση: Απαιτείται ρύθμιση του Frontend URL. "
|
||||
link = "Ρύθμιση στις Ρυθμίσεις Συστήματος"
|
||||
mobileScannerConvertToPdf = "Μετατροπή εικόνων σε PDF"
|
||||
mobileScannerConvertToPdfDesc = "Αυτόματη μετατροπή των μεταφορτωμένων εικόνων σε μορφή PDF. Αν απενεργοποιηθεί, οι εικόνες θα παραμείνουν ως έχουν."
|
||||
mobileScannerImageResolution = "Ανάλυση εικόνας"
|
||||
mobileScannerImageResolutionDesc = "Ανάλυση των μεταφορτωμένων εικόνων. Το «Μειωμένη» κλιμακώνει τις εικόνες έως 1200px για μείωση μεγέθους."
|
||||
imageResolutionFull = "Πλήρης (Αρχικό μέγεθος)"
|
||||
imageResolutionReduced = "Μειωμένη (Μέχρι 1200px)"
|
||||
mobileScannerPageFormat = "Μορφή σελίδας"
|
||||
mobileScannerPageFormatDesc = "Μέγεθος σελίδας PDF για τις μετατρεπόμενες εικόνες. Το «Διατήρηση» χρησιμοποιεί τις αρχικές διαστάσεις της εικόνας."
|
||||
pageFormatKeep = "Διατήρηση (Αρχικές διαστάσεις)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Προσαρμογή με τέντωμα"
|
||||
mobileScannerStretchToFitDesc = "Τεντώστε τις εικόνες ώστε να καλύπτουν όλη τη σελίδα. Αν απενεργοποιηθεί, οι εικόνες κεντράρονται με διατήρηση αναλογιών."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot του Telegram"
|
||||
description = "Ρυθμίστε τη συνδεσιμότητα του bot Telegram, τους ελέγχους πρόσβασης και τα μηνύματα ανατροφοδότησης."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Ενεργοποίηση bot Telegram"
|
||||
description = "Επιτρέψτε στους χρήστες να αλληλεπιδρούν με το Stirling PDF μέσω του ρυθμισμένου bot Telegram."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Όνομα χρήστη bot"
|
||||
description = "Το δημόσιο όνομα χρήστη του bot σας στο Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Διακριτικό bot"
|
||||
description = "API token που παρέχεται από το BotFather για το bot σας στο Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Φάκελος εισερχομένων"
|
||||
description = "Φάκελος κάτω από τον κατάλογο pipeline όπου αποθηκεύονται τα εισερχόμενα αρχεία Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Χρήση προσαρμοσμένου επιθέματος φακέλου"
|
||||
description = "Προσθέστε το chat ID στους φακέλους εισερχόμενων για να απομονώνονται οι μεταφορτώσεις ανά συνομιλία."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Έλεγχος πρόσβασης"
|
||||
description = "Περιορίστε ποιοι χρήστες ή κανάλια μπορούν να αλληλεπιδρούν με το bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Να επιτρέπονται συγκεκριμένα User ID"
|
||||
description = "Όταν είναι ενεργό, μόνο τα αναφερόμενα User ID μπορούν να χρησιμοποιούν το bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Επιτρεπόμενα User ID"
|
||||
description = "Εισαγάγετε Telegram user ID που επιτρέπεται να αλληλεπιδρούν με το bot."
|
||||
placeholder = "Προσθέστε user ID και πατήστε Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Να επιτρέπονται συγκεκριμένα Channel ID"
|
||||
description = "Όταν είναι ενεργό, μόνο τα αναφερόμενα Channel ID μπορούν να χρησιμοποιούν το bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Επιτρεπόμενα Channel ID"
|
||||
description = "Εισαγάγετε Telegram channel ID που επιτρέπεται να αλληλεπιδρούν με το bot."
|
||||
placeholder = "Προσθέστε channel ID και πατήστε Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Επεξεργασία"
|
||||
description = "Ρυθμίστε τα διαστήματα polling και τα χρονικά όρια επεξεργασίας για μεταφορτώσεις από Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Χρονικό όριο επεξεργασίας (δευτ.)"
|
||||
description = "Μέγιστος χρόνος αναμονής επεξεργασίας πριν αναφερθεί σφάλμα."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Διάστημα polling (ms)"
|
||||
description = "Διάστημα μεταξύ ελέγχων για νέες ενημερώσεις του Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Μηνύματα ανατροφοδότησης"
|
||||
description = "Επιλέξτε πότε το bot θα στέλνει ανατροφοδότηση σε χρήστες και κανάλια."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Ενεργοποίηση ανατροφοδότησης"
|
||||
description = "Ρυθμίστε αν το bot θα στέλνει καθόλου μηνύματα ανατροφοδότησης."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Κανόνες ανατροφοδότησης καναλιού"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Εμφάνιση \"No valid document\" (Κανάλι)"
|
||||
description = "Καταστολή της απάντησης no valid document για μεταφορτώσεις καναλιού."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Εμφάνιση σφαλμάτων επεξεργασίας (Κανάλι)"
|
||||
description = "Αποστολή μηνυμάτων σφαλμάτων επεξεργασίας στα κανάλια."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Εμφάνιση μηνυμάτων σφάλματος (Κανάλι)"
|
||||
description = "Εμφάνιση αναλυτικών μηνυμάτων σφάλματος για τα κανάλια."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Κανόνες ανατροφοδότησης χρήστη"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Εμφάνιση \"No valid document\" (Χρήστης)"
|
||||
description = "Καταστολή της απάντησης no valid document για μεταφορτώσεις χρηστών."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Εμφάνιση σφαλμάτων επεξεργασίας (Χρήστης)"
|
||||
description = "Αποστολή μηνυμάτων σφαλμάτων επεξεργασίας στους χρήστες."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Εμφάνιση μηνυμάτων σφάλματος (Χρήστης)"
|
||||
description = "Εμφάνιση αναλυτικών μηνυμάτων σφάλματος για τους χρήστες."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Βάση δεδομένων"
|
||||
description = "Ρυθμίστε προσαρμοσμένες ρυθμίσεις σύνδεσης βάσης δεδομένων για επιχειρησιακές εγκαταστάσεις."
|
||||
@@ -4940,13 +4567,9 @@ label = "Ενεργοποίηση προσκλήσεων μέσω email"
|
||||
description = "Να επιτρέπεται στους διαχειριστές να προσκαλούν χρήστες μέσω email με αυτόματα παραγόμενους κωδικούς"
|
||||
|
||||
[admin.settings.mail.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
label = "URL front-end"
|
||||
description = "Βασικό URL για το frontend (π.χ. https://pdf.example.com). Χρησιμοποιείται για τη δημιουργία συνδέσμων πρόσκλησης στα email. Αφήστε κενό για χρήση του backend URL."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Σημείωση: Απαιτείται ρύθμιση του Frontend URL. "
|
||||
link = "Ρύθμιση στις Ρυθμίσεις Συστήματος"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Νομικά έγγραφα"
|
||||
description = "Ρυθμίστε συνδέσμους προς νομικά έγγραφα και πολιτικές."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Τα αρχεία μου"
|
||||
noRecentFiles = "Δεν βρέθηκαν πρόσφατα αρχεία"
|
||||
googleDriveNotAvailable = "Η ενσωμάτωση με το Google Drive δεν είναι διαθέσιμη"
|
||||
mobileUpload = "Μεταφόρτωση από κινητό"
|
||||
mobileShort = "Κινητό"
|
||||
mobileUploadNotAvailable = "Η μεταφόρτωση από κινητό δεν είναι ενεργή"
|
||||
downloadSelected = "Λήψη επιλεγμένων"
|
||||
saveSelected = "Αποθήκευση επιλεγμένων"
|
||||
openFiles = "Άνοιγμα αρχείων"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Φόρτωση..."
|
||||
back = "Πίσω"
|
||||
continue = "Συνέχεια"
|
||||
error = "Σφάλμα"
|
||||
save = "Αποθήκευση"
|
||||
|
||||
[config.overview]
|
||||
title = "Ρυθμίσεις εφαρμογής"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Οποιαδήποτε εφαρμογή ή υπηρεσία χρησι
|
||||
confirmPrompt = "Είστε βέβαιοι ότι θέλετε να συνεχίσετε;"
|
||||
confirmCta = "Ανανέωση κλειδιών"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Σφάλμα κλειδιού API"
|
||||
failedToCreateApiKey = "Αποτυχία δημιουργίας κλειδιού API."
|
||||
failedToRetrieveApiKey = "Αποτυχία ανάκτησης κλειδιού API από την απόκριση."
|
||||
failedToFetchApiKey = "Αποτυχία λήψης κλειδιού API."
|
||||
apiKeyRefreshed = "Το κλειδί API ανανεώθηκε"
|
||||
apiKeyRefreshedBody = "Το κλειδί API ανανεώθηκε με επιτυχία."
|
||||
failedToRefreshApiKey = "Αποτυχία ανανέωσης κλειδιού API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Επιλογή συνημμένων"
|
||||
info = "Επιλέξτε αρχεία για επισύναψη στο PDF σας. Αυτά τα αρχεία θα ενσωματωθούν και θα είναι προσβάσιμα μέσω του πίνακα συνημμένων του PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Τέλος"
|
||||
startTour = "Έναρξη περιήγησης"
|
||||
startTourDescription = "Κάντε μια καθοδηγούμενη περιήγηση στα βασικά χαρακτηριστικά του Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Ξεκινήστε από τη γραμμή <strong>Γρήγορης πρόσβασης</strong> για να μεταπηδάτε μεταξύ Reader, Automate, των αρχείων σας και όλων των ξεναγήσεων."
|
||||
leftPanel = "Το αριστερό πάνελ <strong>Εργαλεία</strong> περιλαμβάνει όλα όσα μπορείτε να κάνετε. Περιηγηθείτε στις κατηγορίες ή αναζητήστε για να βρείτε γρήγορα ένα εργαλείο."
|
||||
fileUpload = "Χρησιμοποιήστε το κουμπί <strong>Αρχεία</strong> για μεταφόρτωση ή επιλογή πρόσφατου PDF. Θα φορτώσουμε ένα δείγμα ώστε να δείτε τον χώρο εργασίας."
|
||||
rightRail = "Η <strong>Δεξιά γραμμή</strong> περιέχει γρήγορες ενέργειες για επιλογή αρχείων, αλλαγή θέματος ή γλώσσας και λήψη αποτελεσμάτων."
|
||||
topBar = "Η επάνω γραμμή σάς επιτρέπει να εναλλάσσεστε μεταξύ <strong>Viewer</strong>, <strong>Page Editor</strong> και <strong>Active Files</strong>."
|
||||
pageEditorView = "Μεταβείτε στο Page Editor για αναδιάταξη, περιστροφή ή διαγραφή σελίδων."
|
||||
activeFilesView = "Χρησιμοποιήστε το Active Files για να δείτε ό,τι έχετε ανοίξει και να επιλέξετε με τι θα εργαστείτε."
|
||||
wrapUp = "Αυτά είναι τα νέα στο V2. Ανοίξτε το μενού <strong>Ξεναγήσεις</strong> οποιαδήποτε στιγμή για να επαναλάβετε αυτήν, τη ξενάγηση Εργαλείων ή του Διαχειριστή."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Καλώς ήρθατε στο Stirling PDF!"
|
||||
description = "Θέλετε να κάνετε μια γρήγορη περιήγηση 1 λεπτού για να μάθετε τα βασικά χαρακτηριστικά και πώς να ξεκινήσετε;"
|
||||
@@ -5655,10 +5255,6 @@ download = "Λήψη →"
|
||||
showMeAround = "Ξεναγήστε με"
|
||||
skipTheTour = "Παράλειψη ξενάγησης"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Επισκόπηση ξενάγησης"
|
||||
body = "Το Stirling PDF V2 περιλαμβάνει δεκάδες εργαλεία και ανανεωμένη διάταξη. Κάντε μια σύντομη ξενάγηση για να δείτε τι άλλαξε και πού θα βρείτε τις λειτουργίες που χρειάζεστε."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Παράλειψη προς το παρόν"
|
||||
seePlans = "Δείτε τα πλάνα →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Αναβάθμιση τώρα →"
|
||||
freeTitle = "Άδεια διακομιστή"
|
||||
overLimitTitle = "Απαιτείται άδεια διακομιστή"
|
||||
overLimitBody = "Η αδειοδότηση μας επιτρέπει έως <strong>{{freeTierLimit}}</strong> χρήστες δωρεάν ανά διακομιστή. Έχετε <strong>{{overLimitUserCopy}}</strong> χρήστες Stirling. Για να συνεχίσετε χωρίς διακοπές, αναβαθμίστε στο πλάνο Stirling Server - <strong>απεριόριστες θέσεις</strong>, επεξεργασία κειμένου PDF και πλήρης έλεγχος διαχειριστή για $99/server/μήνα."
|
||||
freeBody = "Η αδειοδότηση <strong>Open-Core</strong> μας επιτρέπει έως <strong>{{freeTierLimit}}</strong> χρήστες δωρεάν ανά διακομιστή. Για απρόσκοπτη κλιμάκωση και έγκαιρη πρόσβαση στο νέο <strong>εργαλείο επεξεργασίας κειμένου PDF</strong>, προτείνουμε το πλάνο Stirling Server - πλήρης επεξεργασία και <strong>απεριόριστες θέσεις</strong> για $99/server/μήνα."
|
||||
freeBody = "Οι άδειες χρήσης <strong>Open-Core</strong> επιτρέπουν έως και <strong>{{freeTierLimit}}</strong> χρήστες δωρεάν ανά διακομιστή. Για απρόσκοπτη κλιμάκωση, προτείνουμε το πλάνο Stirling Server - <strong>απεριόριστες θέσεις</strong> και <strong>υποστήριξη SSO</strong> με $99/διακομιστή/μήνα."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Λήψη"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Επικοινωνία με Πωλήσεις"
|
||||
contactToUpgrade = "Επικοινωνήστε μαζί μας για αναβάθμιση ή προσαρμογή του πλάνου σας"
|
||||
maxUsers = "Μέγιστοι χρήστες"
|
||||
upTo = "Έως"
|
||||
getLicense = "Αποκτήστε άδεια διακομιστή"
|
||||
upgradeToEnterprise = "Αναβάθμιση σε Enterprise"
|
||||
selectPeriod = "Επιλέξτε περίοδο χρέωσης"
|
||||
monthlyBilling = "Μηνιαία χρέωση"
|
||||
yearlyBilling = "Ετήσια χρέωση"
|
||||
checkoutOpened = "Άνοιξε το Checkout"
|
||||
checkoutInstructions = "Ολοκληρώστε την αγορά σας στην καρτέλα του Stripe. Μετά την πληρωμή, επιστρέψτε εδώ και ανανεώστε τη σελίδα για να ενεργοποιήσετε την άδειά σας. Θα λάβετε επίσης email με το κλειδί άδειας."
|
||||
activateLicense = "Ενεργοποιήστε την άδειά σας"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Το Checkout άνοιξε σε νέα καρτέλα"
|
||||
instructions = "Ολοκληρώστε την αγορά σας στην καρτέλα του Stripe. Μόλις ολοκληρωθεί η πληρωμή, θα λάβετε email με το κλειδί άδειας."
|
||||
enterKey = "Εισαγάγετε παρακάτω το κλειδί άδειας για να ενεργοποιήσετε το πλάνο σας:"
|
||||
keyDescription = "Επικολλήστε το κλειδί άδειας από το email σας"
|
||||
activate = "Ενεργοποίηση άδειας"
|
||||
doLater = "Θα το κάνω αργότερα"
|
||||
success = "Η άδεια ενεργοποιήθηκε!"
|
||||
successMessage = "Η άδειά σας ενεργοποιήθηκε με επιτυχία. Μπορείτε τώρα να κλείσετε αυτό το παράθυρο."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Απαιτείται επαλήθευση email"
|
||||
message = "Θα χρειαστεί να επαληθεύσετε τη διεύθυνση email σας στο portal χρέωσης του Stripe. Ελέγξτε το email σας για σύνδεσμο σύνδεσης."
|
||||
|
||||
[plan.period]
|
||||
month = "μήνα"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Το σύστημα ελέγχου δεν είναι διαθέ
|
||||
notAvailableMessage = "Το σύστημα ελέγχου δεν έχει ρυθμιστεί ή δεν είναι διαθέσιμο."
|
||||
disabled = "Η καταγραφή ελέγχου είναι απενεργοποιημένη"
|
||||
disabledMessage = "Ενεργοποιήστε την καταγραφή ελέγχου στις ρυθμίσεις της εφαρμογής για παρακολούθηση συμβάντων συστήματος."
|
||||
enterpriseRequired = "Απαιτείται άδεια Enterprise"
|
||||
enterpriseRequiredMessage = "Το σύστημα καταγραφής ελέγχου είναι λειτουργία enterprise. Αναβαθμίστε σε άδεια Enterprise για πρόσβαση σε αρχεία καταγραφής ελέγχου και αναλυτικά στοιχεία."
|
||||
|
||||
[audit.error]
|
||||
title = "Σφάλμα φόρτωσης συστήματος ελέγχου"
|
||||
@@ -6292,7 +5864,7 @@ title = "Διάγραμμα χρήσης Endpoints"
|
||||
|
||||
[usage.table]
|
||||
title = "Αναλυτικά στατιστικά"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Σημείο τερματισμού"
|
||||
visits = "Επισκέψεις"
|
||||
percentage = "Ποσοστό"
|
||||
noData = "Δεν υπάρχουν διαθέσιμα δεδομένα"
|
||||
@@ -6370,7 +5942,6 @@ description = "Εισαγάγετε το πλήρες URL του self-hosted δ
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Εισαγάγετε URL διακομιστή"
|
||||
invalidUrl = "Μη έγκυρη μορφή URL. Εισαγάγετε έγκυρο URL όπως https://your-server.com"
|
||||
unreachable = "Αδυναμία σύνδεσης με τον διακομιστή"
|
||||
testFailed = "Αποτυχία ελέγχου σύνδεσης"
|
||||
configFetch = "Αποτυχία ανάκτησης της διαμόρφωσης του διακομιστή. Ελέγξτε το URL και δοκιμάστε ξανά."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Σύνδεση με:"
|
||||
submit = "Σύνδεση"
|
||||
signInWith = "Σύνδεση με"
|
||||
oauthPending = "Άνοιγμα προγράμματος περιήγησης για έλεγχο ταυτότητας..."
|
||||
sso = "Ενιαία σύνδεση"
|
||||
orContinueWith = "Ή συνεχίστε με email"
|
||||
serverRequirement = "Σημείωση: Ο διακομιστής πρέπει να έχει ενεργοποιημένη τη σύνδεση."
|
||||
showInstructions = "Πώς ενεργοποιείται;"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Επαναφορά αλλαγών"
|
||||
downloadJson = "Λήψη JSON"
|
||||
generatePdf = "Δημιουργία PDF"
|
||||
saveChanges = "Αποθήκευση αλλαγών"
|
||||
applyChanges = "Εφαρμογή αλλαγών"
|
||||
downloadCopy = "Λήψη αντιγράφου"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Αυτόματη προσαρμογή κειμένου στα πλαίσια"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Συμβουλή: Κρατήστε πατημένο το Ct
|
||||
title = "Κλείδωμα επεξεργασμένου κειμένου σε ένα μόνο στοιχείο PDF"
|
||||
description = "Όταν είναι ενεργό, ο επεξεργαστής εξάγει κάθε επεξεργασμένο πλαίσιο κειμένου ως ένα στοιχείο κειμένου PDF για να αποφύγει επικαλυπτόμενους γλύφους ή ανάμεικτες γραμματοσειρές."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Σύνθετες ρυθμίσεις"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Περιορισμοί προεπισκόπησης"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Εστίαση σε κείμενο και εικόνα"
|
||||
text = "Ο χώρος εργασίας εστιάζει στην επεξεργασία κειμένου και την ανατοποθέτηση ενσωματωμένων εικόνων. Πολύπλοκα γραφικά σελίδας, στοιχεία φορμών και πολυεπίπεδα γραφικά διατηρούνται για εξαγωγή αλλά δεν είναι πλήρως επεξεργάσιμα εδώ."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Διαφορές προεπισκόπησης"
|
||||
text = "Ορισμένα οπτικά (όπως περιγράμματα πινάκων, σχήματα ή εμφανίσεις σχολιασμών) μπορεί να μην εμφανίζονται ακριβώς στην προεπισκόπηση. Το εξαγόμενο PDF διατηρεί τις αρχικές εντολές σχεδίασης όπου είναι δυνατόν."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Προβολέας Alpha"
|
||||
text = "Αυτός ο προβολέας alpha βρίσκεται υπό εξέλιξη—ορισμένες γραμματοσειρές, χρώματα, εφέ διαφάνειας και λεπτομέρειες διάταξης μπορεί να διαφοροποιηθούν ελαφρώς. Ελέγξτε προσεκτικά το παραγόμενο PDF πριν το κοινοποιήσετε."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Συγχώνευση επιλεγμένων πλαισίων"
|
||||
merge = "Συγχώνευση επιλογής"
|
||||
@@ -6614,58 +6164,3 @@ title = "Αποτελέσματα προσθήκης κειμένου"
|
||||
|
||||
[addText.error]
|
||||
failed = "Παρουσιάστηκε σφάλμα κατά την προσθήκη κειμένου στο PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Μεταφόρτωση από κινητό"
|
||||
description = "Σαρώστε για μεταφόρτωση φωτογραφιών. Οι εικόνες μετατρέπονται αυτόματα σε PDF."
|
||||
descriptionNoConvert = "Σαρώστε για μεταφόρτωση φωτογραφιών από την κινητή συσκευή σας."
|
||||
error = "Σφάλμα σύνδεσης"
|
||||
pollingError = "Σφάλμα κατά τον έλεγχο για αρχεία"
|
||||
sessionId = "Session ID"
|
||||
sessionCreateError = "Αποτυχία δημιουργίας συνεδρίας"
|
||||
expiryWarning = "Η συνεδρία λήγει σύντομα"
|
||||
expiryWarningMessage = "Αυτός ο κωδικός QR θα λήξει σε {{seconds}} δευτερόλεπτα. Ένας νέος κωδικός θα δημιουργηθεί αυτόματα."
|
||||
filesReceived = "Παραλήφθηκαν {{count}} αρχείο(α)"
|
||||
connected = "Συνδέθηκε κινητή συσκευή"
|
||||
instructions = "Σαρώστε με την κάμερα του τηλεφώνου σας. Οι εικόνες μετατρέπονται αυτόματα σε PDF."
|
||||
instructionsNoConvert = "Σαρώστε με την κάμερα του τηλεφώνου σας για να μεταφορτώσετε αρχεία."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Σαρωτής κινητού"
|
||||
noSession = "Μη έγκυρη συνεδρία"
|
||||
noSessionMessage = "Σαρώστε έγκυρο κωδικό QR για πρόσβαση σε αυτή τη σελίδα."
|
||||
validating = "Γίνεται επικύρωση συνεδρίας..."
|
||||
sessionInvalid = "Σφάλμα συνεδρίας"
|
||||
sessionExpired = "Αυτή η συνεδρία έχει λήξει. Ανανεώστε και δοκιμάστε ξανά."
|
||||
sessionNotFound = "Η συνεδρία δεν βρέθηκε. Ανανεώστε και δοκιμάστε ξανά."
|
||||
sessionValidationError = "Αδυναμία επαλήθευσης συνεδρίας. Δοκιμάστε ξανά."
|
||||
uploadSuccess = "Η μεταφόρτωση ολοκληρώθηκε!"
|
||||
uploadSuccessMessage = "Οι εικόνες σας μεταφέρθηκαν."
|
||||
httpsRequired = "Η πρόσβαση στην κάμερα απαιτεί HTTPS ή localhost. Παρακαλούμε χρησιμοποιήστε HTTPS ή αποκτήστε πρόσβαση μέσω localhost."
|
||||
uploadFailed = "Η μεταφόρτωση απέτυχε. Δοκιμάστε ξανά."
|
||||
uploading = "Γίνεται μεταφόρτωση..."
|
||||
connected = "Συνδεδεμένο"
|
||||
connecting = "Γίνεται σύνδεση..."
|
||||
chooseMethod = "Επιλέξτε μέθοδο μεταφόρτωσης"
|
||||
chooseMethodDescription = "Επιλέξτε πώς θέλετε να σαρώσετε και να μεταφορτώσετε έγγραφα"
|
||||
camera = "Κάμερα"
|
||||
cameraDescription = "Σαρώστε έγγραφα με την κάμερα της συσκευής σας με αυτόματο εντοπισμό ακμών"
|
||||
fileUpload = "Μεταφόρτωση αρχείων"
|
||||
fileDescription = "Μεταφορτώστε υπάρχουσες φωτογραφίες ή έγγραφα από τη συσκευή σας"
|
||||
cameraAccessDenied = "Δεν επιτρέπεται πρόσβαση στην κάμερα. Ενεργοποιήστε την πρόσβαση."
|
||||
back = "Πίσω"
|
||||
settings = "Ρυθμίσεις"
|
||||
edgeDetection = "Εντοπισμός ακμών"
|
||||
flashlight = "Φακός"
|
||||
flash = "Φλας"
|
||||
processing = "Γίνεται επεξεργασία..."
|
||||
capture = "Λήψη φωτογραφίας"
|
||||
selectFilesPrompt = "Επιλέξτε αρχεία για μεταφόρτωση"
|
||||
selectImage = "Επιλογή εικόνας"
|
||||
preview = "Προεπισκόπηση"
|
||||
retake = "Επανάληψη λήψης"
|
||||
addToBatch = "Προσθήκη στη δέσμη"
|
||||
upload = "Μεταφόρτωση"
|
||||
batchImages = "Δέσμη"
|
||||
clearBatch = "Καθαρισμός"
|
||||
uploadAll = "Μεταφόρτωση όλων"
|
||||
|
||||
@@ -367,7 +367,6 @@ advanced = "Advanced"
|
||||
title = "Security & Authentication"
|
||||
security = "Security"
|
||||
connections = "Connections"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licensing & Analytics"
|
||||
@@ -442,13 +441,6 @@ currentVersion = "Current Version"
|
||||
latestVersion = "Latest Version"
|
||||
checkForUpdates = "Check for Updates"
|
||||
viewDetails = "View Details"
|
||||
serverNeedsUpdate = "Server needs to be updated by administrator"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Version Information"
|
||||
description = "Desktop and server version details"
|
||||
desktop = "Desktop Version"
|
||||
server = "Server Version"
|
||||
|
||||
[settings.security]
|
||||
title = "Security"
|
||||
@@ -1308,18 +1300,6 @@ includePageNumbersDesc = "Add page numbers to the generated PDF"
|
||||
optimizeForEbookPdf = "Optimize for ebook readers"
|
||||
optimizeForEbookPdfDesc = "Optimize the PDF for eBook reading (smaller file size, better rendering on eInk devices)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF to eBook Options"
|
||||
epubOptionsDesc = "Options for converting PDF to EPUB/AZW3"
|
||||
detectChapters = "Detect chapters"
|
||||
detectChaptersDesc = "Detect headings that look like chapters and insert EPUB page breaks"
|
||||
targetDevice = "Target device"
|
||||
targetDeviceDesc = "Choose an output profile optimized for the reader device"
|
||||
outputFormat = "Output format"
|
||||
outputFormatDesc = "Choose the output format for the ebook"
|
||||
tabletPhone = "Tablet/Phone (with images)"
|
||||
kindleEink = "Kindle e-Ink (text optimized)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversion,img,jpg,picture,photo"
|
||||
|
||||
@@ -4297,8 +4277,6 @@ fetchError = "Failed to load settings"
|
||||
saveError = "Failed to save settings"
|
||||
saved = "Settings saved successfully"
|
||||
saveSuccess = "Settings saved successfully"
|
||||
success = "Settings saved successfully"
|
||||
error = "Failed to save settings"
|
||||
save = "Save Changes"
|
||||
discard = "Discard"
|
||||
restartRequired = "Restart Required"
|
||||
@@ -4565,19 +4543,6 @@ connect = "Connect"
|
||||
disconnect = "Disconnect"
|
||||
disconnected = "Provider disconnected successfully"
|
||||
disconnectError = "Failed to disconnect provider"
|
||||
mobileScannerConvertToPdf = "Convert Images to PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is."
|
||||
mobileScannerImageResolution = "Image Resolution"
|
||||
mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size."
|
||||
imageResolutionFull = "Full (Original Size)"
|
||||
imageResolutionReduced = "Reduced (Max 1200px)"
|
||||
mobileScannerPageFormat = "Page Format"
|
||||
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
|
||||
pageFormatKeep = "Keep (Original Dimensions)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Stretch to Fit"
|
||||
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO Auto Login"
|
||||
@@ -4646,109 +4611,12 @@ description = "Automatically create user accounts on first SAML2 login"
|
||||
label = "Block Registration"
|
||||
description = "Prevent new user registration via SAML2"
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram Bot"
|
||||
description = "Configure Telegram bot connectivity, access controls, and feedback behavior."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Enable Telegram Bot"
|
||||
description = "Allow users to interact with Stirling PDF through your configured Telegram bot."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot Username"
|
||||
description = "The public username of your Telegram bot."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "API token provided by BotFather for your Telegram bot."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Inbox Folder"
|
||||
description = "Folder under the pipeline directory where incoming Telegram files are stored."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Use Custom Folder Suffix"
|
||||
description = "Append the chat ID to incoming file folders to isolate uploads per chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Access Control"
|
||||
description = "Restrict which users or channels can interact with the bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Allow Specific User IDs"
|
||||
description = "When enabled, only listed user IDs can use the bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Allowed User IDs"
|
||||
description = "Enter Telegram user IDs allowed to interact with the bot."
|
||||
placeholder = "Add user ID and press enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Allow Specific Channel IDs"
|
||||
description = "When enabled, only listed channel IDs can use the bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Allowed Channel IDs"
|
||||
description = "Enter Telegram channel IDs allowed to interact with the bot."
|
||||
placeholder = "Add channel ID and press enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Processing"
|
||||
description = "Control polling intervals and processing timeouts for Telegram uploads."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Processing Timeout (seconds)"
|
||||
description = "Maximum time to wait for a processing job before reporting an error."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Polling Interval (ms)"
|
||||
description = "Interval between checks for new Telegram updates."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Feedback Messages"
|
||||
description = "Choose when the bot should send feedback to users and channels."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Enable Feedback"
|
||||
description = "Control whether the bot sends feedback messages at all."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Channel Feedback Rules"
|
||||
noValidDocument.label = "Show \"No valid document\" (Channel)"
|
||||
noValidDocument.description = "Suppress the no valid document response for channel uploads."
|
||||
errorProcessing.label = "Show processing errors (Channel)"
|
||||
errorProcessing.description = "Send processing error messages to channels."
|
||||
errorMessage.label = "Show error messages (Channel)"
|
||||
errorMessage.description = "Show detailed error messages for channels."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "User Feedback Rules"
|
||||
noValidDocument.label = "Show \"No valid document\" (User)"
|
||||
noValidDocument.description = "Suppress the no valid document response for user uploads."
|
||||
errorProcessing.label = "Show processing errors (User)"
|
||||
errorProcessing.description = "Send processing error messages to users."
|
||||
errorMessage.label = "Show error messages (User)"
|
||||
errorMessage.description = "Show detailed error messages for users."
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Mobile Phone Upload"
|
||||
enable = "Enable QR Code Upload"
|
||||
description = "Allow users to upload files from mobile devices by scanning a QR code"
|
||||
note = "Note: Requires Frontend URL to be configured. "
|
||||
link = "Configure in System Settings"
|
||||
mobileScannerConvertToPdf = "Convert Images to PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is."
|
||||
mobileScannerImageResolution = "Image Resolution"
|
||||
mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size."
|
||||
imageResolutionFull = "Full (Original Size)"
|
||||
imageResolutionReduced = "Reduced (Max 1200px)"
|
||||
mobileScannerPageFormat = "Page Format"
|
||||
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
|
||||
pageFormatKeep = "Keep (Original Dimensions)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Stretch to Fit"
|
||||
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
@@ -5122,7 +4990,6 @@ noRecentFiles = "No recent files found"
|
||||
googleDriveNotAvailable = "Google Drive integration not available"
|
||||
mobileUpload = "Mobile Upload"
|
||||
mobileShort = "Mobile"
|
||||
mobileUploadNotAvailable = "Mobile upload not enabled"
|
||||
downloadSelected = "Download Selected"
|
||||
saveSelected = "Save Selected"
|
||||
openFiles = "Open Files"
|
||||
@@ -5501,15 +5368,6 @@ impact = "Any applications or services currently using these keys will stop work
|
||||
confirmPrompt = "Are you sure you want to continue?"
|
||||
confirmCta = "Refresh Keys"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API Key Error"
|
||||
failedToCreateApiKey = "Failed to create API key."
|
||||
failedToRetrieveApiKey = "Failed to retrieve API key from response."
|
||||
failedToFetchApiKey = "Failed to fetch API key."
|
||||
apiKeyRefreshed = "API Key Refreshed"
|
||||
apiKeyRefreshedBody = "Your API key has been successfully refreshed."
|
||||
failedToRefreshApiKey = "Failed to refresh API key."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Select Attachments"
|
||||
info = "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel."
|
||||
@@ -6359,7 +6217,6 @@ description = "Enter the full URL of your self-hosted Stirling PDF server"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Please enter a server URL"
|
||||
invalidUrl = "Invalid URL format. Please enter a valid URL like https://your-server.com"
|
||||
unreachable = "Could not connect to server"
|
||||
testFailed = "Connection test failed"
|
||||
configFetch = "Failed to fetch server configuration. Please check the URL and try again."
|
||||
@@ -6606,8 +6463,7 @@ failed = "An error occurred while adding text to the PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Upload from Mobile"
|
||||
description = "Scan to upload photos. Images auto-convert to PDF."
|
||||
descriptionNoConvert = "Scan to upload photos from your mobile device."
|
||||
description = "Scan this QR code with your mobile device to upload photos directly to this page."
|
||||
error = "Connection Error"
|
||||
pollingError = "Error checking for files"
|
||||
sessionId = "Session ID"
|
||||
@@ -6616,8 +6472,7 @@ expiryWarning = "Session Expiring Soon"
|
||||
expiryWarningMessage = "This QR code will expire in {{seconds}} seconds. A new code will be generated automatically."
|
||||
filesReceived = "{{count}} file(s) received"
|
||||
connected = "Mobile device connected"
|
||||
instructions = "Scan with your phone camera. Images convert to PDF automatically."
|
||||
instructionsNoConvert = "Scan with your phone camera to upload files."
|
||||
instructions = "Open the camera app on your phone and scan this code. Files will be transferred directly between devices."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobile Scanner"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Tiene cambios sin guardar en su PDF. ¿Qué le gustaría hacer?"
|
||||
pendingRedactionsTitle = "Censuras sin aplicar"
|
||||
pendingRedactions = "Tienes censuras sin aplicar que se perderán."
|
||||
areYouSure = "¿Seguro que quieres salir?"
|
||||
unsavedChangesTitle = "Cambios sin Guardar"
|
||||
keepWorking = "Seguir trabajando"
|
||||
discardChanges = "Descartar cambios"
|
||||
discardRedactions = "Descartar y salir"
|
||||
applyAndContinue = "Aplicar y continuar"
|
||||
exportAndContinue = "Exportar y continuar"
|
||||
cancel = "Cancelar"
|
||||
@@ -343,10 +340,6 @@ advance = "Avanzado"
|
||||
edit = "Ver y Editar"
|
||||
popular = "Populares"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferencias"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Equipos"
|
||||
title = "Configuración"
|
||||
systemSettings = "Ajustes del sistema"
|
||||
features = "Funciones"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Puntos de conexión"
|
||||
database = "Base de datos"
|
||||
advanced = "Avanzado"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avanzado"
|
||||
title = "Seguridad y autenticación"
|
||||
security = "Seguridad"
|
||||
connections = "Conexiones"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licencias y analítica"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versión actual"
|
||||
latestVersion = "Última versión"
|
||||
checkForUpdates = "Buscar actualizaciones"
|
||||
viewDetails = "Ver detalles"
|
||||
serverNeedsUpdate = "El servidor debe ser actualizado por el administrador"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Información de la versión"
|
||||
description = "Detalles de la versión de escritorio y del servidor"
|
||||
desktop = "Versión de escritorio"
|
||||
server = "Versión del servidor"
|
||||
|
||||
[settings.security]
|
||||
title = "Seguridad"
|
||||
description = "Actualiza tu contraseña para mantener tu cuenta segura."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Cambia tu contraseña. Se cerrará tu sesión tras actualizar."
|
||||
required = "Todos los campos son obligatorios."
|
||||
mismatch = "Las contraseñas nuevas no coinciden."
|
||||
error = "No se puede actualizar la contraseña. Verifica tu contraseña actual e inténtalo de nuevo."
|
||||
success = "Contraseña actualizada correctamente. Vuelve a iniciar sesión."
|
||||
ssoDisabled = "Los cambios de contraseña los gestiona tu proveedor de identidad."
|
||||
current = "Contraseña actual"
|
||||
currentPlaceholder = "Introduce tu contraseña actual"
|
||||
new = "Nueva contraseña"
|
||||
newPlaceholder = "Introduce una nueva contraseña"
|
||||
confirm = "Confirmar nueva contraseña"
|
||||
confirmPlaceholder = "Vuelve a introducir tu nueva contraseña"
|
||||
update = "Actualizar contraseña"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Atajos de teclado"
|
||||
@@ -522,16 +488,11 @@ low = "Baja"
|
||||
title = "Cambiar Credenciales"
|
||||
header = "Actualice los detalles de su cuenta"
|
||||
changePassword = "Está usando las credenciales de inicio de sesión por defecto. Por favor, introduzca una contraseña nueva"
|
||||
ssoManaged = "Tu cuenta está gestionada por tu proveedor de identidad."
|
||||
newUsername = "Nuevo usuario"
|
||||
oldPassword = "Contraseña actual"
|
||||
newPassword = "Nueva contraseña"
|
||||
confirmNewPassword = "Confirme la nueva contraseña"
|
||||
submit = "Enviar cambios"
|
||||
credsUpdated = "Cuenta actualizada"
|
||||
description = "Cambios guardados. Vuelve a iniciar sesión."
|
||||
error = "No se pudo actualizar el nombre de usuario. Verifica tu contraseña e inténtalo de nuevo."
|
||||
changeUsername = "Actualiza tu nombre de usuario. Se cerrará tu sesión tras actualizar."
|
||||
|
||||
[account]
|
||||
title = "Configuración de la cuenta"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Configuración de la cuenta"
|
||||
adminSettings = "Configuración de Administrador - Ver y Añadir Usuarios"
|
||||
userControlSettings = "Configuración de control de usuario"
|
||||
changeUsername = "Cambiar nombre de usuario"
|
||||
changeUsernameDescription = "Actualiza tu nombre de usuario. Se cerrará tu sesión tras actualizar."
|
||||
newUsernamePlaceholder = "Introduce tu nuevo nombre de usuario"
|
||||
newUsername = "nuevo nombre de usuario"
|
||||
password = "Confirmar contraseña"
|
||||
oldPassword = "Contraseña anterior"
|
||||
@@ -749,11 +708,6 @@ tags = "firma,autógrafo"
|
||||
title = "Firmar"
|
||||
desc = "Añadir firma a PDF mediante dibujo, texto o imagen"
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotar,resaltar,dibujar"
|
||||
title = "Anotar"
|
||||
desc = "Resalta, dibuja y añade notas y formas en el visor"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplificar,eliminar,interactivo"
|
||||
title = "Eliminar interactividad"
|
||||
@@ -964,8 +918,8 @@ desc = "Superponer PDFs encima de otro PDF"
|
||||
title = "Superponer PDFs"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor de texto PDF"
|
||||
desc = "Revise y edite exportaciones JSON de Stirling PDF con edición de texto agrupada y regeneración de PDF"
|
||||
title = "Editor de texto de PDF"
|
||||
desc = "Edita texto e imágenes existentes dentro de archivos PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "texto,anotación,etiqueta"
|
||||
@@ -976,7 +930,6 @@ desc = "Añada texto personalizado en cualquier parte del PDF"
|
||||
addFiles = "Agregar Archivos"
|
||||
uploadFromComputer = "Cargar desde el ordenador"
|
||||
openFromComputer = "Abrir desde el ordenador"
|
||||
mobileUpload = "Subir desde el móvil"
|
||||
|
||||
[viewPdf]
|
||||
tags = "ver,leer,anotar,texto,imagen"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opciones de CBZ a PDF"
|
||||
optimizeForEbook = "Optimizar PDF para lectores de libros electrónicos (usa Ghostscript)"
|
||||
cbzOutputOptions = "Opciones de PDF a CBZ"
|
||||
cbzDpi = "DPI para renderizado de imágenes"
|
||||
cbrOptions = "Opciones de CBR"
|
||||
cbrOutputOptions = "Opciones de PDF a CBR"
|
||||
cbrDpi = "DPI para el renderizado de imágenes"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opciones de eBook a PDF"
|
||||
ebookOptionsDesc = "Opciones para convertir eBooks a PDF"
|
||||
embedAllFonts = "Incrustar todas las fuentes"
|
||||
embedAllFontsDesc = "Incrustar todas las fuentes del eBook en el PDF generado"
|
||||
includeTableOfContents = "Incluir tabla de contenidos"
|
||||
includeTableOfContentsDesc = "Añadir una tabla de contenidos generada al PDF resultante"
|
||||
includePageNumbers = "Incluir números de página"
|
||||
includePageNumbersDesc = "Añadir números de página al PDF generado"
|
||||
optimizeForEbookPdf = "Optimizar para lectores de eBook"
|
||||
optimizeForEbookPdfDesc = "Optimizar el PDF para lectura en eBook (tamaño de archivo menor, mejor renderizado en dispositivos eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opciones de PDF a eBook"
|
||||
epubOptionsDesc = "Opciones para convertir PDF a EPUB/AZW3"
|
||||
detectChapters = "Detectar capítulos"
|
||||
detectChaptersDesc = "Detectar encabezados que parezcan capítulos e insertar saltos de página EPUB"
|
||||
targetDevice = "Dispositivo de destino"
|
||||
targetDeviceDesc = "Elige un perfil de salida optimizado para el dispositivo lector"
|
||||
outputFormat = "Formato de salida"
|
||||
outputFormatDesc = "Elige el formato de salida para el eBook"
|
||||
tabletPhone = "Tableta/Teléfono (con imágenes)"
|
||||
kindleEink = "Kindle e-Ink (texto optimizado)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversión,img,jpg,imagen,fotografía"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Añadir archivo adjunto"
|
||||
remove = "Eliminar archivo adjunto"
|
||||
embed = "Incrustar archivo adjunto"
|
||||
convertToPdfA3b = "Convertir a PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Crea un PDF para archivo con adjuntos incrustados"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b es un formato para archivo que garantiza la preservación a largo plazo. Permite incrustar formatos de archivo arbitrarios como adjuntos. La conversión requiere Ghostscript y puede tardar más en archivos grandes."
|
||||
convertToPdfA3bTooltipHeader = "Acerca de la conversión a PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Qué hace"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Guardadas"
|
||||
label = "Cargar imagen de firma"
|
||||
placeholder = "Seleccionar archivo de imagen"
|
||||
hint = "Cargue una imagen PNG o JPG de su firma"
|
||||
removeBackground = "Eliminar fondo blanco (hacer transparente)"
|
||||
processing = "Procesando imagen..."
|
||||
backgroundRemovalFailedTitle = "Error al eliminar el fondo"
|
||||
backgroundRemovalFailedMessage = "No se pudo eliminar el fondo de la imagen. Se usará la imagen original."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Cómo añadir firma"
|
||||
@@ -2434,11 +2351,6 @@ note = "Aplanar elimina elementos interactivos del PDF, haciéndolos no editable
|
||||
label = "Aplanar solo formularios"
|
||||
desc = "Solo aplanar campos de formulario, dejando intactos otros elementos interactivos"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de renderizado (opcional, recomendado 150 DPI)"
|
||||
help = "Deja en blanco para usar el valor predeterminado del sistema. Un DPI más alto afila la salida pero aumenta el tiempo de procesamiento y el tamaño del archivo."
|
||||
placeholder = "p. ej. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultados de Aplanado"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Recortar PDF"
|
||||
submit = "Entregar"
|
||||
noFileSelected = "Seleccione un archivo PDF para comenzar a recortar"
|
||||
reset = "Restablecer a PDF completo"
|
||||
autoCrop = "Recortar automáticamente espacios en blanco"
|
||||
|
||||
[crop.preview]
|
||||
title = "Selección de Área de Recorte"
|
||||
@@ -3244,7 +3155,6 @@ title = "Método de Censura"
|
||||
mode = "Modo"
|
||||
automatic = "Automático"
|
||||
automaticDesc = "Censurar texto basándose en términos de búsqueda"
|
||||
automaticDisabledTooltip = "Selecciona archivos en el gestor de archivos para censurar varios archivos a la vez"
|
||||
manual = "Manual"
|
||||
manualDesc = "Haga clic y arrastre para censurar áreas específicas"
|
||||
manualComingSoon = "Censura manual próximamente"
|
||||
@@ -3315,35 +3225,8 @@ text = "Solo coincide palabras completas, no coincidencias parciales. 'Juan' no
|
||||
title = "Convertir a PDF-Imagen"
|
||||
text = "Convierte el PDF a un PDF basado en imagen después de la censura. Esto asegura que el texto detrás de las cajas de censura se elimine completamente y sea irrecuperable."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controles de censura manual"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Herramienta Marcar texto"
|
||||
text = "Selecciona texto directamente en el PDF para marcarlo para censura. Haz clic y arrastra para resaltar el texto específico que quieres censurar."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Herramienta Marcar área"
|
||||
text = "Dibuja áreas rectangulares en el PDF para marcar regiones para censura. Útil para censurar imágenes, firmas o formas irregulares."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplicar censuras"
|
||||
text = "Tras marcar contenido, haz clic en 'Aplicar' para censurar permanentemente todas las áreas marcadas. El contador de pendientes muestra cuántas censuras están listas para aplicar."
|
||||
bullet1 = "Marca tantas áreas como necesites antes de aplicar"
|
||||
bullet2 = "Todas las censuras pendientes se aplican a la vez"
|
||||
bullet3 = "Las censuras no se pueden deshacer tras aplicarlas"
|
||||
|
||||
[redact.manual]
|
||||
title = "Herramientas de censura"
|
||||
instructions = "Selecciona texto o dibuja áreas en el PDF para marcar contenido para censura."
|
||||
markText = "Marcar texto"
|
||||
markArea = "Marcar área"
|
||||
pendingLabel = "Pendientes:"
|
||||
applyWarning = "⚠️ Aplicación permanente, no se puede deshacer y los datos subyacentes se eliminarán"
|
||||
apply = "Aplicar"
|
||||
noMarks = "No hay marcas de censura. Usa las herramientas de arriba para marcar contenido para censura."
|
||||
header = "Censura Manual"
|
||||
controlsTitle = "Controles de censura manual"
|
||||
textBasedRedaction = "Censura Basada en Texto"
|
||||
pageBasedRedaction = "Censura Basada en Páginas"
|
||||
convertPDFToImageLabel = "Convertir PDF a PDF-Imagen (Usado para eliminar texto detrás de la caja)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Introduzca el número de divisiones horizontales"
|
||||
label = "Divisiones Verticales"
|
||||
placeholder = "Introduzca el número de divisiones verticales"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Modo de división"
|
||||
description = "Elige cómo dividir las páginas"
|
||||
splitAll = "Dividir todas las páginas"
|
||||
splitAllExceptFirst = "Dividir todas excepto la primera"
|
||||
splitAllExceptLast = "Dividir todas excepto la última"
|
||||
splitAllExceptFirstAndLast = "Dividir todas excepto la primera y la última"
|
||||
custom = "Páginas personalizadas"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Números de página personalizados"
|
||||
placeholder = "p. ej. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Sello, Añadir imagen, centrar imagen, Marca de agua, PDF, Incrustar, Personalizar"
|
||||
header = "Sellar PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Tamaño de archivo"
|
||||
[compress.grayscale]
|
||||
label = "Aplicar escala de grises para compresión"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linealizar PDF para visualización web rápida"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Convertir imágenes a arte lineal"
|
||||
description = "Usa ImageMagick para reducir las páginas a blanco y negro de alto contraste para una máxima reducción de tamaño."
|
||||
unavailable = "ImageMagick no está instalado o habilitado en este servidor"
|
||||
detailLevel = "Nivel de detalle"
|
||||
edgeEmphasis = "Énfasis de bordes"
|
||||
edgeLow = "Suave"
|
||||
edgeMedium = "Equilibrado"
|
||||
edgeHigh = "Fuerte"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Resumen de Configuración de Compresión"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Los valores más altos reducen el tamaño del archivo"
|
||||
title = "Escala de Grises"
|
||||
text = "Seleccione esta opción para convertir todas las imágenes a blanco y negro, lo que puede reducir significativamente el tamaño del archivo, especialmente para PDFs escaneados o documentos con muchas imágenes."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Arte lineal"
|
||||
text = "Convierte las páginas a blanco y negro de alto contraste usando ImageMagick. Usa el nivel de detalle para controlar cuánto contenido se vuelve negro y el énfasis de bordes para controlar cuán agresivamente se detectan los bordes."
|
||||
|
||||
[compress.error]
|
||||
failed = "Ocurrió un error al comprimir el PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Ocurrió un error al comprimir el PDF."
|
||||
_value = "Configuración de Compresión"
|
||||
1 = "1-3 compresión PDF,</br> 4-6 compresión de imagen suave,</br> 7-9 compresión de imágenes intensa reducirá drásticamente la calidad de imagen"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valores bajos preservan la calidad pero generan archivos más grandes"
|
||||
range4to6 = "Compresión media con reducción moderada de calidad"
|
||||
range7to9 = "Valores altos reducen significativamente el tamaño pero pueden disminuir la claridad de las imágenes"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Este archivo está protegido con contraseña. Por favor, introduzca la contraseña:"
|
||||
cancelled = "Operación cancelada para el PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Eliminar Páginas Seleccionadas"
|
||||
closePdf = "Cerrar PDF"
|
||||
exportAll = "Exportar PDF"
|
||||
downloadSelected = "Descargar Archivos Seleccionados"
|
||||
annotations = "Anotaciones"
|
||||
exportSelected = "Exportar páginas seleccionadas"
|
||||
saveChanges = "Guardar cambios"
|
||||
downloadAll = "Descargar Todo"
|
||||
saveAll = "Guardar todo"
|
||||
toggleTheme = "Alternar Tema"
|
||||
toggleBookmarks = "Mostrar/ocultar marcadores"
|
||||
language = "Idioma"
|
||||
toggleAnnotations = "Mostrar/ocultar anotaciones"
|
||||
search = "Buscar en PDF"
|
||||
panMode = "Modo de Desplazamiento"
|
||||
applyRedactionsFirst = "Aplica primero las censuras"
|
||||
rotateLeft = "Rotar a la Izquierda"
|
||||
rotateRight = "Rotar a la Derecha"
|
||||
toggleSidebar = "Alternar Barra Lateral"
|
||||
toggleBookmarks = "Mostrar/ocultar marcadores"
|
||||
exportSelected = "Exportar páginas seleccionadas"
|
||||
toggleAnnotations = "Mostrar/ocultar anotaciones"
|
||||
annotationMode = "Cambiar modo de anotaciones"
|
||||
print = "Imprimir PDF"
|
||||
draw = "Dibujar"
|
||||
redact = "Censurar"
|
||||
exitRedaction = "Salir del modo de censura"
|
||||
save = "Guardar"
|
||||
downloadAll = "Descargar Todo"
|
||||
saveAll = "Guardar todo"
|
||||
|
||||
[textAlign]
|
||||
left = "Izquierda"
|
||||
center = "Centrado"
|
||||
right = "Derecha"
|
||||
|
||||
[annotation]
|
||||
title = "Anotar"
|
||||
desc = "Usa resaltado, lápiz, texto y notas. Los cambios permanecen activos: no es necesario aplanar."
|
||||
highlight = "Resaltar"
|
||||
pen = "Lápiz"
|
||||
text = "Cuadro de texto"
|
||||
note = "Nota"
|
||||
rectangle = "Rectángulo"
|
||||
ellipse = "Elipse"
|
||||
select = "Seleccionar"
|
||||
exit = "Salir del modo de anotación"
|
||||
strokeWidth = "Grosor"
|
||||
opacity = "Opacidad"
|
||||
strokeOpacity = "Opacidad del trazo"
|
||||
fillOpacity = "Opacidad del relleno"
|
||||
fontSize = "Tamaño de fuente"
|
||||
chooseColor = "Elegir color"
|
||||
color = "Color"
|
||||
strokeColor = "Color del trazo"
|
||||
fillColor = "Color de relleno"
|
||||
underline = "Subrayado"
|
||||
strikeout = "Tachado"
|
||||
squiggly = "Ondulado"
|
||||
inkHighlighter = "Resaltador a mano alzada"
|
||||
freehandHighlighter = "Resaltador a mano alzada"
|
||||
square = "Cuadrado"
|
||||
circle = "Círculo"
|
||||
polygon = "Polígono"
|
||||
line = "Línea"
|
||||
stamp = "Añadir imagen"
|
||||
textMarkup = "Marcado de texto"
|
||||
drawing = "Dibujo"
|
||||
shapes = "Formas"
|
||||
notesStamps = "Notas y sellos"
|
||||
settings = "Ajustes"
|
||||
borderOn = "Borde: Activado"
|
||||
borderOff = "Borde: Desactivado"
|
||||
editInk = "Editar lápiz"
|
||||
editLine = "Editar línea"
|
||||
editNote = "Editar nota"
|
||||
editText = "Editar cuadro de texto"
|
||||
editTextMarkup = "Editar marcado de texto"
|
||||
editSelected = "Editar anotación"
|
||||
editSquare = "Editar cuadrado"
|
||||
editCircle = "Editar círculo"
|
||||
editPolygon = "Editar polígono"
|
||||
unsupportedType = "Este tipo de anotación no es totalmente compatible con la edición."
|
||||
textAlignment = "Alineación del texto"
|
||||
noteIcon = "Icono de nota"
|
||||
imagePreview = "Vista previa"
|
||||
contents = "Texto"
|
||||
backgroundColor = "Color de fondo"
|
||||
clearBackground = "Eliminar fondo"
|
||||
noBackground = "Sin fondo"
|
||||
stampSettings = "Ajustes del sello"
|
||||
savingCopy = "Preparando descarga..."
|
||||
saveFailed = "No se pudo guardar la copia"
|
||||
saveReady = "Descarga lista"
|
||||
selectAndMove = "Seleccionar y editar"
|
||||
editSelectDescription = "Haz clic en una anotación existente para editar su color, opacidad, texto o tamaño."
|
||||
editStampHint = "Para cambiar la imagen, elimina este sello y añade uno nuevo."
|
||||
editSwitchToSelect = "Cambia a Seleccionar y Editar para editar esta anotación."
|
||||
undo = "Deshacer"
|
||||
redo = "Rehacer"
|
||||
applyChanges = "Aplicar cambios"
|
||||
saveChanges = "Guardar cambios"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Ajustes"
|
||||
adminSettings = "Ajustes admin"
|
||||
allTools = "Herram."
|
||||
reader = "Lector"
|
||||
tours = "Recorridos"
|
||||
showMeAround = "Muéstrame cómo funciona"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Mira los recorridos aquí: Recorrido de Herramientas, del nuevo diseño V2 y de Administración."
|
||||
user = "Mira los recorridos aquí: Recorrido de Herramientas y del nuevo diseño V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Recorrido por las herramientas"
|
||||
toolsTourDesc = "Descubre lo que pueden hacer las herramientas"
|
||||
adminTour = "Recorrido de administración"
|
||||
adminTourDesc = "Explora la configuración y las funciones de administración"
|
||||
whatsNewTour = "Ver qué hay de nuevo en V2"
|
||||
whatsNewTourDesc = "Recorre el diseño actualizado"
|
||||
|
||||
[admin]
|
||||
error = "Error"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Error al cargar la configuración"
|
||||
saveError = "Error al guardar la configuración"
|
||||
saved = "Configuración guardada correctamente"
|
||||
saveSuccess = "Configuración guardada correctamente"
|
||||
success = "Ajustes guardados correctamente"
|
||||
error = "Error al guardar los ajustes"
|
||||
save = "Guardar cambios"
|
||||
discard = "Descartar"
|
||||
restartRequired = "Se requiere reiniciar"
|
||||
@@ -4422,13 +4185,6 @@ description = "Ruta al ejecutable de WeasyPrint para la conversión de HTML a PD
|
||||
label = "Ejecutable de Unoconvert"
|
||||
description = "Ruta a LibreOffice unoconvert para conversiones de documentos (dejar vacío para el valor predeterminado: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "URL base para el frontend (p. ej., https://pdf.example.com). Se usa para enlaces de invitación por correo y subidas por código QR desde el móvil. Déjalo vacío para usar la URL del backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Haz clic para ver los detalles del plan"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Seguridad"
|
||||
description = "Configura autenticación, comportamiento de inicio de sesión y políticas de seguridad."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Conectar"
|
||||
disconnect = "Desconectar"
|
||||
disconnected = "Proveedor desconectado correctamente"
|
||||
disconnectError = "No se pudo desconectar el proveedor"
|
||||
mobileScannerConvertToPdf = "Convertir imágenes a PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertir automáticamente las imágenes subidas a formato PDF. Si se desactiva, las imágenes se conservarán tal cual."
|
||||
mobileScannerImageResolution = "Resolución de imagen"
|
||||
mobileScannerImageResolutionDesc = "Resolución de las imágenes subidas. \"Reducida\" escala las imágenes a un máximo de 1200px para reducir el tamaño del archivo."
|
||||
imageResolutionFull = "Completa (tamaño original)"
|
||||
imageResolutionReduced = "Reducida (máx. 1200px)"
|
||||
mobileScannerPageFormat = "Formato de página"
|
||||
mobileScannerPageFormatDesc = "Tamaño de página del PDF para imágenes convertidas. \"Mantener\" usa las dimensiones originales de la imagen."
|
||||
pageFormatKeep = "Mantener (dimensiones originales)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Ajustar para encajar"
|
||||
mobileScannerStretchToFitDesc = "Estirar las imágenes para llenar toda la página. Si se desactiva, las imágenes se centran preservando la relación de aspecto."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Inicio de sesión automático SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Crear cuentas de usuario automáticamente en el primer inicio de
|
||||
label = "Bloquear el registro"
|
||||
description = "Evitar el registro de nuevos usuarios mediante SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Subida desde teléfono móvil"
|
||||
enable = "Habilitar subida por código QR"
|
||||
description = "Permitir que los usuarios suban archivos desde dispositivos móviles escaneando un código QR"
|
||||
note = "Nota: Requiere configurar la Frontend URL. "
|
||||
link = "Configurar en Ajustes del sistema"
|
||||
mobileScannerConvertToPdf = "Convertir imágenes a PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertir automáticamente las imágenes subidas a formato PDF. Si se desactiva, las imágenes se conservarán tal cual."
|
||||
mobileScannerImageResolution = "Resolución de imagen"
|
||||
mobileScannerImageResolutionDesc = "Resolución de las imágenes subidas. \"Reducida\" escala las imágenes a un máximo de 1200px para reducir el tamaño del archivo."
|
||||
imageResolutionFull = "Completa (tamaño original)"
|
||||
imageResolutionReduced = "Reducida (máx. 1200px)"
|
||||
mobileScannerPageFormat = "Formato de página"
|
||||
mobileScannerPageFormatDesc = "Tamaño de página del PDF para imágenes convertidas. \"Mantener\" usa las dimensiones originales de la imagen."
|
||||
pageFormatKeep = "Mantener (dimensiones originales)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Ajustar para encajar"
|
||||
mobileScannerStretchToFitDesc = "Estirar las imágenes para llenar toda la página. Si se desactiva, las imágenes se centran preservando la relación de aspecto."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot de Telegram"
|
||||
description = "Configura la conectividad del bot de Telegram, controles de acceso y comportamiento de retroalimentación."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Habilitar bot de Telegram"
|
||||
description = "Permite a los usuarios interactuar con Stirling PDF a través de tu bot de Telegram configurado."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nombre de usuario del bot"
|
||||
description = "El nombre de usuario público de tu bot de Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "Token de API proporcionado por BotFather para tu bot de Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Carpeta de entrada"
|
||||
description = "Carpeta bajo el directorio de pipeline donde se almacenan los archivos entrantes de Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Usar sufijo de carpeta personalizado"
|
||||
description = "Agregar el ID del chat a las carpetas de archivos entrantes para aislar subidas por chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Control de acceso"
|
||||
description = "Restringe qué usuarios o canales pueden interactuar con el bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Permitir ID de usuario específicos"
|
||||
description = "Cuando está habilitado, solo los ID de usuario listados pueden usar el bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID de usuario permitidos"
|
||||
description = "Introduce los ID de usuario de Telegram permitidos para interactuar con el bot."
|
||||
placeholder = "Añade el ID de usuario y pulsa Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Permitir ID de canal específicos"
|
||||
description = "Cuando está habilitado, solo los ID de canal listados pueden usar el bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID de canal permitidos"
|
||||
description = "Introduce los ID de canal de Telegram permitidos para interactuar con el bot."
|
||||
placeholder = "Añade el ID de canal y pulsa Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Procesamiento"
|
||||
description = "Controla los intervalos de sondeo y tiempos de espera para subidas de Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Tiempo de espera de procesamiento (segundos)"
|
||||
description = "Tiempo máximo de espera para un trabajo de procesamiento antes de informar un error."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Intervalo de sondeo (ms)"
|
||||
description = "Intervalo entre comprobaciones de nuevas actualizaciones de Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Mensajes de retroalimentación"
|
||||
description = "Elige cuándo el bot debe enviar retroalimentación a usuarios y canales."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Habilitar retroalimentación"
|
||||
description = "Controla si el bot envía mensajes de retroalimentación en absoluto."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Reglas de retroalimentación en canales"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Mostrar \"Sin documento válido\" (Canal)"
|
||||
description = "Suprimir la respuesta de sin documento válido para subidas en canales."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Mostrar errores de procesamiento (Canal)"
|
||||
description = "Enviar mensajes de error de procesamiento a los canales."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Mostrar mensajes de error (Canal)"
|
||||
description = "Mostrar mensajes de error detallados para los canales."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Reglas de retroalimentación a usuarios"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Mostrar \"Sin documento válido\" (Usuario)"
|
||||
description = "Suprimir la respuesta de sin documento válido para subidas de usuarios."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Mostrar errores de procesamiento (Usuario)"
|
||||
description = "Enviar mensajes de error de procesamiento a los usuarios."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Mostrar mensajes de error (Usuario)"
|
||||
description = "Mostrar mensajes de error detallados para los usuarios."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Base de datos"
|
||||
description = "Configura ajustes de conexión de base de datos personalizados para despliegues empresariales."
|
||||
@@ -4943,10 +4570,6 @@ description = "Permitir a los administradores invitar usuarios por correo con co
|
||||
label = "URL del frontend"
|
||||
description = "URL base del frontend (p. ej. https://pdf.example.com). Se usa para generar enlaces de invitación en emails. Deja vacío para usar la URL del backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Nota: Requiere configurar la Frontend URL. "
|
||||
link = "Configurar en Ajustes del sistema"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documentos legales"
|
||||
description = "Configura enlaces a documentos y políticas legales."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Mis Archivos"
|
||||
noRecentFiles = "No se encontraron archivos recientes"
|
||||
googleDriveNotAvailable = "Integración con Google Drive no disponible"
|
||||
mobileUpload = "Subida desde móvil"
|
||||
mobileShort = "Móvil"
|
||||
mobileUploadNotAvailable = "Subida desde móvil no habilitada"
|
||||
downloadSelected = "Descargar Seleccionados"
|
||||
saveSelected = "Guardar seleccionados"
|
||||
openFiles = "Abrir Archivos"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Cargando..."
|
||||
back = "Atrás"
|
||||
continue = "Continuar"
|
||||
error = "Error"
|
||||
save = "Guardar"
|
||||
|
||||
[config.overview]
|
||||
title = "Configuración de la aplicación"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Cualquier aplicación o servicio que esté utilizando actualmente esta
|
||||
confirmPrompt = "¿Está seguro de que desea continuar?"
|
||||
confirmCta = "Actualizar Claves"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Error de clave de API"
|
||||
failedToCreateApiKey = "No se pudo crear la clave de API."
|
||||
failedToRetrieveApiKey = "No se pudo obtener la clave de API de la respuesta."
|
||||
failedToFetchApiKey = "No se pudo recuperar la clave de API."
|
||||
apiKeyRefreshed = "Clave de API actualizada"
|
||||
apiKeyRefreshedBody = "Tu clave de API se ha actualizado correctamente."
|
||||
failedToRefreshApiKey = "No se pudo actualizar la clave de API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Seleccionar archivos adjuntos"
|
||||
info = "Seleccione archivos para adjuntar a su PDF. Estos archivos se incrustarán y serán accesibles a través del panel de archivos adjuntos del PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Finalizar"
|
||||
startTour = "Iniciar recorrido"
|
||||
startTourDescription = "Realiza un recorrido guiado por las funciones clave de Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Empieza en el panel de <strong>Acceso rápido</strong> para cambiar entre Lector, Automatizar, tus archivos y todos los recorridos."
|
||||
leftPanel = "El panel izquierdo de <strong>Herramientas</strong> lista todo lo que puedes hacer. Explora categorías o busca para encontrar una herramienta rápidamente."
|
||||
fileUpload = "Usa el botón de <strong>Archivos</strong> para subir o elegir un PDF reciente. Cargaremos un ejemplo para que puedas ver el espacio de trabajo."
|
||||
rightRail = "El <strong>Panel derecho</strong> contiene acciones rápidas para seleccionar archivos, cambiar el tema o el idioma y descargar resultados."
|
||||
topBar = "La barra superior te permite cambiar entre <strong>Visor</strong>, <strong>Editor de páginas</strong> y <strong>Archivos activos</strong>."
|
||||
pageEditorView = "Cambia al Editor de páginas para reordenar, rotar o eliminar páginas."
|
||||
activeFilesView = "Usa Archivos activos para ver todo lo que tienes abierto y elegir en qué trabajar."
|
||||
wrapUp = "Eso es lo nuevo en V2. Abre el menú de <strong>Recorridos</strong> en cualquier momento para repetir este, el de Herramientas o el de Administración."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "¡Bienvenido a Stirling PDF!"
|
||||
description = "¿Te gustaría hacer un recorrido rápido de 1 minuto para conocer las funciones clave y cómo empezar?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Descargar →"
|
||||
showMeAround = "Muéstreme el recorrido"
|
||||
skipTheTour = "Saltar el recorrido"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Resumen del recorrido"
|
||||
body = "Stirling PDF V2 incluye decenas de herramientas y un diseño renovado. Haz un recorrido rápido para ver qué cambió y dónde encontrar las funciones que necesitas."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Omitir por ahora"
|
||||
seePlans = "Ver planes →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Actualizar ahora →"
|
||||
freeTitle = "Licencia del servidor"
|
||||
overLimitTitle = "Se necesita licencia de servidor"
|
||||
overLimitBody = "Nuestra licencia permite hasta <strong>{{freeTierLimit}}</strong> usuarios gratis por servidor. Tiene <strong>{{overLimitUserCopy}}</strong> usuarios de Stirling. Para continuar sin interrupciones, actualice al plan Stirling Server: <strong>plazas ilimitadas</strong>, edición de texto PDF y control total de administración por 99 $/servidor/mes."
|
||||
freeBody = "Nuestra licencia <strong>Open-Core</strong> permite hasta <strong>{{freeTierLimit}}</strong> usuarios gratis por servidor. Para escalar sin interrupciones y obtener acceso anticipado a nuestra nueva <strong>herramienta de edición de texto PDF</strong>, recomendamos el plan Stirling Server: edición completa y <strong>plazas ilimitadas</strong> por 99 $/servidor/mes."
|
||||
freeBody = "Nuestra licencia <strong>Open-Core</strong> permite hasta <strong>{{freeTierLimit}}</strong> usuarios gratis por servidor. Para escalar sin interrupciones, recomendamos el plan Stirling Server - <strong>plazas ilimitadas</strong> y <strong>soporte SSO</strong> por $99/servidor/mes."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Descargar"
|
||||
@@ -5738,7 +5334,7 @@ user = "Usuario"
|
||||
[workspace.people.addMember]
|
||||
title = "Añadir miembro"
|
||||
username = "Nombre de usuario (correo)"
|
||||
usernamePlaceholder = "user@example.com"
|
||||
usernamePlaceholder = "usuario@ejemplo.com"
|
||||
password = "Contraseña"
|
||||
passwordPlaceholder = "Introduce la contraseña"
|
||||
role = "Rol"
|
||||
@@ -5800,7 +5396,7 @@ error = "No se pudo actualizar la contraseña"
|
||||
tab = "Invitación por correo electrónico"
|
||||
description = "Escribe o pega correos a continuación, separados por comas. Los usuarios recibirán credenciales de inicio de sesión por correo electrónico."
|
||||
emails = "Direcciones de correo electrónico"
|
||||
emailsPlaceholder = "user1@example.com, user2@example.com"
|
||||
emailsPlaceholder = "usuario1@ejemplo.com, usuario2@ejemplo.com"
|
||||
emailsRequired = "Se requiere al menos una dirección de correo electrónico"
|
||||
submit = "Enviar invitaciones"
|
||||
success = "usuario(s) invitado(s) correctamente"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contactar con ventas"
|
||||
contactToUpgrade = "Contacta con nosotros para actualizar o personalizar tu plan"
|
||||
maxUsers = "Máximo de usuarios"
|
||||
upTo = "Hasta"
|
||||
getLicense = "Obtener licencia de servidor"
|
||||
upgradeToEnterprise = "Actualizar a Enterprise"
|
||||
selectPeriod = "Seleccionar período de facturación"
|
||||
monthlyBilling = "Facturación mensual"
|
||||
yearlyBilling = "Facturación anual"
|
||||
checkoutOpened = "Proceso de pago abierto"
|
||||
checkoutInstructions = "Completa tu compra en la pestaña de Stripe. Después del pago, vuelve aquí y actualiza la página para activar tu licencia. También recibirás un correo con tu clave de licencia."
|
||||
activateLicense = "Activa tu licencia"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Pago abierto en nueva pestaña"
|
||||
instructions = "Completa tu compra en la pestaña de Stripe. Una vez completado el pago, recibirás un correo con tu clave de licencia."
|
||||
enterKey = "Introduce tu clave de licencia a continuación para activar tu plan:"
|
||||
keyDescription = "Pega la clave de licencia de tu correo"
|
||||
activate = "Activar licencia"
|
||||
doLater = "Lo haré más tarde"
|
||||
success = "¡Licencia activada!"
|
||||
successMessage = "Tu licencia se ha activado correctamente. Ya puedes cerrar esta ventana."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Se requiere verificación de correo"
|
||||
message = "Deberás verificar tu dirección de correo electrónico en el portal de facturación de Stripe. Revisa tu correo para un enlace de inicio de sesión."
|
||||
|
||||
[plan.period]
|
||||
month = "mes"
|
||||
@@ -6122,7 +5696,7 @@ emailInvalid = "Introduzca una dirección de correo válida"
|
||||
title = "Introduzca su correo electrónico"
|
||||
description = "Lo usaremos para enviar su clave de licencia y recibos."
|
||||
emailLabel = "Dirección de correo electrónico"
|
||||
emailPlaceholder = "your@email.com"
|
||||
emailPlaceholder = "su@email.com"
|
||||
continue = "Continuar"
|
||||
modalTitle = "Comenzar - {{planName}}"
|
||||
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistema de auditoría no disponible"
|
||||
notAvailableMessage = "El sistema de auditoría no está configurado o no está disponible."
|
||||
disabled = "El registro de auditoría está desactivado"
|
||||
disabledMessage = "Habilita el registro de auditoría en la configuración de tu aplicación para rastrear eventos del sistema."
|
||||
enterpriseRequired = "Se requiere licencia Enterprise"
|
||||
enterpriseRequiredMessage = "El sistema de registro de auditoría es una función empresarial. Actualiza a una licencia Enterprise para acceder a los registros de auditoría y analíticas."
|
||||
|
||||
[audit.error]
|
||||
title = "Error al cargar el sistema de auditoría"
|
||||
@@ -6370,7 +5942,6 @@ description = "Introduzca la URL completa de su servidor autoalojado de Stirling
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Introduzca una URL de servidor"
|
||||
invalidUrl = "Formato de URL no válido. Introduce una URL válida como https://your-server.com"
|
||||
unreachable = "No se pudo conectar con el servidor"
|
||||
testFailed = "Falló la prueba de conexión"
|
||||
configFetch = "No se pudo obtener la configuración del servidor. Compruebe la URL e inténtelo de nuevo."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Conectando a:"
|
||||
submit = "Iniciar sesión"
|
||||
signInWith = "Iniciar sesión con"
|
||||
oauthPending = "Abriendo el navegador para autenticación..."
|
||||
sso = "Inicio de sesión único"
|
||||
orContinueWith = "O continuar con email"
|
||||
serverRequirement = "Nota: el servidor debe tener el inicio de sesión habilitado."
|
||||
showInstructions = "¿Cómo habilitarlo?"
|
||||
@@ -6404,7 +5974,7 @@ label = "Nombre de usuario"
|
||||
placeholder = "Introduzca su nombre de usuario"
|
||||
|
||||
[setup.login.email]
|
||||
label = "Email"
|
||||
label = "Correo electrónico"
|
||||
placeholder = "Introduzca su email"
|
||||
|
||||
[setup.login.password]
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Página de párrafos"
|
||||
sparse = "Texto disperso"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automático"
|
||||
paragraph = "Párrafo"
|
||||
singleLine = "Línea única"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Restablecer cambios"
|
||||
downloadJson = "Descargar JSON"
|
||||
generatePdf = "Generar PDF"
|
||||
saveChanges = "Guardar cambios"
|
||||
applyChanges = "Aplicar cambios"
|
||||
downloadCopy = "Descargar copia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Escalar texto automáticamente para ajustar a las cajas"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Consejo: mantenga pulsado Ctrl (Cmd) o Shift para seleccion
|
||||
title = "Bloquear el texto editado a un único elemento PDF"
|
||||
description = "Cuando está activado, el editor exporta cada cuadro de texto editado como un único elemento de texto PDF para evitar solapamientos de glifos o fuentes mezcladas."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Ajustes avanzados"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitaciones de la vista previa"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Enfoque en texto e imagen"
|
||||
text = "Este espacio de trabajo se centra en editar texto y recolocar imágenes incrustadas. Las ilustraciones de página complejas, widgets de formularios y gráficos por capas se preservan para la exportación pero no son totalmente editables aquí."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variaciones de la vista previa"
|
||||
text = "Algunos elementos visuales (como bordes de tablas, formas o apariencias de anotaciones) pueden no mostrarse exactamente en la vista previa. El PDF exportado mantiene las órdenes de dibujo originales siempre que sea posible."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visor alfa"
|
||||
text = "Este visor alfa sigue evolucionando—ciertas fuentes, colores, efectos de transparencia y detalles de maquetación pueden variar ligeramente. Verifica el PDF generado antes de compartirlo."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Combinar cuadros seleccionados"
|
||||
merge = "Combinar selección"
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultados de añadir texto"
|
||||
|
||||
[addText.error]
|
||||
failed = "Se produjo un error al añadir texto al PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Subir desde el móvil"
|
||||
description = "Escanea para subir fotos. Las imágenes se convierten automáticamente a PDF."
|
||||
descriptionNoConvert = "Escanea para subir fotos desde tu dispositivo móvil."
|
||||
error = "Error de conexión"
|
||||
pollingError = "Error al comprobar archivos"
|
||||
sessionId = "ID de sesión"
|
||||
sessionCreateError = "No se pudo crear la sesión"
|
||||
expiryWarning = "La sesión expirará pronto"
|
||||
expiryWarningMessage = "Este código QR caducará en {{seconds}} segundos. Se generará un nuevo código automáticamente."
|
||||
filesReceived = "{{count}} archivo(s) recibido(s)"
|
||||
connected = "Dispositivo móvil conectado"
|
||||
instructions = "Escanéalo con la cámara de tu teléfono. Las imágenes se convierten a PDF automáticamente."
|
||||
instructionsNoConvert = "Escanéalo con la cámara de tu teléfono para subir archivos."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Escáner móvil"
|
||||
noSession = "Sesión no válida"
|
||||
noSessionMessage = "Escanea un código QR válido para acceder a esta página."
|
||||
validating = "Validando la sesión..."
|
||||
sessionInvalid = "Error de sesión"
|
||||
sessionExpired = "Esta sesión ha caducado. Actualiza e inténtalo de nuevo."
|
||||
sessionNotFound = "Sesión no encontrada. Actualiza e inténtalo de nuevo."
|
||||
sessionValidationError = "No se puede verificar la sesión. Inténtalo de nuevo."
|
||||
uploadSuccess = "¡Subida correcta!"
|
||||
uploadSuccessMessage = "Tus imágenes han sido transferidas."
|
||||
httpsRequired = "El acceso a la cámara requiere HTTPS o localhost. Usa HTTPS o accede vía localhost."
|
||||
uploadFailed = "La subida ha fallado. Inténtalo de nuevo."
|
||||
uploading = "Subiendo..."
|
||||
connected = "Conectado"
|
||||
connecting = "Conectando..."
|
||||
chooseMethod = "Elige el método de subida"
|
||||
chooseMethodDescription = "Selecciona cómo quieres escanear y subir documentos"
|
||||
camera = "Cámara"
|
||||
cameraDescription = "Escanea documentos usando la cámara de tu dispositivo con detección automática de bordes"
|
||||
fileUpload = "Subir archivo"
|
||||
fileDescription = "Sube fotos o documentos existentes desde tu dispositivo"
|
||||
cameraAccessDenied = "Acceso a la cámara denegado. Habilita el acceso a la cámara."
|
||||
back = "Atrás"
|
||||
settings = "Ajustes"
|
||||
edgeDetection = "Detección de bordes"
|
||||
flashlight = "Linterna"
|
||||
flash = "Flash"
|
||||
processing = "Procesando..."
|
||||
capture = "Capturar foto"
|
||||
selectFilesPrompt = "Selecciona archivos para subir"
|
||||
selectImage = "Seleccionar imagen"
|
||||
preview = "Vista previa"
|
||||
retake = "Volver a tomar"
|
||||
addToBatch = "Añadir al lote"
|
||||
upload = "Subir"
|
||||
batchImages = "Lote"
|
||||
clearBatch = "Limpiar"
|
||||
uploadAll = "Subir todo"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Gorde gabeko aldaketak dituzu zure PDFan."
|
||||
pendingRedactionsTitle = "Aplikatu gabeko zentsurak"
|
||||
pendingRedactions = "Aplikatu gabeko zentsurak dituzu eta galdu egingo dira."
|
||||
areYouSure = "Ziur zaude irten nahi duzula?"
|
||||
unsavedChangesTitle = "Gorde gabeko aldaketak"
|
||||
keepWorking = "Lanean jarraitu"
|
||||
discardChanges = "Baztertu eta irten"
|
||||
discardRedactions = "Baztertu eta irten"
|
||||
applyAndContinue = "Gorde eta irten"
|
||||
exportAndContinue = "Esportatu eta jarraitu"
|
||||
cancel = "Utzi"
|
||||
@@ -102,7 +99,7 @@ visitGithub = "Bisitatu Github biltegia"
|
||||
donate = "Dohaintza egin"
|
||||
color = "Color"
|
||||
sponsor = "Babestu"
|
||||
info = "Info"
|
||||
info = "Informazioa"
|
||||
pro = "Pro"
|
||||
page = "Orrialdea"
|
||||
pages = "Orrialdeak"
|
||||
@@ -134,7 +131,7 @@ unsupported = "Ez da onartzen"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Aukeratu tresna bat hasteko"
|
||||
alpha = "Alpha"
|
||||
alpha = "Alfa"
|
||||
premiumFeature = "Premium ezaugarria:"
|
||||
comingSoon = "Laster eskuragarri:"
|
||||
|
||||
@@ -282,7 +279,7 @@ iAgreeToThe = "Onartzen ditut honako hauek guztiak"
|
||||
terms = "Baldintzak eta erabilera-baldintzak"
|
||||
accessibility = "Irisgarritasuna"
|
||||
cookie = "Cookie politika"
|
||||
impressum = "Impressum"
|
||||
impressum = "Lege oharra"
|
||||
showCookieBanner = "Cookie-hobespenak"
|
||||
|
||||
[pipeline]
|
||||
@@ -304,7 +301,7 @@ saveSettings = "Gorde eragiketa-ezarpenak"
|
||||
pipelineNamePrompt = "Sartu hemen pipeline izena"
|
||||
selectOperation = "Aukeratu eragiketa"
|
||||
addOperationButton = "Gehitu eragiketa"
|
||||
pipelineHeader = "Pipeline:"
|
||||
pipelineHeader = "Pipelinea:"
|
||||
saveButton = "Distira"
|
||||
validateButton = "Balidatu"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Aurreratua"
|
||||
edit = "Ikusi eta editatu"
|
||||
popular = "Ezagunak"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Hobespenak"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Taldeak"
|
||||
title = "Konfigurazioa"
|
||||
systemSettings = "Sistemaren ezarpenak"
|
||||
features = "Eginbideak"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Amaiera-puntuak"
|
||||
database = "Datu-basea"
|
||||
advanced = "Aurreratua"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Aurreratua"
|
||||
title = "Segurtasuna eta Autentifikazioa"
|
||||
security = "Segurtasuna"
|
||||
connections = "Konexioak"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Lizentziak eta Analitika"
|
||||
@@ -377,7 +369,7 @@ usageAnalytics = "Erabilera-analitika"
|
||||
|
||||
[settings.policiesPrivacy]
|
||||
title = "Politikak eta Pribatutasuna"
|
||||
legal = "Legal"
|
||||
legal = "Lege"
|
||||
privacy = "Pribatutasuna"
|
||||
|
||||
[settings.developer]
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Uneko bertsioa"
|
||||
latestVersion = "Azken bertsioa"
|
||||
checkForUpdates = "Egiaztatu eguneratzeak"
|
||||
viewDetails = "Xehetasunak ikusi"
|
||||
serverNeedsUpdate = "Zerbitzaria administratzaileak eguneratu behar du"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Bertsio-informazioa"
|
||||
description = "Mahaigaineko eta zerbitzariko bertsio-xehetasunak"
|
||||
desktop = "Mahaigaineko bertsioa"
|
||||
server = "Zerbitzariaren bertsioa"
|
||||
|
||||
[settings.security]
|
||||
title = "Segurtasuna"
|
||||
description = "Eguneratu pasahitza kontua seguru mantentzeko."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Aldatu pasahitza. Eguneratu ondoren saioa itxiko da."
|
||||
required = "Eremu guztiak beharrezkoak dira."
|
||||
mismatch = "Pasahitz berriak ez datoz bat."
|
||||
error = "Ezin izan da pasahitza eguneratu. Egiaztatu uneko pasahitza eta saiatu berriro."
|
||||
success = "Pasahitza ongi eguneratu da. Hasi saioa berriro."
|
||||
ssoDisabled = "Pasahitz-aldaketak zure identitate-hornitzaileak kudeatzen ditu."
|
||||
current = "Uneko pasahitza"
|
||||
currentPlaceholder = "Sartu zure uneko pasahitza"
|
||||
new = "Pasahitz berria"
|
||||
newPlaceholder = "Sartu pasahitz berria"
|
||||
confirm = "Berretsi pasahitz berria"
|
||||
confirmPlaceholder = "Sartu berriro pasahitz berria"
|
||||
update = "Eguneratu pasahitza"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Laster-teklak"
|
||||
@@ -522,16 +488,11 @@ low = "Baxua"
|
||||
title = "Aldatu kredentzialak"
|
||||
header = "Eguneratu zure kontuaren xehetasunak"
|
||||
changePassword = "Saioa hasteko kredentzial lehenetsiak erabiltzen ari zara. Mesedez, sartu pasahitz berria"
|
||||
ssoManaged = "Zure kontua identitate-hornitzaileak kudeatzen du."
|
||||
newUsername = "Erabiltzaile izen berria"
|
||||
oldPassword = "Uneko pasahitza"
|
||||
newPassword = "Pasahitz berria"
|
||||
confirmNewPassword = "Konfirmatu pasahitz berria"
|
||||
submit = "Bidali aldaketak"
|
||||
credsUpdated = "Kontua eguneratu da"
|
||||
description = "Aldaketak gorde dira. Hasi saioa berriro."
|
||||
error = "Ezin izan da erabiltzaile-izena eguneratu. Egiaztatu pasahitza eta saiatu berriro."
|
||||
changeUsername = "Eguneratu zure erabiltzaile-izena. Eguneratu ondoren saioa itxiko da."
|
||||
|
||||
[account]
|
||||
title = "Kontuaren ezarpenak"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Kontuaren ezarpenak"
|
||||
adminSettings = "Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak"
|
||||
userControlSettings = "Erabiltzaile ezarpen kontrolak"
|
||||
changeUsername = "Aldatu erabiltzaile izena"
|
||||
changeUsernameDescription = "Eguneratu zure erabiltzaile-izena. Eguneratu ondoren saioa itxiko da."
|
||||
newUsernamePlaceholder = "Sartu zure erabiltzaile-izen berria"
|
||||
newUsername = "Erabiltzaile izen berria"
|
||||
password = "Konfirmatu pasahitza"
|
||||
oldPassword = "Pasahitz zaharra"
|
||||
@@ -559,7 +518,7 @@ syncToAccount = "Sync Kontua <- Nabigatzailea"
|
||||
[adminUserSettings]
|
||||
title = "Erabiltzailearen Ezarpenen Kontrolak"
|
||||
header = "Admin Erabiltzailearen Ezarpenen Kontrolak"
|
||||
admin = "Admin"
|
||||
admin = "Administratzailea"
|
||||
user = "Erabiltzaile"
|
||||
addUser = "Erabiltzaile berria"
|
||||
deleteUser = "Ezabatu erabiltzailea"
|
||||
@@ -749,11 +708,6 @@ tags = "sinadura,autografoa"
|
||||
title = "Sinatu"
|
||||
desc = "Gehitu sinadura PDFari marrazki, testu edo irudi bidez"
|
||||
|
||||
[home.annotate]
|
||||
tags = "oharrak, nabarmendu, marraztu"
|
||||
title = "Oharrak"
|
||||
desc = "Nabarmendu, marraztu, oharrak eta formak gehitu ikuslean"
|
||||
|
||||
[home.flatten]
|
||||
tags = "sinplifikatu,kendu,interaktiboa"
|
||||
title = "Lautu"
|
||||
@@ -964,8 +918,8 @@ desc = "Overlays PDFs on-top of another PDF"
|
||||
title = "Gainjarri PDFak"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF testu-editorea"
|
||||
desc = "Berrikusi eta editatu Stirling PDF JSON esportazioak taldekatutako testu-edizioarekin eta PDF birsorkuntzarekin"
|
||||
title = "PDF testu editorea"
|
||||
desc = "Editatu PDFetako lehendik dauden testuak eta irudiak"
|
||||
|
||||
[home.addText]
|
||||
tags = "testua,anotazioa,etiketa"
|
||||
@@ -976,7 +930,6 @@ desc = "Gehitu testu pertsonalizatua zure PDFan edonon"
|
||||
addFiles = "Gehitu fitxategiak"
|
||||
uploadFromComputer = "Igo ordenagailutik"
|
||||
openFromComputer = "Ireki ordenagailutik"
|
||||
mobileUpload = "Kargatu mugikorretik"
|
||||
|
||||
[viewPdf]
|
||||
tags = "view,read,annotate,text,image"
|
||||
@@ -1272,7 +1225,7 @@ odtExt = "OpenDocument testua (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument aurkezpena (.odp)"
|
||||
txtExt = "Testu laua (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Testu aberatsaren formatua (.rtf)"
|
||||
selectedFiles = "Hautatutako fitxategiak"
|
||||
noFileSelected = "Ez da fitxategirik hautatu. Erabili fitxategi-panela fitxategiak gehitzeko."
|
||||
convertFiles = "Bihurtu fitxategiak"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZtik PDFra aukerak"
|
||||
optimizeForEbook = "Optimizatu PDF e-book irakurgailuetarako (Ghostscript erabiltzen du)"
|
||||
cbzOutputOptions = "PDFtik CBZra aukerak"
|
||||
cbzDpi = "Irudien errendatzeko DPI"
|
||||
cbrOptions = "CBR aukerak"
|
||||
cbrOutputOptions = "PDFtik CBRrako aukerak"
|
||||
cbrDpi = "Irudien errendatzeko DPIa"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBooketik PDFra aukerak"
|
||||
ebookOptionsDesc = "eBookak PDFra bihurtzeko aukerak"
|
||||
embedAllFonts = "Txertatu letra-tipo guztiak"
|
||||
embedAllFontsDesc = "Txertatu eBookeko letra-tipo guztiak sortutako PDFan"
|
||||
includeTableOfContents = "Sartu aurkibidea"
|
||||
includeTableOfContentsDesc = "Gehitu sortutako aurkibidea lortutako PDFari"
|
||||
includePageNumbers = "Sartu orrialde-zenbakiak"
|
||||
includePageNumbersDesc = "Gehitu orrialde-zenbakiak sortutako PDFari"
|
||||
optimizeForEbookPdf = "Optimizatu eBook irakurleetarako"
|
||||
optimizeForEbookPdfDesc = "Optimizatu PDFa eBook irakurketarako (fitxategi-tamaina txikiagoa, errendatze hobea eInk gailuetan)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDFtik eBookerako aukerak"
|
||||
epubOptionsDesc = "PDFa EPUB/AZW3 formatura bihurtzeko aukerak"
|
||||
detectChapters = "Atalak detektatu"
|
||||
detectChaptersDesc = "Kapitulutako antza duten goiburuak detektatu eta EPUB orri-jauziak txertatu"
|
||||
targetDevice = "Helburu gailua"
|
||||
targetDeviceDesc = "Aukeratu irakurgailurako optimizatutako irteera-profila"
|
||||
outputFormat = "Irteera-formatua"
|
||||
outputFormatDesc = "Aukeratu eBookaren irteera-formatua"
|
||||
tabletPhone = "Tableta/Mugikorra (irudiekin)"
|
||||
kindleEink = "Kindle e-Ink (testurako optimizatua)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversion,img,jpg,picture,photo,psd,photoshop"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Gehitu eranskina"
|
||||
remove = "Kendu eranskina"
|
||||
embed = "Txertatu eranskina"
|
||||
convertToPdfA3b = "Bihurtu PDF/A-3b formatura"
|
||||
convertToPdfA3bDescription = "Eranskinak txertatuta dituen artxibatzeko PDF bat sortzen du"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b artxibo-formatua da, epe luzerako kontserbazioa bermatzen duena. Edozein motatako fitxategiak eranskin gisa txertatzea onartzen du. Bihurketak Ghostscript behar du eta fitxategi handietan denbora gehiago har dezake."
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b bihurketari buruz"
|
||||
convertToPdfA3bTooltipTitle = "Zer egiten duen"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Gordeta"
|
||||
label = "Igo sinaduraren irudia"
|
||||
placeholder = "Hautatu irudi-fitxategia"
|
||||
hint = "Igo zure sinaduraren PNG edo JPG irudia"
|
||||
removeBackground = "Kendu atzeko plano zuria (gardendu)"
|
||||
processing = "Irudia prozesatzen..."
|
||||
backgroundRemovalFailedTitle = "Atzeko planoa kentzeak huts egin du"
|
||||
backgroundRemovalFailedMessage = "Ezin izan da irudiaren atzeko planoa kendu. Jatorrizko irudia erabiliko da."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Nola gehitu sinadura"
|
||||
@@ -2434,11 +2351,6 @@ note = "Lautzeak PDFko elementu interaktiboak kentzen ditu, eta ezin editagarri
|
||||
label = "Lautu bakarrik inprimakiak"
|
||||
desc = "Lautu soilik inprimaki-eremuak, beste elementu interaktiboak ukitu gabe utzita"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Errendatze DPIa (aukerakoa, gomendatua 150 DPI)"
|
||||
help = "Utzi hutsik sistemaren lehenetsia erabiltzeko. DPI handiagoak irteera zorrotzagoa ematen du, baina prozesatze denbora eta fitxategi-tamaina handitzen ditu."
|
||||
placeholder = "adib. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Lautze-emaitzak"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Moztu PDF"
|
||||
submit = "Bidali"
|
||||
noFileSelected = "Hautatu PDF fitxategi bat mozten hasteko"
|
||||
reset = "Berrezarri PDF osoa"
|
||||
autoCrop = "Moztu automatikoki zuriuneak"
|
||||
|
||||
[crop.preview]
|
||||
title = "Mozketa-arearen hautapena"
|
||||
@@ -3244,7 +3155,6 @@ title = "Zentsura metodoa"
|
||||
mode = "Modua"
|
||||
automatic = "Automatikoa"
|
||||
automaticDesc = "Bilatu terminoetan oinarrituta testua zentsuratu"
|
||||
automaticDisabledTooltip = "Hautatu fitxategiak fitxategi-kudeatzailean aldi berean hainbat fitxategi zentsuratzeko"
|
||||
manual = "Eskuzkoa"
|
||||
manualDesc = "Egin klik eta arrastatu area zehatzak zentsuratzeko"
|
||||
manualComingSoon = "Eskuzko zentsura laster"
|
||||
@@ -3315,35 +3225,8 @@ text = "Osoko hitzak bakarrik parekatzen ditu, ez partzialak. 'John' ez da 'John
|
||||
title = "Bihurtu PDF-Irudira"
|
||||
text = "Zentsuraren ondoren PDFa irudi-oinarriko PDF bihurtzen du. Honek zentsura-koadroen atzeko testua erabat kendua eta berreskuraezina dela bermatzen du."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Eskuzko zentsura-kontrolak"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Testua markatzeko tresna"
|
||||
text = "Hautatu testua zuzenean PDFan zentsuratzeko markatzeko. Egin klik eta arrastatu zentsuratu nahi duzun testu zehatza nabarmentzeko."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Eremuak markatzeko tresna"
|
||||
text = "Marraztu laukizuzen eremuak PDFan zentsuratu beharreko eremuak markatzeko. Erabilgarria irudiak, sinadurak edo forma irregularrak zentsuratzeko."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplikatu zentsurak"
|
||||
text = "Edukia markatu ondoren, egin klik 'Aplikatu' botoian markatutako eremu guztiak betiko zentsuratzeko. Zain kopuruak zenbat zentsura dauden aplikatzeko prest erakusten du."
|
||||
bullet1 = "Aplikatu aurretik markatu behar adina eremu"
|
||||
bullet2 = "Zain dauden zentsura guztiak batera aplikatzen dira"
|
||||
bullet3 = "Zentsurak ezin dira desegin aplikatu ondoren"
|
||||
|
||||
[redact.manual]
|
||||
title = "Zentsura-tresnak"
|
||||
instructions = "Hautatu testua edo marraztu eremuak PDFan zentsuratzeko edukia markatzeko."
|
||||
markText = "Markatu testua"
|
||||
markArea = "Markatu eremua"
|
||||
pendingLabel = "Zain:"
|
||||
applyWarning = "⚠️ Aplikazio iraunkorra; ezin da desegin eta azpiko datuak ezabatu egingo dira"
|
||||
apply = "Aplikatu"
|
||||
noMarks = "Ez dago zentsura-markarik. Erabili goiko tresnak edukia zentsuratzeko markatzeko."
|
||||
header = "Zentsura eskuz"
|
||||
controlsTitle = "Eskuzko zentsura-kontrolak"
|
||||
textBasedRedaction = "Testuan oinarritutako zentsura"
|
||||
pageBasedRedaction = "Orrietan oinarritutako zentsura"
|
||||
convertPDFToImageLabel = "Bihurtu PDFa PDF-Irudira (koadroaren atzeko testua kentzeko erabiltzen da)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Sartu zatiketa horizontal kopurua"
|
||||
label = "Zatiketa bertikalak"
|
||||
placeholder = "Sartu zatiketa bertikal kopurua"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Zatiketa modua"
|
||||
description = "Aukeratu orriak nola zatitu"
|
||||
splitAll = "Zatitu orri guztiak"
|
||||
splitAllExceptFirst = "Zatitu guztiak, lehena izan ezik"
|
||||
splitAllExceptLast = "Zatitu guztiak, azkena izan ezik"
|
||||
splitAllExceptFirstAndLast = "Zatitu guztiak, lehena eta azkena izan ezik"
|
||||
custom = "Orri pertsonalizatuak"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Orri-zenbaki pertsonalizatuak"
|
||||
placeholder = "adib. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Stamp, Add image, center image, Watermark, PDF, Embed, Customize"
|
||||
header = "Zigilatu PDFa"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDF Orrialde bakarrera"
|
||||
header = "PDF Orrialde bakarrera"
|
||||
submit = "Orrialde bakarrera bihurtu"
|
||||
description = "Tresna honek zure PDFko orri guztiak orri handi bakarrean batuko ditu. Zabalera bera izango du jatorrizko orrienarekin, baina altuera orri guztien altueren batura izango da."
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "orrialde_bakarra"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Hautatu PDF fitxategi bat ikuspegi nagusian hasteko"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Fitxategiaren tamaina"
|
||||
[compress.grayscale]
|
||||
label = "Aplikatu grisezko eskala konpresiorako"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearizatu PDFa webeko ikuspegi azkarrerako"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Bihurtu irudiak marrazki zuri-beltz"
|
||||
description = "ImageMagick erabiliz orriak kontraste handiko zuri-beltzera murrizten ditu tamaina ahalik eta gehien txikitzeko."
|
||||
unavailable = "ImageMagick ez dago instalatuta edo gaituta zerbitzari honetan"
|
||||
detailLevel = "Zehaztasun maila"
|
||||
edgeEmphasis = "Ertzen azpimarra"
|
||||
edgeLow = "Leuna"
|
||||
edgeMedium = "Orekatua"
|
||||
edgeHigh = "Indartsua"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Konpresio ezarpenen ikuspegi orokorra"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Balio altuek fitxategi-tamaina murrizten dute"
|
||||
title = "Gris-eskala"
|
||||
text = "Aukeratu aukera hau irudi guztiak zuri-beltzera bihurtzeko; asko murriztu dezake fitxategiaren tamaina, bereziki eskaneatutako PDFetan edo irudi askoko dokumentuetan."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Marrazki zuri-beltza"
|
||||
text = "Bihurtu orriak kontraste handiko zuri-beltzera ImageMagick erabiliz. Erabili zehaztasun maila edukia zenbateraino bihurtzen den beltz kontrolatzeko, eta ertzen azpimarra ertz-detekzioaren oldarkortasuna kontrolatzeko."
|
||||
|
||||
[compress.error]
|
||||
failed = "Errore bat gertatu da PDFa konprimatzean."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Errore bat gertatu da PDFa konprimatzean."
|
||||
_value = "Konpresio ezarpenak"
|
||||
1 = "1-3 PDF konpresioa,</br> 4-6 irudi-konpresio arina,</br> 7-9 irudi-konpresio bizia Irudien kalitatea nabarmen murriztuko du"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Balio baxuek kalitatea hobeto mantentzen dute, baina fitxategi handiagoak sortzen dituzte"
|
||||
range4to6 = "Ertain-mailako konpresioa, kalitate-galeria moderatuarekin"
|
||||
range7to9 = "Balio altuek fitxategi-tamaina nabarmen murrizten dute, baina irudiaren garbitasuna gutxitu dezakete"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Fitxategi hau pasahitzarekin babestuta dago. Idatzi pasahitza:"
|
||||
cancelled = "Eragiketa bertan behera utzi da PDFarentzat: {0}"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "Ezabatu hautatutako orriak"
|
||||
closePdf = "Itxi PDFa"
|
||||
exportAll = "Esportatu PDFa"
|
||||
downloadSelected = "Deskargatu hautatutako fitxategiak"
|
||||
annotations = "Oharpenak"
|
||||
exportSelected = "Esportatu hautatutako orriak"
|
||||
saveChanges = "Aldaketak gorde"
|
||||
downloadAll = "Deskargatu dena"
|
||||
saveAll = "Gorde dena"
|
||||
toggleTheme = "Gaia txandakatu"
|
||||
toggleBookmarks = "Laster-markak txandakatu"
|
||||
language = "Hizkuntza"
|
||||
toggleAnnotations = "Oharpenen ikusgarritasuna txandakatu"
|
||||
search = "Bilatu PDF"
|
||||
panMode = "Pan modua"
|
||||
applyRedactionsFirst = "Lehenik aplikatu zentsurak"
|
||||
rotateLeft = "Biratu ezkerrera"
|
||||
rotateRight = "Biratu eskuinera"
|
||||
toggleSidebar = "Alboko barra txandakatu"
|
||||
toggleBookmarks = "Laster-markak txandakatu"
|
||||
exportSelected = "Esportatu hautatutako orriak"
|
||||
toggleAnnotations = "Oharpenen ikusgarritasuna txandakatu"
|
||||
annotationMode = "Oharpen modua txandakatu"
|
||||
print = "Inprimatu PDFa"
|
||||
draw = "Marraztu"
|
||||
redact = "Zentsuratu"
|
||||
exitRedaction = "Irten zentsura modutik"
|
||||
save = "Gorde"
|
||||
downloadAll = "Deskargatu dena"
|
||||
saveAll = "Gorde dena"
|
||||
|
||||
[textAlign]
|
||||
left = "Ezkerrera"
|
||||
center = "Erdira"
|
||||
right = "Eskuinera"
|
||||
|
||||
[annotation]
|
||||
title = "Oharrak"
|
||||
desc = "Erabili nabarmentzea, boligrafoa, testua eta oharrak. Aldaketak bere horretan geratzen dira—ez da lautu beharrik."
|
||||
highlight = "Nabarmendu"
|
||||
pen = "Boligrafoa"
|
||||
text = "Testu-koadroa"
|
||||
note = "Oharra"
|
||||
rectangle = "Laukizuzena"
|
||||
ellipse = "Elipsea"
|
||||
select = "Hautatu"
|
||||
exit = "Irten ohar-modutik"
|
||||
strokeWidth = "Zabalera"
|
||||
opacity = "Opakutasuna"
|
||||
strokeOpacity = "Trazuaren opakutasuna"
|
||||
fillOpacity = "Betegarriaren opakutasuna"
|
||||
fontSize = "Letra-tamaina"
|
||||
chooseColor = "Aukeratu kolorea"
|
||||
color = "Kolorea"
|
||||
strokeColor = "Trazuaren kolorea"
|
||||
fillColor = "Betegarriaren kolorea"
|
||||
underline = "Azpimarra"
|
||||
strikeout = "Marratua"
|
||||
squiggly = "Uhin-azpimarra"
|
||||
inkHighlighter = "Eskuzko nabarmentzailea"
|
||||
freehandHighlighter = "Eskuzko nabarmentzailea"
|
||||
square = "Karratua"
|
||||
circle = "Zirkulua"
|
||||
polygon = "Poligonoa"
|
||||
line = "Marra"
|
||||
stamp = "Gehitu irudia"
|
||||
textMarkup = "Testu-markaketa"
|
||||
drawing = "Marrazkia"
|
||||
shapes = "Formak"
|
||||
notesStamps = "Oharrak eta zigiluak"
|
||||
settings = "Ezarpenak"
|
||||
borderOn = "Ertza: aktibo"
|
||||
borderOff = "Ertza: desaktibo"
|
||||
editInk = "Editatu boligrafoa"
|
||||
editLine = "Editatu marra"
|
||||
editNote = "Editatu oharra"
|
||||
editText = "Editatu testu-koadroa"
|
||||
editTextMarkup = "Editatu testu-markaketa"
|
||||
editSelected = "Editatu oharpena"
|
||||
editSquare = "Editatu karratua"
|
||||
editCircle = "Editatu zirkulua"
|
||||
editPolygon = "Editatu poligonoa"
|
||||
unsupportedType = "Oharpen mota hau ez dago guztiz onartuta editatzeko."
|
||||
textAlignment = "Testuaren lerrokatzea"
|
||||
noteIcon = "Oharraren ikonoa"
|
||||
imagePreview = "Aurrebista"
|
||||
contents = "Testua"
|
||||
backgroundColor = "Atzeko planoaren kolorea"
|
||||
clearBackground = "Kendu atzeko planoa"
|
||||
noBackground = "Atzeko planorik ez"
|
||||
stampSettings = "Zigiluaren ezarpenak"
|
||||
savingCopy = "Deskarga prestatzen..."
|
||||
saveFailed = "Ezin da kopia gorde"
|
||||
saveReady = "Deskarga prest"
|
||||
selectAndMove = "Hautatu eta editatu"
|
||||
editSelectDescription = "Egin klik dagoen oharpen batean haren kolorea, opakutasuna, testua edo tamaina editatzeko."
|
||||
editStampHint = "Irudia aldatzeko, ezabatu zigilu hau eta gehitu beste berri bat."
|
||||
editSwitchToSelect = "Aldatu 'Hautatu eta editatu' modura oharpen hau editatzeko."
|
||||
undo = "Desegin"
|
||||
redo = "Berregin"
|
||||
applyChanges = "Aplikatu aldaketak"
|
||||
saveChanges = "Gorde aldaketak"
|
||||
saveChanges = "Aldaketak gorde"
|
||||
|
||||
[search]
|
||||
title = "Bilatu PDF"
|
||||
@@ -4265,20 +4038,12 @@ settings = "Aukerak"
|
||||
adminSettings = "Admin aukerak"
|
||||
allTools = "All Tools"
|
||||
reader = "Irakurri"
|
||||
tours = "Ibilbideak"
|
||||
showMeAround = "Erakutsi ingurunea"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Ikusi hemen ibilbide gidatuak: Tresnen ibilbidea, V2 diseinu berriaren ibilbidea eta Administratzailearen ibilbidea."
|
||||
user = "Ikusi hemen ibilbide gidatuak: Tresnen ibilbidea eta V2 diseinu berriaren ibilbidea."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tresnen ibilaldia"
|
||||
toolsTourDesc = "Ikasi tresnek zer egin dezaketen"
|
||||
adminTour = "Administrazio ibilaldia"
|
||||
adminTourDesc = "Arakatu admin ezarpenak eta ezaugarriak"
|
||||
whatsNewTour = "Ikusi V2ko berritasunak"
|
||||
whatsNewTourDesc = "Egin ibilbidea diseinu eguneratuan"
|
||||
|
||||
[admin]
|
||||
error = "Errorea"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Ezarpenak kargatzeak huts egin du"
|
||||
saveError = "Ezarpenak gordetzeak huts egin du"
|
||||
saved = "Ezarpenak ongi gorde dira"
|
||||
saveSuccess = "Ezarpenak ongi gorde dira"
|
||||
success = "Ezarpenak ongi gorde dira"
|
||||
error = "Ezarpenak gordetzeak huts egin du"
|
||||
save = "Aldaketak gorde"
|
||||
discard = "Baztertu"
|
||||
restartRequired = "Berrabiarazi behar da"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTMLtik PDFra bihurtzeko WeasyPrint exekutagarriaren bide-izena (
|
||||
label = "Unoconvert exekutagarria"
|
||||
description = "Dokumentu-bihurketetarako LibreOffice unoconvert-en bide-izena (utzi hutsik lehenetsia erabiltzeko: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Frontendarentzako oinarrizko URL (adib., https://pdf.example.com). Postaz bidalitako gonbidapen esteketarako eta mugikorreko QR kode bidezko igoeretarako erabiltzen da. Utzi hutsik backend URLa erabiltzeko."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Egin klik planaren xehetasunak ikusteko"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Segurtasuna"
|
||||
description = "Konfiguratu autentifikazioa, saio-hasieraren portaera eta segurtasun-politikak."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Konektatu"
|
||||
disconnect = "Deskonektatu"
|
||||
disconnected = "Hornitzailea ondo deskonektatu da"
|
||||
disconnectError = "Hornitzailea deskonektatzeak huts egin du"
|
||||
mobileScannerConvertToPdf = "Bihurtu irudiak PDFra"
|
||||
mobileScannerConvertToPdfDesc = "Igotako irudiak automatikoki PDF formatura bihurtzen ditu. Desgaituta badago, irudiak bere horretan mantenduko dira."
|
||||
mobileScannerImageResolution = "Irudiaren bereizmena"
|
||||
mobileScannerImageResolutionDesc = "Igotako irudien bereizmena. \"Murriztua\" aukerak irudiak gehienez 1200px-ra eskalatzen ditu fitxategi-tamaina murrizteko."
|
||||
imageResolutionFull = "Osoa (Jatorrizko tamaina)"
|
||||
imageResolutionReduced = "Murriztua (Gehienez 1200px)"
|
||||
mobileScannerPageFormat = "Orri-formatua"
|
||||
mobileScannerPageFormatDesc = "Bihurtutako irudientzako PDF orriaren tamaina. \"Mantendu\" aukerak irudiaren jatorrizko neurriak erabiltzen ditu."
|
||||
pageFormatKeep = "Mantendu (jatorrizko neurriak)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Doitu betetzeko"
|
||||
mobileScannerStretchToFitDesc = "Irudiak luzatu orri osoa betetzeko. Desgaituta badago, irudiak erdian jarriko dira itxura-erlazioa mantenduta."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO saio-hasiera automatikoa"
|
||||
@@ -4646,122 +4389,6 @@ description = "Lehen SAML2 saio-hasieraan automatikoki sortu erabiltzaile-kontua
|
||||
label = "Erregistroa blokeatu"
|
||||
description = "Erabiltzaile berrien erregistroa saihestu SAML2 bidez"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Telefono mugikorretik kargatzea"
|
||||
enable = "Gaitu QR kode bidezko kargaketa"
|
||||
description = "Baimendu erabiltzaileei mugikorretik fitxategiak igotzea QR kodea eskaneatuz"
|
||||
note = "Oharra: Frontend URLa konfiguratuta egotea behar du. "
|
||||
link = "Konfiguratu sistemaren ezarpenetan"
|
||||
mobileScannerConvertToPdf = "Bihurtu irudiak PDFra"
|
||||
mobileScannerConvertToPdfDesc = "Igotako irudiak automatikoki PDF formatura bihurtzen ditu. Desgaituta badago, irudiak bere horretan mantenduko dira."
|
||||
mobileScannerImageResolution = "Irudiaren bereizmena"
|
||||
mobileScannerImageResolutionDesc = "Igotako irudien bereizmena. \"Murriztua\" aukerak irudiak gehienez 1200px-ra eskalatzen ditu fitxategi-tamaina murrizteko."
|
||||
imageResolutionFull = "Osoa (Jatorrizko tamaina)"
|
||||
imageResolutionReduced = "Murriztua (Gehienez 1200px)"
|
||||
mobileScannerPageFormat = "Orri-formatua"
|
||||
mobileScannerPageFormatDesc = "Bihurtutako irudientzako PDF orriaren tamaina. \"Mantendu\" aukerak irudiaren jatorrizko neurriak erabiltzen ditu."
|
||||
pageFormatKeep = "Mantendu (jatorrizko neurriak)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Doitu betetzeko"
|
||||
mobileScannerStretchToFitDesc = "Irudiak luzatu orri osoa betetzeko. Desgaituta badago, irudiak erdian jarriko dira itxura-erlazioa mantenduta."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram bot-a"
|
||||
description = "Konfiguratu Telegram bot-aren konektibitatea, atzipen-kontrolak eta atzeraelikadura-portaera."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Gaitu Telegram bot-a"
|
||||
description = "Baimendu erabiltzaileek Stirling PDFekin elkarreragitea konfiguratutako Telegram bot-aren bidez."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot-aren erabiltzaile-izena"
|
||||
description = "Zure Telegram bot-aren erabiltzaile-izen publikoa."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot tokena"
|
||||
description = "BotFather-ek emandako API tokena zure Telegram bot-arentzat."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Sarrerako karpeta"
|
||||
description = "Pipeline direktorioaren azpiko karpeta, bertan gordetzen dira Telegrametik datozen fitxategiak."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Erabili karpeta-atzizki pertsonalizatua"
|
||||
description = "Erantsi txataren IDa sarrerako fitxategi-karpetetan, karga bakoitza txataren arabera isolatzeko."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Atzipen-kontrola"
|
||||
description = "Mugatu zein erabiltzaile edo kanalek elkarreragin dezaketen botarekin."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Baimendu erabiltzaile ID zehatzak"
|
||||
description = "Gaituta dagoenean, zerrendatutako erabiltzaile IDek bakarrik erabil dezakete bota."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Baimendutako erabiltzaile IDak"
|
||||
description = "Sartu botarekin elkarreragin dezaketen Telegram erabiltzaile IDak."
|
||||
placeholder = "Gehitu erabiltzaile IDa eta sakatu Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Baimendu kanal ID zehatzak"
|
||||
description = "Gaituta dagoenean, zerrendatutako kanal IDek bakarrik erabil dezakete bota."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Baimendutako kanal IDak"
|
||||
description = "Sartu botarekin elkarreragin dezaketen Telegram kanal IDak."
|
||||
placeholder = "Gehitu kanal IDa eta sakatu Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Prozesatzea"
|
||||
description = "Kontrolatu kontsulta-tarteak eta prozesatzearen denbora-mugak Telegram bidezko igoeretan."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Prozesatzearen denbora-muga (segundoak)"
|
||||
description = "Akatsa jakinarazi aurretik prozesatze-lan baten zain egoteko gehieneko denbora."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Kontsulta-tartea (ms)"
|
||||
description = "Telegram eguneratze berriak egiaztatzeko tarteen arteko denbora."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Atzeraelikadura-mezuak"
|
||||
description = "Aukeratu botak noiz bidali behar duen atzeraelikadura erabiltzaileei eta kanalei."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Gaitu atzeraelikadura"
|
||||
description = "Kontrolatu botak atzeraelikadura-mezuak bidaliko dituen edo ez."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Kanaleko atzeraelikadura arauak"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Erakutsi \"Dokumentu baliodunik ez\" (kanala)"
|
||||
description = "Ezkutatu dokumentu baliodunik ez erantzuna kanal igoeretan."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Erakutsi prozesatze-erroreak (kanala)"
|
||||
description = "Bidali prozesatze-erroreen mezuak kanalei."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Erakutsi errore-mezuak (kanala)"
|
||||
description = "Erakutsi errore-mezu zehatzak kanaletarako."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Erabiltzaileentzako atzeraelikadura arauak"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Erakutsi \"Dokumentu baliodunik ez\" (erabiltzailea)"
|
||||
description = "Ezkutatu 'dokumentu baliodunik ez' erantzuna erabiltzaileen igoeretan."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Erakutsi prozesatze-erroreak (erabiltzailea)"
|
||||
description = "Bidali prozesatze-erroreen mezuak erabiltzaileei."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Erakutsi errore-mezuak (erabiltzailea)"
|
||||
description = "Erakutsi errore-mezu zehatzak erabiltzaileentzat."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Datu-basea"
|
||||
description = "Konfiguratu datu-base konexio pertsonalizatuak enpresa-hedapenetarako."
|
||||
@@ -4888,7 +4515,7 @@ description = "Sistema zabalagoko aldi baterako direktorioa garbitu ala ez (kont
|
||||
label = "Prozesu-exekutorearen mugak"
|
||||
description = "Konfiguratu saio-mugak eta denbora-mugak prozesu-exekutore bakoitzerako"
|
||||
libreOffice = "LibreOffice"
|
||||
pdfToHtml = "PDF to HTML"
|
||||
pdfToHtml = "PDFtik HTMLra"
|
||||
qpdf = "QPDF"
|
||||
tesseract = "Tesseract OCR"
|
||||
pythonOpenCv = "Python OpenCV"
|
||||
@@ -4943,10 +4570,6 @@ description = "Baimendu administratzaileei erabiltzaileak posta elektronikoz gon
|
||||
label = "Frontend URLa"
|
||||
description = "Frontend-aren oinarrizko URLa (adib. https://pdf.example.com). Postako gonbidapen estekak sortzeko erabiltzen da. Utzi hutsik backend URLa erabiltzeko."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Oharra: Frontend URLa konfiguratuta egotea behar du. "
|
||||
link = "Konfiguratu sistemaren ezarpenetan"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Dokumentazio legala"
|
||||
description = "Konfiguratu dokumentu eta politika legaletarako estekak."
|
||||
@@ -4972,7 +4595,7 @@ label = "Cookieen politika"
|
||||
description = "Cookieen politikara doan URLa edo fitxategi-izena"
|
||||
|
||||
[admin.settings.legal.impressum]
|
||||
label = "Impressum"
|
||||
label = "Lege oharra"
|
||||
description = "Impressum-era doan URLa edo fitxategi-izena (beharrezkoa jurisdikzio batzuetan)"
|
||||
|
||||
[admin.settings.premium]
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Nire fitxategiak"
|
||||
noRecentFiles = "Ez da azken fitxategirik aurkitu"
|
||||
googleDriveNotAvailable = "Google Drive integrazioa ez dago erabilgarri"
|
||||
mobileUpload = "Mugikorretik kargatzea"
|
||||
mobileShort = "Mugikorra"
|
||||
mobileUploadNotAvailable = "Mugikorreko kargaketa ez dago gaituta"
|
||||
downloadSelected = "Deskargatu hautatutakoak"
|
||||
saveSelected = "Hautatutakoa gorde"
|
||||
openFiles = "Ireki fitxategiak"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Kargatzen..."
|
||||
back = "Atzera"
|
||||
continue = "Jarraitu"
|
||||
error = "Errorea"
|
||||
save = "Gorde"
|
||||
|
||||
[config.overview]
|
||||
title = "Aplikazioaren konfigurazioa"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Gako hauek erabiltzen dituzten aplikazio edo zerbitzu guztiek funtzion
|
||||
confirmPrompt = "Ziur jarraitu nahi duzula?"
|
||||
confirmCta = "Gakoak berritu"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API gakoaren errorea"
|
||||
failedToCreateApiKey = "Huts egin du API gakoa sortzeak."
|
||||
failedToRetrieveApiKey = "Ezin izan da erantzunetik API gakoa eskuratu."
|
||||
failedToFetchApiKey = "Ezin izan da API gakoa lortu."
|
||||
apiKeyRefreshed = "API gakoa freskatu da"
|
||||
apiKeyRefreshedBody = "Zure API gakoa ongi freskatu da."
|
||||
failedToRefreshApiKey = "Ezin izan da API gakoa freskatu."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Eranskinak hautatu"
|
||||
info = "Hautatu zure PDFari eransteko fitxategiak. Fitxategi hauek txertatuta egongo dira eta PDFaren eranskin-paneletik eskuragarri."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Amaitu"
|
||||
startTour = "Hasi bira"
|
||||
startTourDescription = "Stirling PDFren ezaugarri nagusien gida-bira"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Hasi <strong>Sarbide azkarraren</strong> errailean Irakurlearen, Automatizazioaren, zure fitxategien eta ibilbide guztien artean jauzi egiteko."
|
||||
leftPanel = "Ezkerreko <strong>Tresnak</strong> panelean egin ditzakezun guztiak zerrendatzen dira. Arakatu kategoriak edo bilatu tresna bat azkar aurkitzeko."
|
||||
fileUpload = "Erabili <strong>Fitxategiak</strong> botoia PDF bat kargatzeko edo azkenetako bat hautatzeko. Lagina kargatuko dugu lan-eremua ikus dezazun."
|
||||
rightRail = "<strong>Eskuineko errailak</strong> fitxategiak hautatzeko, gaia edo hizkuntza aldatzeko eta emaitzak deskargatzeko ekintza azkarrak ditu."
|
||||
topBar = "Goiko barrak <strong>Ikustaile</strong>, <strong>Orrialde-editorea</strong> eta <strong>Fitxategi aktiboak</strong> artean aldatzeko aukera ematen du."
|
||||
pageEditorView = "Aldatu Orrialde-editorera orriak berrantolatzeko, biratzeko edo ezabatzeko."
|
||||
activeFilesView = "Erabili Fitxategi aktiboak irekitako guztia ikusteko eta zerrekin lan egin hautatzeko."
|
||||
wrapUp = "Hori da V2ko berritasuna. Ireki <strong>Ibilbideak</strong> menua edozein unetan hau, Tresnen ibilbidea edo Administratzailearen ibilbidea berriro ikusteko."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Ongi etorri Stirling PDFra!"
|
||||
description = "1 minutuko bisita azkar bat egin nahi duzu funtsezko ezaugarriak eta nola hasi ikasteko?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Deskargatu →"
|
||||
showMeAround = "Erakutsi ingurunea"
|
||||
skipTheTour = "Utzi bisita gidatua"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Ibilbidearen ikuspegi orokorra"
|
||||
body = "Stirling PDF V2k dozenaka tresna eta diseinu berritua dakartza. Egin ibilbide azkar bat aldaketak eta behar dituzun funtzioak non dauden ikusteko."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Utzi oraingoz"
|
||||
seePlans = "Ikusi planak →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Eguneratu orain →"
|
||||
freeTitle = "Zerbitzari-lizentzia"
|
||||
overLimitTitle = "Beharrezkoa da zerbitzari-lizentzia"
|
||||
overLimitBody = "Gure lizentziak baimentzen ditu <strong>{{freeTierLimit}}</strong> erabiltzaile doan zerbitzari bakoitzeko. <strong>{{overLimitUserCopy}}</strong> Stirling erabiltzaile dituzu. Jarraitzeko etenik gabe, eguneratu Stirling Server planera - <strong>eserleku mugagabeak</strong>, PDF testu-edizioa, eta admin kontrol osoa $99/zerbitzari/hilean."
|
||||
freeBody = "Gure <strong>Open-Core</strong> lizentziak <strong>{{freeTierLimit}}</strong> erabiltzaile arte baimentzen ditu doan zerbitzari bakoitzeko. Etenik gabe eskalatzeko eta gure <strong>PDF testu-edizio tresna</strong> berrirako sarbide goiztiarra lortzeko, gomendatzen dugu Stirling Server plana - edizio osoa eta <strong>eserleku mugagabeak</strong> $99/zerbitzari/hilean."
|
||||
freeBody = "Gure <strong>Open-Core</strong> lizentziak zerbitzari bakoitzeko doan gehienez <strong>{{freeTierLimit}}</strong> erabiltzaile baimentzen ditu. Etenik gabe eskalatzeko, Stirling Server plana gomendatzen dugu - <strong>eserleku mugagabeak</strong> eta <strong>SSO euskarria</strong> $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Deskargatu"
|
||||
@@ -5712,7 +5308,7 @@ active = "Aktibo"
|
||||
disabled = "Desgaituta"
|
||||
activeSession = "Saio aktiboa"
|
||||
member = "Kidea"
|
||||
admin = "Admin"
|
||||
admin = "Administratzailea"
|
||||
editRole = "Rola editatu"
|
||||
enable = "Gaitu"
|
||||
disable = "Desgaitu"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Jarri salmentekin harremanetan"
|
||||
contactToUpgrade = "Jarri gurekin harremanetan zure plana bertsio-berritzeko edo pertsonalizatzeko"
|
||||
maxUsers = "Erabiltzaile kopuru maximoa"
|
||||
upTo = "Gehienez"
|
||||
getLicense = "Eskuratu zerbitzari-lizentzia"
|
||||
upgradeToEnterprise = "Eguneratu Enterprise bertsiora"
|
||||
selectPeriod = "Aukeratu fakturazio epea"
|
||||
monthlyBilling = "Hileko fakturazioa"
|
||||
yearlyBilling = "Urteko fakturazioa"
|
||||
checkoutOpened = "Ordainketa orria irekita"
|
||||
checkoutInstructions = "Amaitu zure erosketa Stripe fitxan. Ordainketa egin ondoren, itzuli hona eta freskatu orria lizentzia aktibatzeko. Lizentzia-gakoa ere posta elektronikoz jasoko duzu."
|
||||
activateLicense = "Aktibatu zure lizentzia"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Ordainketa orria fitxa berrian irekita"
|
||||
instructions = "Amaitu zure erosketa Stripe fitxan. Ordainketa osatuta dagoenean, lizentzia-gakoarekin posta bat jasoko duzu."
|
||||
enterKey = "Sartu behean zure lizentzia-gakoa plana aktibatzeko:"
|
||||
keyDescription = "Itsatsi lizentzia-gakoa zure postatik"
|
||||
activate = "Aktibatu lizentzia"
|
||||
doLater = "Geroago egingo dut"
|
||||
success = "Lizentzia aktibatuta!"
|
||||
successMessage = "Zure lizentzia ongi aktibatu da. Orain leiho hau itxi dezakezu."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Posta elektronikoaren egiaztapena behar da"
|
||||
message = "Zure helbide elektronikoa egiaztatu beharko duzu Stripe-ren fakturazio atarian. Begiratu zure posta saioa hasteko esteka baten bila."
|
||||
|
||||
[plan.period]
|
||||
month = "hilabete"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Auditoretza-sistema ez dago eskuragarri"
|
||||
notAvailableMessage = "Auditoretza-sistema ez dago konfiguratuta edo ez dago eskuragarri."
|
||||
disabled = "Auditoretza-erregistroa desgaituta dago"
|
||||
disabledMessage = "Gaitu auditoretza-erregistroa zure aplikazioaren konfigurazioan sistemaren gertaerak jarraitzeko."
|
||||
enterpriseRequired = "Enterprise lizentzia behar da"
|
||||
enterpriseRequiredMessage = "Ikuskaritza-erregistroen sistema Enterprise ezaugarria da. Eguneratu Enterprise lizentziara auditoretza-erregistroak eta analitikak atzitzeko."
|
||||
|
||||
[audit.error]
|
||||
title = "Errorea auditoretza-sistema kargatzean"
|
||||
@@ -6292,7 +5864,7 @@ title = "Endpoints erabileraren diagrama"
|
||||
|
||||
[usage.table]
|
||||
title = "Estatistika xeheak"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Amaiera-puntua"
|
||||
visits = "Bisitak"
|
||||
percentage = "Ehunekoa"
|
||||
noData = "Ez dago daturik eskuragarri"
|
||||
@@ -6370,7 +5942,6 @@ description = "Sartu zure auto-ostatuko Stirling PDF zerbitzariaren URLa osoa"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Sartu zerbitzari baten URLa"
|
||||
invalidUrl = "URL formatua baliogabea. Sartu baliozko URL bat, adibidez https://your-server.com"
|
||||
unreachable = "Ezin izan da zerbitzarira konektatu"
|
||||
testFailed = "Konexio proba huts egin du"
|
||||
configFetch = "Ezin izan da zerbitzariaren konfigurazioa eskuratu. Egiaztatu URLa eta saiatu berriro."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Hona konektatzen:"
|
||||
submit = "Hasi saioa"
|
||||
signInWith = "Hasi saioa honekin"
|
||||
oauthPending = "Nabigatzailea irekitzen autentifikaziorako..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Edo jarraitu emailarekin"
|
||||
serverRequirement = "Oharra: zerbitzariak saioa hastea gaituta eduki behar du."
|
||||
showInstructions = "Nola gaitu?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Paragrafo orria"
|
||||
sparse = "Testu sakabanatua"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automatikoa"
|
||||
paragraph = "Paragrafoa"
|
||||
singleLine = "Lerro bakarra"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Aldaketak berrezarri"
|
||||
downloadJson = "JSON deskargatu"
|
||||
generatePdf = "PDF sortu"
|
||||
saveChanges = "Gorde aldaketak"
|
||||
applyChanges = "Aplikatu aldaketak"
|
||||
downloadCopy = "Deskargatu kopia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Testua automatikoki eskalatu kutxetara egokitzeko"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Aholkua: Eutsi sakatuta Ctrl (Cmd) edo Shift testu-kutxa an
|
||||
title = "Editatutako testua PDF elementu bakarrera lotu"
|
||||
description = "Gaituta dagoenean, editoreak editatutako testu-kutxa bakoitza PDFko testu-elementu bakar gisa esportatzen du, glifoen gainjartzeak edo letra-tipo nahasiak saihesteko."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Ezarpen aurreratuak"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Aurrebistaren mugak"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Testu eta irudien fokua"
|
||||
text = "Lan-eremu honek testua editatzean eta txertatutako irudiak berrantolatzean jartzen du fokua. Orrialdeko arte lan konplexuak, inprimaki-trepetak eta geruzadun grafikoak esportaziorako mantentzen dira, baina hemen ez dira guztiz editagarriak."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Aurrebistaren aldakortasuna"
|
||||
text = "Zenbait bisual (taulen ertzak, formak edo oharpenen itxura kasu) agian ez dira zehazki erakutsiko aurrebistan. Esportatutako PDFak jatorrizko marrazketa-aginduak mantentzen ditu ahal denean."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha ikustailea"
|
||||
text = "Alpha ikustaile hau oraindik eboluzionatzen ari da—zenbait letra-tipo, kolore, gardentasun-efektu eta diseinu xehetasun pixka bat aldatu daitezke. Egiaztatu ongi sortutako PDFa partekatu aurretik."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Hautatutako kutxak batu"
|
||||
merge = "Hautapena batu"
|
||||
@@ -6614,58 +6164,3 @@ title = "Testua gehitzearen emaitzak"
|
||||
|
||||
[addText.error]
|
||||
failed = "Errore bat gertatu da testua PDFari gehitzean."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Kargatu mugikorretik"
|
||||
description = "Eskaneatu argazkiak igotzeko. Irudiak automatikoki PDFra bihurtzen dira."
|
||||
descriptionNoConvert = "Eskaneatu argazkiak zure gailu mugikorretik igotzeko."
|
||||
error = "Konexio-errorea"
|
||||
pollingError = "Errorea fitxategiak egiaztatzean"
|
||||
sessionId = "Saioaren IDa"
|
||||
sessionCreateError = "Ezin izan da saioa sortu"
|
||||
expiryWarning = "Saioa laster iraungiko da"
|
||||
expiryWarningMessage = "QR kode hau {{seconds}} segundotan iraungiko da. Kode berria automatikoki sortuko da."
|
||||
filesReceived = "Jasota: {{count}} fitxategi"
|
||||
connected = "Gailu mugikorra konektatuta"
|
||||
instructions = "Eskaneatu telefonoaren kamerarekin. Irudiak automatikoki PDFra bihurtzen dira."
|
||||
instructionsNoConvert = "Eskaneatu telefonoaren kamerarekin fitxategiak igotzeko."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mugikorreko eskaneatzailea"
|
||||
noSession = "Saio baliogabea"
|
||||
noSessionMessage = "Eskaneatu baliozko QR kode bat orri honetara sartzeko."
|
||||
validating = "Saioa balioztatzen..."
|
||||
sessionInvalid = "Saio-errorea"
|
||||
sessionExpired = "Saio hau iraungi da. Freskatu eta saiatu berriro."
|
||||
sessionNotFound = "Ez da saioa aurkitu. Freskatu eta saiatu berriro."
|
||||
sessionValidationError = "Ezin da saioa egiaztatu. Saiatu berriro."
|
||||
uploadSuccess = "Kargaketa arrakastatsua!"
|
||||
uploadSuccessMessage = "Zure irudiak transferitu dira."
|
||||
httpsRequired = "Kamerarako sarbideak HTTPS edo localhost behar du. Erabili HTTPS edo sartu localhost bidez."
|
||||
uploadFailed = "Kargaketak huts egin du. Saiatu berriro."
|
||||
uploading = "Kargatzen..."
|
||||
connected = "Konektatuta"
|
||||
connecting = "Konektatzen..."
|
||||
chooseMethod = "Aukeratu kargaketa-metodoa"
|
||||
chooseMethodDescription = "Hautatu dokumentuak nola eskaneatu eta igo nahi dituzun"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Eskaneatu dokumentuak zure gailuaren kamerarekin, ertz automatikoz detektatuta"
|
||||
fileUpload = "Fitxategi-igoera"
|
||||
fileDescription = "Igo dauden argazkiak edo dokumentuak zure gailutik"
|
||||
cameraAccessDenied = "Kamerarako sarbidea ukatu da. Gaitu kamerarako sarbidea."
|
||||
back = "Atzera"
|
||||
settings = "Ezarpenak"
|
||||
edgeDetection = "Ertz-detekzioa"
|
||||
flashlight = "Lanpara"
|
||||
flash = "Flash"
|
||||
processing = "Prozesatzen..."
|
||||
capture = "Atera argazkia"
|
||||
selectFilesPrompt = "Hautatu igoko diren fitxategiak"
|
||||
selectImage = "Hautatu irudia"
|
||||
preview = "Aurrebista"
|
||||
retake = "Berriz atera"
|
||||
addToBatch = "Gehitu lotean"
|
||||
upload = "Igo"
|
||||
batchImages = "Lotea"
|
||||
clearBatch = "Garbitu"
|
||||
uploadAll = "Igo dena"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "شما تغییرات ذخیرهنشدهای در PDF دارید."
|
||||
pendingRedactionsTitle = "سانسورهای اعمالنشده"
|
||||
pendingRedactions = "شما سانسورهای اعمالنشدهای دارید که از دست خواهند رفت."
|
||||
areYouSure = "مطمئنید میخواهید خارج شوید؟"
|
||||
unsavedChangesTitle = "تغییرات ذخیرهنشده"
|
||||
keepWorking = "ادامه کار"
|
||||
discardChanges = "لغو تغییرات و خروج"
|
||||
discardRedactions = "حذف و خروج"
|
||||
applyAndContinue = "ذخیره و خروج"
|
||||
exportAndContinue = "خروجی بگیرید و ادامه دهید"
|
||||
cancel = "انصراف"
|
||||
@@ -343,10 +340,6 @@ advance = "پیشرفته"
|
||||
edit = "مشاهده و ویرایش"
|
||||
popular = "محبوب"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "ترجیحات"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "پیشرفته"
|
||||
title = "امنیت و احراز هویت"
|
||||
security = "امنیت"
|
||||
connections = "اتصالات"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "مجوزها و آنالیتیکس"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "نسخه فعلی"
|
||||
latestVersion = "آخرین نسخه"
|
||||
checkForUpdates = "بررسی بهروزرسانی"
|
||||
viewDetails = "مشاهده جزئیات"
|
||||
serverNeedsUpdate = "سرور باید توسط مدیر بهروزرسانی شود"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "اطلاعات نسخه"
|
||||
description = "جزئیات نسخه دسکتاپ و سرور"
|
||||
desktop = "نسخه دسکتاپ"
|
||||
server = "نسخه سرور"
|
||||
|
||||
[settings.security]
|
||||
title = "امنیت"
|
||||
description = "رمز عبور خود را بهروزرسانی کنید تا حسابتان ایمن بماند."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "رمز عبور خود را تغییر دهید. پس از بهروزرسانی از حساب خارج خواهید شد."
|
||||
required = "همه فیلدها الزامی هستند."
|
||||
mismatch = "رمزهای عبور جدید با هم مطابقت ندارند."
|
||||
error = "امکان بهروزرسانی رمز عبور نیست. لطفاً رمز عبور فعلی خود را بررسی کرده و دوباره تلاش کنید."
|
||||
success = "رمز عبور با موفقیت بهروزرسانی شد. لطفاً دوباره وارد شوید."
|
||||
ssoDisabled = "تغییر رمز عبور توسط ارائهدهنده هویت شما مدیریت میشود."
|
||||
current = "رمز عبور فعلی"
|
||||
currentPlaceholder = "رمز عبور فعلی خود را وارد کنید"
|
||||
new = "رمز عبور جدید"
|
||||
newPlaceholder = "یک رمز عبور جدید وارد کنید"
|
||||
confirm = "تأیید رمز عبور جدید"
|
||||
confirmPlaceholder = "رمز عبور جدید خود را دوباره وارد کنید"
|
||||
update = "بهروزرسانی رمز عبور"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "میانبرهای صفحهکلید"
|
||||
@@ -522,16 +488,11 @@ low = "کم"
|
||||
title = "تغییر مشخصات"
|
||||
header = "بهروزرسانی جزئیات حساب کاربری"
|
||||
changePassword = "شما از مشخصات پیشفرض ورود استفاده میکنید. لطفاً یک رمز عبور جدید وارد کنید"
|
||||
ssoManaged = "حساب شما توسط ارائهدهنده هویت شما مدیریت میشود."
|
||||
newUsername = "نام کاربری جدید"
|
||||
oldPassword = "رمز عبور فعلی"
|
||||
newPassword = "رمز عبور جدید"
|
||||
confirmNewPassword = "تأیید رمز عبور جدید"
|
||||
submit = "ثبت تغییرات"
|
||||
credsUpdated = "حساب بهروزرسانی شد"
|
||||
description = "تغییرات ذخیره شد. لطفاً دوباره وارد شوید."
|
||||
error = "امکان بهروزرسانی نام کاربری نیست. لطفاً رمز عبور خود را بررسی کرده و دوباره تلاش کنید."
|
||||
changeUsername = "نام کاربری خود را بهروزرسانی کنید. پس از بهروزرسانی از حساب خارج خواهید شد."
|
||||
|
||||
[account]
|
||||
title = "تنظیمات حساب"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "تنظیمات حساب"
|
||||
adminSettings = "تنظیمات ادمین - مشاهده و اضافه کردن کاربران"
|
||||
userControlSettings = "تنظیمات کنترل کاربران"
|
||||
changeUsername = "تغییر نام کاربری"
|
||||
changeUsernameDescription = "نام کاربری خود را بهروزرسانی کنید. پس از بهروزرسانی از حساب خارج خواهید شد."
|
||||
newUsernamePlaceholder = "نام کاربری جدید خود را وارد کنید"
|
||||
newUsername = "نام کاربری جدید"
|
||||
password = "رمز عبور تأییدیه"
|
||||
oldPassword = "رمز عبور قدیمی"
|
||||
@@ -749,11 +708,6 @@ tags = "امضا,دستخط"
|
||||
title = "امضا"
|
||||
desc = "افزودن امضا به PDF با کشیدن، متن یا تصویر"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotate,highlight,draw"
|
||||
title = "حاشیهنویسی"
|
||||
desc = "هایلایت، رسم، افزودن یادداشت و شکلها در نمایشگر"
|
||||
|
||||
[home.flatten]
|
||||
tags = "سادهسازی,حذف,تعامل"
|
||||
title = "تسطیح"
|
||||
@@ -965,7 +919,7 @@ title = "همپوشانی PDFها"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "ویرایشگر متن PDF"
|
||||
desc = "بازبینی و ویرایش خروجیهای JSON Stirling PDF با ویرایش گروهی متن و بازتولید PDF"
|
||||
desc = "ویرایش متن و تصاویر موجود در PDFها"
|
||||
|
||||
[home.addText]
|
||||
tags = "متن,حاشیهنویسی,برچسب"
|
||||
@@ -976,7 +930,6 @@ desc = "افزودن متن دلخواه در هر جای PDF"
|
||||
addFiles = "افزودن فایلها"
|
||||
uploadFromComputer = "بارگذاری از رایانه"
|
||||
openFromComputer = "باز کردن از رایانه"
|
||||
mobileUpload = "آپلود از موبایل"
|
||||
|
||||
[viewPdf]
|
||||
tags = "مشاهده،خواندن،حاشیهنویسی،متن،تصویر"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "گزینههای CBZ به PDF"
|
||||
optimizeForEbook = "بهینهسازی PDF برای کتابخوانها (از Ghostscript استفاده میکند)"
|
||||
cbzOutputOptions = "گزینههای PDF به CBZ"
|
||||
cbzDpi = "DPI برای رندر تصویر"
|
||||
cbrOptions = "گزینههای CBR"
|
||||
cbrOutputOptions = "گزینههای PDF به CBR"
|
||||
cbrDpi = "DPI برای رندر تصویر"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "گزینههای eBook به PDF"
|
||||
ebookOptionsDesc = "گزینههای تبدیل eBook به PDF"
|
||||
embedAllFonts = "جاسازی همه فونتها"
|
||||
embedAllFontsDesc = "همه فونتهای eBook را در PDF تولیدشده جاسازی کن"
|
||||
includeTableOfContents = "شامل فهرست مطالب"
|
||||
includeTableOfContentsDesc = "افزودن فهرست مطالب تولیدشده به PDF حاصل"
|
||||
includePageNumbers = "شامل شماره صفحات"
|
||||
includePageNumbersDesc = "افزودن شماره صفحات به PDF تولیدشده"
|
||||
optimizeForEbookPdf = "بهینهسازی برای خوانندگان eBook"
|
||||
optimizeForEbookPdfDesc = "بهینهسازی PDF برای خواندن eBook (حجم فایل کمتر، رندر بهتر روی دستگاههای eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "گزینههای PDF به eBook"
|
||||
epubOptionsDesc = "گزینههای تبدیل PDF به EPUB/AZW3"
|
||||
detectChapters = "شناسایی فصلها"
|
||||
detectChaptersDesc = "شناسایی عناوینی که شبیه فصل هستند و درج شکست صفحه EPUB"
|
||||
targetDevice = "دستگاه هدف"
|
||||
targetDeviceDesc = "یک پروفایل خروجی بهینهشده برای دستگاه خوانش انتخاب کنید"
|
||||
outputFormat = "فرمت خروجی"
|
||||
outputFormatDesc = "فرمت خروجی eBook را انتخاب کنید"
|
||||
tabletPhone = "تبلت/گوشی (بههمراه تصاویر)"
|
||||
kindleEink = "Kindle e-Ink (بهینهشده برای متن)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "تبدیل،عکس،jpg،تصویر،عکس"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "افزودن پیوست"
|
||||
remove = "حذف پیوست"
|
||||
embed = "جاسازی پیوست"
|
||||
convertToPdfA3b = "تبدیل به PDF/A-3b"
|
||||
convertToPdfA3bDescription = "یک PDF آرشیوی با پیوستهای توکار ایجاد میکند"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b یک فرمت آرشیوی برای حفظ بلندمدت است. این فرمت اجازه میدهد هر نوع فرمت فایلی را بهعنوان پیوست جاسازی کنید. تبدیل نیازمند Ghostscript است و ممکن است برای فایلهای بزرگ بیشتر زمان ببرد."
|
||||
convertToPdfA3bTooltipHeader = "درباره تبدیل PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "عملکرد آن"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "ذخیرهشده"
|
||||
label = "بارگذاری تصویر امضا"
|
||||
placeholder = "انتخاب فایل تصویر"
|
||||
hint = "یک تصویر PNG یا JPG از امضای خود بارگذاری کنید"
|
||||
removeBackground = "حذف پسزمینه سفید (شفافسازی)"
|
||||
processing = "در حال پردازش تصویر..."
|
||||
backgroundRemovalFailedTitle = "حذف پسزمینه ناموفق بود"
|
||||
backgroundRemovalFailedMessage = "امکان حذف پسزمینه از تصویر نبود. از تصویر اصلی استفاده میشود."
|
||||
|
||||
[sign.instructions]
|
||||
title = "چگونه امضا اضافه کنیم"
|
||||
@@ -2434,11 +2351,6 @@ note = "تختسازی عناصر تعاملی را از PDF حذف میک
|
||||
label = "فقط فرمها را یکپارچه کن"
|
||||
desc = "فقط فیلدهای فرم را تختسازی کن و سایر عناصر تعاملی را دستنخورده بگذار"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI رندر (اختیاری، 150 DPI توصیه میشود)"
|
||||
help = "برای استفاده از پیشفرض سیستم خالی بگذارید. DPI بالاتر خروجی را شارپتر میکند اما زمان پردازش و اندازه فایل را افزایش میدهد."
|
||||
placeholder = "مثلاً 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "نتایج تختسازی"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "برش PDF"
|
||||
submit = "ارسال"
|
||||
noFileSelected = "برای شروع برش یک فایل PDF انتخاب کنید"
|
||||
reset = "بازنشانی به کل PDF"
|
||||
autoCrop = "برش خودکار فضاهای خالی"
|
||||
|
||||
[crop.preview]
|
||||
title = "انتخاب ناحیه برش"
|
||||
@@ -3244,7 +3155,6 @@ title = "روش پنهانسازی"
|
||||
mode = "حالت"
|
||||
automatic = "خودکار"
|
||||
automaticDesc = "پنهانسازی متن بر اساس عبارات جستجو"
|
||||
automaticDisabledTooltip = "برای سانسور چند فایل بهصورت همزمان، فایلها را در مدیر فایل انتخاب کنید"
|
||||
manual = "دستی"
|
||||
manualDesc = "برای پنهانسازی نواحی خاص کلیک و درگ کنید"
|
||||
manualComingSoon = "پنهانسازی دستی بهزودی"
|
||||
@@ -3315,35 +3225,8 @@ text = "فقط کلمات کامل را مطابقت میدهد، نه تطا
|
||||
title = "تبدیل به PDF-Image"
|
||||
text = "پس از پنهانسازی، PDF را به یک PDF مبتنی بر تصویر تبدیل میکند. این اطمینان میدهد که متن پشت کادرهای پنهانسازی کاملاً حذف و غیرقابل بازیابی شود."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "کنترلهای سانسور دستی"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "ابزار علامتگذاری متن"
|
||||
text = "متن را مستقیماً روی PDF انتخاب کنید تا برای سانسور علامتگذاری شود. برای برجستهکردن متن خاصی که میخواهید سانسور کنید، کلیک کرده و بکشید."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "ابزار علامتگذاری ناحیه"
|
||||
text = "ناحیههای مستطیلی روی PDF بکشید تا برای سانسور علامتگذاری شوند. برای سانسور تصاویر، امضاها یا شکلهای نامنظم مفید است."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "اعمال سانسورها"
|
||||
text = "پس از علامتگذاری محتوا، روی 'اعمال' کلیک کنید تا همه نواحی علامتگذاریشده بهطور دائمی سانسور شوند. شمارنده در انتظار نشان میدهد چند سانسور آماده اعمال است."
|
||||
bullet1 = "پیش از اعمال، هر تعداد ناحیه که لازم است علامت بزنید"
|
||||
bullet2 = "تمام سانسورهای در انتظار یکجا اعمال میشوند"
|
||||
bullet3 = "پس از اعمال، سانسورها قابل بازگشت نیستند"
|
||||
|
||||
[redact.manual]
|
||||
title = "ابزارهای سانسور"
|
||||
instructions = "متن را انتخاب کنید یا ناحیههایی روی PDF بکشید تا برای سانسور علامتگذاری شود."
|
||||
markText = "علامتگذاری متن"
|
||||
markArea = "علامتگذاری ناحیه"
|
||||
pendingLabel = "در انتظار:"
|
||||
applyWarning = "⚠️ اعمال دائمی، قابل بازگشت نیست و دادههای زیرین حذف خواهند شد"
|
||||
apply = "اعمال"
|
||||
noMarks = "هیچ علامت سانسوری وجود ندارد. از ابزارهای بالا برای علامتگذاری محتوا جهت سانسور استفاده کنید."
|
||||
header = "پنهانسازی دستی"
|
||||
controlsTitle = "کنترلهای سانسور دستی"
|
||||
textBasedRedaction = "پنهانسازی مبتنی بر متن"
|
||||
pageBasedRedaction = "پنهانسازی مبتنی بر صفحه"
|
||||
convertPDFToImageLabel = "تبدیل PDF به PDF-Image (برای حذف متن پشت کادر استفاده میشود)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "تعداد تقسیمات افقی را وارد کنید"
|
||||
label = "تقسیمات عمودی"
|
||||
placeholder = "تعداد تقسیمات عمودی را وارد کنید"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "حالت تقسیم"
|
||||
description = "نحوه تقسیم صفحات را انتخاب کنید"
|
||||
splitAll = "تقسیم همه صفحات"
|
||||
splitAllExceptFirst = "تقسیم همه بهجز اول"
|
||||
splitAllExceptLast = "تقسیم همه بهجز آخر"
|
||||
splitAllExceptFirstAndLast = "تقسیم همه بهجز اول و آخر"
|
||||
custom = "صفحات سفارشی"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "شماره صفحات سفارشی"
|
||||
placeholder = "مثلاً 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "مهر، افزودن تصویر، واترمارک، PDF، سفارشیسازی"
|
||||
header = "مهر زدن به PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "اندازه فایل"
|
||||
[compress.grayscale]
|
||||
label = "اعمال مقیاس خاکستری برای فشردهسازی"
|
||||
|
||||
[compress.linearize]
|
||||
label = "خطیسازی PDF برای نمایش سریع در وب"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "تبدیل تصاویر به Line Art"
|
||||
description = "از ImageMagick برای کاهش صفحات به سیاهوسفید با کنتراست بالا جهت حداکثر کاهش حجم استفاده میکند."
|
||||
unavailable = "ImageMagick روی این سرور نصب یا فعال نشده است"
|
||||
detailLevel = "سطح جزئیات"
|
||||
edgeEmphasis = "تأکید لبهها"
|
||||
edgeLow = "ملایم"
|
||||
edgeMedium = "متعادل"
|
||||
edgeHigh = "قوی"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "مرور تنظیمات فشردهسازی"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "مقادیر بالا اندازه فایل را کاهش میده
|
||||
title = "سیاهوسفید"
|
||||
text = "با انتخاب این گزینه تمام تصاویر به سیاهوسفید تبدیل میشوند که میتواند بهطور قابلتوجهی اندازه فایل را کاهش دهد، مخصوصاً برای PDFهای اسکنشده یا اسناد پر از تصویر."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "تبدیل صفحات به سیاهوسفید با کنتراست بالا با استفاده از ImageMagick. از «سطح جزئیات» برای کنترل میزان سیاهشدن محتوا و از «تأکید لبهها» برای کنترل شدت تشخیص لبهها استفاده کنید."
|
||||
|
||||
[compress.error]
|
||||
failed = "هنگام فشردهسازی PDF خطایی رخ داد."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "هنگام فشردهسازی PDF خطایی رخ داد."
|
||||
_value = "تنظیمات فشردهسازی"
|
||||
1 = "1-3 فشردهسازی PDF،</br> 4-6 فشردهسازی سبک تصویر،</br> 7-9 فشردهسازی شدید تصویر باعث کاهش چشمگیر کیفیت تصویر میشود"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "مقادیر پایین کیفیت را بهتر حفظ میکنند اما منجر به فایلهای بزرگتر میشوند"
|
||||
range4to6 = "فشردهسازی متوسط با کاهش کیفیت ملایم"
|
||||
range7to9 = "مقادیر بالاتر اندازه فایل را بهطور قابل توجهی کاهش میدهند اما ممکن است وضوح تصویر را کم کنند"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "این فایل با گذرواژه محافظت شده است. لطفاً گذرواژه را وارد کنید:"
|
||||
cancelled = "عملیات برای PDF لغو شد: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "حذف صفحات انتخابشده"
|
||||
closePdf = "بستن PDF"
|
||||
exportAll = "برونبری PDF"
|
||||
downloadSelected = "دانلود فایلهای انتخابشده"
|
||||
annotations = "حاشیهنویسیها"
|
||||
exportSelected = "برونبری صفحات انتخابشده"
|
||||
saveChanges = "ذخیره تغییرات"
|
||||
downloadAll = "دانلود همه"
|
||||
saveAll = "ذخیره همه"
|
||||
toggleTheme = "تغییر تم"
|
||||
toggleBookmarks = "نمایش/پنهانکردن نشانکها"
|
||||
language = "زبان"
|
||||
toggleAnnotations = "تغییر وضعیت نمایش حاشیهنویسیها"
|
||||
search = "جستجوی PDF"
|
||||
panMode = "حالت پیمایش"
|
||||
applyRedactionsFirst = "ابتدا سانسورها را اعمال کنید"
|
||||
rotateLeft = "چرخش به چپ"
|
||||
rotateRight = "چرخش به راست"
|
||||
toggleSidebar = "تغییر وضعیت نوار کناری"
|
||||
toggleBookmarks = "نمایش/پنهانکردن نشانکها"
|
||||
exportSelected = "برونبری صفحات انتخابشده"
|
||||
toggleAnnotations = "تغییر وضعیت نمایش حاشیهنویسیها"
|
||||
annotationMode = "تغییر حالت حاشیهنویسی"
|
||||
print = "چاپ PDF"
|
||||
draw = "رسم"
|
||||
redact = "سانسور"
|
||||
exitRedaction = "خروج از حالت سانسور"
|
||||
save = "ذخیره"
|
||||
downloadAll = "دانلود همه"
|
||||
saveAll = "ذخیره همه"
|
||||
|
||||
[textAlign]
|
||||
left = "چپ"
|
||||
center = "وسط"
|
||||
right = "راست"
|
||||
|
||||
[annotation]
|
||||
title = "حاشیهنویسی"
|
||||
desc = "از هایلایت، قلم، متن و یادداشتها استفاده کنید. تغییرات زنده میمانند—نیازی به فلتکردن نیست."
|
||||
highlight = "هایلایت"
|
||||
pen = "قلم"
|
||||
text = "کادر متن"
|
||||
note = "یادداشت"
|
||||
rectangle = "مستطیل"
|
||||
ellipse = "بیضی"
|
||||
select = "انتخاب"
|
||||
exit = "خروج از حالت حاشیهنویسی"
|
||||
strokeWidth = "ضخامت"
|
||||
opacity = "شفافیت"
|
||||
strokeOpacity = "شفافیت خط دور"
|
||||
fillOpacity = "شفافیت پُرکردن"
|
||||
fontSize = "اندازه فونت"
|
||||
chooseColor = "انتخاب رنگ"
|
||||
color = "رنگ"
|
||||
strokeColor = "رنگ خط دور"
|
||||
fillColor = "رنگ پُرکردن"
|
||||
underline = "زیرخط"
|
||||
strikeout = "خطخوردگی"
|
||||
squiggly = "خط موجدار"
|
||||
inkHighlighter = "هایلایتر آزاد"
|
||||
freehandHighlighter = "هایلایتر آزاد"
|
||||
square = "مربع"
|
||||
circle = "دایره"
|
||||
polygon = "چندضلعی"
|
||||
line = "خط"
|
||||
stamp = "افزودن تصویر"
|
||||
textMarkup = "نشانهگذاری متن"
|
||||
drawing = "رسم"
|
||||
shapes = "اشکال"
|
||||
notesStamps = "یادداشتها و مهرها"
|
||||
settings = "تنظیمات"
|
||||
borderOn = "حاشیه: روشن"
|
||||
borderOff = "حاشیه: خاموش"
|
||||
editInk = "ویرایش قلم"
|
||||
editLine = "ویرایش خط"
|
||||
editNote = "ویرایش یادداشت"
|
||||
editText = "ویرایش کادر متن"
|
||||
editTextMarkup = "ویرایش نشانهگذاری متن"
|
||||
editSelected = "ویرایش حاشیهنویسی"
|
||||
editSquare = "ویرایش مربع"
|
||||
editCircle = "ویرایش دایره"
|
||||
editPolygon = "ویرایش چندضلعی"
|
||||
unsupportedType = "این نوع حاشیهنویسی بهطور کامل برای ویرایش پشتیبانی نمیشود."
|
||||
textAlignment = "تراز متن"
|
||||
noteIcon = "آیکون یادداشت"
|
||||
imagePreview = "پیشنمایش"
|
||||
contents = "متن"
|
||||
backgroundColor = "رنگ پسزمینه"
|
||||
clearBackground = "حذف پسزمینه"
|
||||
noBackground = "بدون پسزمینه"
|
||||
stampSettings = "تنظیمات مهر"
|
||||
savingCopy = "در حال آمادهسازی دانلود..."
|
||||
saveFailed = "امکان ذخیره نسخه وجود ندارد"
|
||||
saveReady = "دانلود آماده است"
|
||||
selectAndMove = "انتخاب و ویرایش"
|
||||
editSelectDescription = "روی یک حاشیهنویسی موجود کلیک کنید تا رنگ، شفافیت، متن یا اندازه آن را ویرایش کنید."
|
||||
editStampHint = "برای تغییر تصویر، این مهر را حذف کرده و یک مورد جدید اضافه کنید."
|
||||
editSwitchToSelect = "برای ویرایش این حاشیهنویسی به حالت انتخاب و ویرایش بروید."
|
||||
undo = "واگرد"
|
||||
redo = "انجام مجدد"
|
||||
applyChanges = "اعمال تغییرات"
|
||||
saveChanges = "ذخیره تغییرات"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "تنظیمات"
|
||||
adminSettings = "تنظیمات مدیر"
|
||||
allTools = "All Tools"
|
||||
reader = "نمایشگر"
|
||||
tours = "تورها"
|
||||
showMeAround = "راهنماییام کن"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "راهنماها را اینجا تماشا کنید: تور ابزارها، تور چیدمان جدید V2 و تور مدیریت."
|
||||
user = "راهنماها را اینجا تماشا کنید: تور ابزارها و تور چیدمان جدید V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "تور ابزارها"
|
||||
toolsTourDesc = "با قابلیتهای ابزارها آشنا شوید"
|
||||
adminTour = "تور مدیریت"
|
||||
adminTourDesc = "تنظیمات و قابلیتهای مدیریت را بررسی کنید"
|
||||
whatsNewTour = "مشاهده تازههای V2"
|
||||
whatsNewTourDesc = "تور چیدمان بهروزشده"
|
||||
|
||||
[admin]
|
||||
error = "خطا"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "بارگذاری تنظیمات ناموفق بود"
|
||||
saveError = "ذخیره تنظیمات ناموفق بود"
|
||||
saved = "تنظیمات با موفقیت ذخیره شد"
|
||||
saveSuccess = "تنظیمات با موفقیت ذخیره شد"
|
||||
success = "تنظیمات با موفقیت ذخیره شد"
|
||||
error = "ذخیره تنظیمات انجام نشد"
|
||||
save = "ذخیره تغییرات"
|
||||
discard = "نادیده گرفتن"
|
||||
restartRequired = "نیاز به راهاندازی مجدد"
|
||||
@@ -4422,13 +4185,6 @@ description = "مسیر فایل اجرایی WeasyPrint برای تبدیل HTM
|
||||
label = "فایل اجرایی Unoconvert"
|
||||
description = "مسیر LibreOffice unoconvert برای تبدیل اسناد (خالی بگذارید برای پیشفرض: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "آدرس پایه برای فرانتاند (مثلاً https://pdf.example.com). برای لینکهای دعوت ایمیل و آپلودهای کد QR موبایل استفاده میشود. برای استفاده از آدرس بکاند خالی بگذارید."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "برای مشاهده جزئیات طرح کلیک کنید"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "امنیت"
|
||||
description = "پیکربندی احراز هویت، رفتار ورود و سیاستهای امنیتی."
|
||||
@@ -4565,19 +4321,6 @@ connect = "اتصال"
|
||||
disconnect = "قطع اتصال"
|
||||
disconnected = "ارائهدهنده با موفقیت قطع شد"
|
||||
disconnectError = "قطع ارتباط ارائهدهنده ناموفق بود"
|
||||
mobileScannerConvertToPdf = "تبدیل تصاویر به PDF"
|
||||
mobileScannerConvertToPdfDesc = "تصاویر آپلودشده را بهصورت خودکار به فرمت PDF تبدیل کن. در صورت غیرفعال بودن، تصاویر بدون تغییر باقی میمانند."
|
||||
mobileScannerImageResolution = "وضوح تصویر"
|
||||
mobileScannerImageResolutionDesc = "وضوح تصاویر آپلودشده. «کاهشیافته» تصاویر را تا حداکثر 1200px مقیاس میکند تا اندازه فایل کاهش یابد."
|
||||
imageResolutionFull = "کامل (اندازه اصلی)"
|
||||
imageResolutionReduced = "کاهشیافته (حداکثر 1200px)"
|
||||
mobileScannerPageFormat = "فرمت صفحه"
|
||||
mobileScannerPageFormatDesc = "اندازه صفحه PDF برای تصاویر تبدیلشده. «حفظ» از ابعاد اصلی تصویر استفاده میکند."
|
||||
pageFormatKeep = "حفظ (ابعاد اصلی)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "کشیدن برای پر کردن"
|
||||
mobileScannerStretchToFitDesc = "تصاویر را برای پر کردن کل صفحه بکش. در صورت غیرفعال بودن، تصاویر با حفظ نسبت در مرکز قرار میگیرند."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "ورود خودکار SSO"
|
||||
@@ -4600,11 +4343,11 @@ label = "URL صادرکننده"
|
||||
description = "Issuer URL ارائهدهنده OAuth2"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "شناسهٔ کلاینت"
|
||||
description = "Client ID مربوط به OAuth2 از ارائهدهنده شما"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "راز کلاینت"
|
||||
description = "Client Secret مربوط به OAuth2 از ارائهدهنده شما"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4635,7 +4378,7 @@ label = "ارائهدهنده"
|
||||
description = "نام ارائهدهنده SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.registrationId]
|
||||
label = "Registration ID"
|
||||
label = "شناسهٔ ثبتنام"
|
||||
description = "شناسه ثبتنام SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.autoCreateUser]
|
||||
@@ -4646,122 +4389,6 @@ description = "ایجاد خودکار حساب کاربری در اولین و
|
||||
label = "مسدود کردن ثبتنام"
|
||||
description = "جلوگیری از ثبتنام کاربر جدید از طریق SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "آپلود از تلفن همراه"
|
||||
enable = "فعالسازی آپلود با کد QR"
|
||||
description = "اجازه دهید کاربران با اسکن کد QR از دستگاههای موبایل فایل آپلود کنند"
|
||||
note = "توجه: نیاز به پیکربندی آدرس فرانتاند دارد. "
|
||||
link = "پیکربندی در تنظیمات سیستم"
|
||||
mobileScannerConvertToPdf = "تبدیل تصاویر به PDF"
|
||||
mobileScannerConvertToPdfDesc = "تصاویر آپلودشده را بهصورت خودکار به فرمت PDF تبدیل کن. در صورت غیرفعال بودن، تصاویر بدون تغییر باقی میمانند."
|
||||
mobileScannerImageResolution = "وضوح تصویر"
|
||||
mobileScannerImageResolutionDesc = "وضوح تصاویر آپلودشده. «کاهشیافته» تصاویر را تا حداکثر 1200px مقیاس میکند تا اندازه فایل کاهش یابد."
|
||||
imageResolutionFull = "کامل (اندازه اصلی)"
|
||||
imageResolutionReduced = "کاهشیافته (حداکثر 1200px)"
|
||||
mobileScannerPageFormat = "فرمت صفحه"
|
||||
mobileScannerPageFormatDesc = "اندازه صفحه PDF برای تصاویر تبدیلشده. «حفظ» از ابعاد اصلی تصویر استفاده میکند."
|
||||
pageFormatKeep = "حفظ (ابعاد اصلی)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "کشیدن برای پر کردن"
|
||||
mobileScannerStretchToFitDesc = "تصاویر را برای پر کردن کل صفحه بکش. در صورت غیرفعال بودن، تصاویر با حفظ نسبت در مرکز قرار میگیرند."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "ربات تلگرام"
|
||||
description = "پیکربندی اتصال ربات تلگرام، کنترلهای دسترسی و رفتار بازخورد."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "فعالسازی ربات تلگرام"
|
||||
description = "اجازه دهید کاربران از طریق ربات تلگرام پیکربندیشده شما با Stirling PDF تعامل داشته باشند."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "نام کاربری ربات"
|
||||
description = "نام کاربری عمومی ربات تلگرام شما."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "توکن ربات"
|
||||
description = "توکن API ارائهشده توسط BotFather برای ربات تلگرام شما."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "پوشه صندوق ورودی"
|
||||
description = "پوشهای در زیر دایرکتوری pipeline که فایلهای ورودی تلگرام در آن ذخیره میشوند."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "استفاده از پسوند پوشه سفارشی"
|
||||
description = "شناسه چت را به پوشههای فایل ورودی اضافه کنید تا آپلودها به ازای هر چت جدا شوند."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "کنترل دسترسی"
|
||||
description = "محدود کنید کدام کاربران یا کانالها میتوانند با ربات تعامل داشته باشند."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "اجازه به شناسههای کاربری خاص"
|
||||
description = "در صورت فعالسازی، فقط شناسههای کاربری فهرستشده میتوانند از ربات استفاده کنند."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "شناسههای کاربری مجاز"
|
||||
description = "شناسههای کاربری تلگرام مجاز برای تعامل با ربات را وارد کنید."
|
||||
placeholder = "شناسه کاربری را اضافه کرده و اینتر بزنید"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "اجازه به شناسههای کانال خاص"
|
||||
description = "در صورت فعالسازی، فقط شناسههای کانال فهرستشده میتوانند از ربات استفاده کنند."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "شناسههای کانال مجاز"
|
||||
description = "شناسههای کانال تلگرام مجاز برای تعامل با ربات را وارد کنید."
|
||||
placeholder = "شناسه کانال را اضافه کرده و اینتر بزنید"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "پردازش"
|
||||
description = "کنترل بازه پایش و مهلتهای پردازش برای آپلودهای تلگرام."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "مهلت پردازش (ثانیه)"
|
||||
description = "حداکثر زمان انتظار برای یک کار پردازش پیش از گزارش خطا."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "بازه پایش (ms)"
|
||||
description = "بازه بین بررسی بهروزرسانیهای جدید تلگرام."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "پیامهای بازخورد"
|
||||
description = "انتخاب کنید ربات چه زمانی باید به کاربران و کانالها بازخورد بدهد."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "فعالسازی بازخورد"
|
||||
description = "کنترل اینکه آیا ربات اصلاً پیام بازخورد ارسال کند یا نه."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "قوانین بازخورد کانال"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "نمایش «سند معتبر نیست» (کانال)"
|
||||
description = "پاسخ «سند معتبر نیست» را برای آپلودهای کانال سرکوب کنید."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "نمایش خطاهای پردازش (کانال)"
|
||||
description = "ارسال پیامهای خطای پردازش به کانالها."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "نمایش پیامهای خطا (کانال)"
|
||||
description = "نمایش پیامهای خطای تفصیلی برای کانالها."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "قوانین بازخورد کاربر"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "نمایش «سند معتبر نیست» (کاربر)"
|
||||
description = "پاسخ «سند معتبر نیست» را برای آپلودهای کاربر سرکوب کنید."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "نمایش خطاهای پردازش (کاربر)"
|
||||
description = "ارسال پیامهای خطای پردازش برای کاربران."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "نمایش پیامهای خطا (کاربر)"
|
||||
description = "نمایش پیامهای خطای تفصیلی برای کاربران."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "پایگاه داده"
|
||||
description = "پیکربندی تنظیمات اتصال پایگاه داده سفارشی برای استقرارهای سازمانی."
|
||||
@@ -4943,10 +4570,6 @@ description = "اجازه به مدیران برای دعوت کاربران ا
|
||||
label = "URL فرانتاند"
|
||||
description = "URL پایه برای فرانتاند (مثلاً https://pdf.example.com). برای ایجاد لینک دعوت در ایمیلها استفاده میشود. برای استفاده از URL بکاند خالی بگذارید."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "توجه: نیاز به پیکربندی آدرس فرانتاند دارد. "
|
||||
link = "پیکربندی در تنظیمات سیستم"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "اسناد حقوقی"
|
||||
description = "پیوندها به اسناد و سیاستهای حقوقی را پیکربندی کنید."
|
||||
@@ -4972,7 +4595,7 @@ label = "خطمشی کوکی"
|
||||
description = "URL یا نام فایل برای خطمشی کوکی"
|
||||
|
||||
[admin.settings.legal.impressum]
|
||||
label = "Impressum"
|
||||
label = "اطلاعات حقوقی"
|
||||
description = "URL یا نام فایل برای impressum (در برخی حوزههای قضایی الزامی است)"
|
||||
|
||||
[admin.settings.premium]
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "فایلهای من"
|
||||
noRecentFiles = "هیچ فایل اخیری یافت نشد"
|
||||
googleDriveNotAvailable = "یکپارچگی Google Drive در دسترس نیست"
|
||||
mobileUpload = "آپلود از موبایل"
|
||||
mobileShort = "موبایل"
|
||||
mobileUploadNotAvailable = "آپلود موبایل فعال نیست"
|
||||
downloadSelected = "دانلود انتخابشدهها"
|
||||
saveSelected = "ذخیره موارد انتخابشده"
|
||||
openFiles = "باز کردن فایلها"
|
||||
@@ -5449,7 +5069,6 @@ loading = "در حال بارگذاری..."
|
||||
back = "بازگشت"
|
||||
continue = "ادامه"
|
||||
error = "خطا"
|
||||
save = "ذخیره"
|
||||
|
||||
[config.overview]
|
||||
title = "پیکربندی برنامه"
|
||||
@@ -5512,15 +5131,6 @@ impact = "هر برنامه یا سرویسی که اکنون از این کلی
|
||||
confirmPrompt = "مطمئنید میخواهید ادامه دهید؟"
|
||||
confirmCta = "تازهسازی کلیدها"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "خطای کلید API"
|
||||
failedToCreateApiKey = "ایجاد کلید API ناموفق بود."
|
||||
failedToRetrieveApiKey = "دریافت کلید API از پاسخ ناموفق بود."
|
||||
failedToFetchApiKey = "واکشی کلید API ناموفق بود."
|
||||
apiKeyRefreshed = "کلید API تازهسازی شد"
|
||||
apiKeyRefreshedBody = "کلید API شما با موفقیت تازهسازی شد."
|
||||
failedToRefreshApiKey = "تازهسازی کلید API ناموفق بود."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "انتخاب پیوستها"
|
||||
info = "فایلهایی را برای پیوست به PDF خود انتخاب کنید. این فایلها درون PDF جاسازی شده و از طریق پنل پیوستها قابل دسترسی خواهند بود."
|
||||
@@ -5625,16 +5235,6 @@ finish = "پایان"
|
||||
startTour = "شروع تور"
|
||||
startTourDescription = "یک تور راهنما از قابلیتهای کلیدی Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "از نوار <strong>Quick Access</strong> شروع کنید تا بین Reader، Automate، فایلها و همه تورها جابهجا شوید."
|
||||
leftPanel = "پنل <strong>Tools</strong> در سمت چپ همه کارهایی که میتوانید انجام دهید را فهرست میکند. برای یافتن سریع ابزار، دستهها را مرور کنید یا جستجو نمایید."
|
||||
fileUpload = "از دکمه <strong>Files</strong> برای آپلود یا انتخاب یک PDF اخیر استفاده کنید. یک نمونه بارگذاری میکنیم تا محیط کار را ببینید."
|
||||
rightRail = "<strong>نوار کناری راست</strong> شامل اقدامات سریع برای انتخاب فایلها، تغییر پوسته یا زبان، و دانلود نتایج است."
|
||||
topBar = "نوار بالا به شما اجازه میدهد بین <strong>Viewer</strong>، <strong>Page Editor</strong> و <strong>Active Files</strong> جابهجا شوید."
|
||||
pageEditorView = "به ویرایشگر صفحات بروید تا صفحات را مرتب، بچرخانید یا حذف کنید."
|
||||
activeFilesView = "از فایلهای فعال استفاده کنید تا همه چیزهای باز را ببینید و انتخاب کنید روی چه چیزی کار کنید."
|
||||
wrapUp = "اینها موارد جدید در V2 هستند. هر زمان منوی <strong>Tours</strong> را باز کنید تا این تور، تور ابزارها یا تور مدیریت را دوباره پخش کنید."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "به Stirling PDF خوش آمدید!"
|
||||
description = "مایلید یک تور سریع ۱ دقیقهای بگیرید تا با قابلیتهای کلیدی و نحوه شروع آشنا شوید؟"
|
||||
@@ -5655,10 +5255,6 @@ download = "دانلود →"
|
||||
showMeAround = "راهنمایی کن"
|
||||
skipTheTour = "از تور بگذر"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "نمای کلی تور"
|
||||
body = "Stirling PDF V2 با دهها ابزار و یک چیدمان تازه ارائه میشود. یک تور سریع بگیرید تا ببینید چه چیزهایی تغییر کرده و ویژگیهای موردنیازتان را کجا پیدا کنید."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "فعلاً رد کن"
|
||||
seePlans = "مشاهده پلنها →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "همین حالا ارتقا بده →"
|
||||
freeTitle = "لایسنس سرور"
|
||||
overLimitTitle = "نیاز به لایسنس سرور"
|
||||
overLimitBody = "مجوز ما تا <strong>{{freeTierLimit}}</strong> کاربر رایگان بهازای هر سرور را مجاز میداند. شما <strong>{{overLimitUserCopy}}</strong> کاربر Stirling دارید. برای ادامه بدون وقفه، به پلن Stirling Server ارتقا دهید - <strong>صندلی نامحدود</strong>، ویرایش متن PDF و کنترل کامل ادمین با 99$ بهازای هر سرور در ماه."
|
||||
freeBody = "مجوز <strong>Open-Core</strong> ما تا <strong>{{freeTierLimit}}</strong> کاربر رایگان بهازای هر سرور را مجاز میداند. برای مقیاسپذیری بدون وقفه و دسترسی زودهنگام به <strong>ابزار ویرایش متن PDF</strong> جدیدمان، پلن Stirling Server را پیشنهاد میکنیم - ویرایش کامل و <strong>صندلی نامحدود</strong> با 99$ بهازای هر سرور در ماه."
|
||||
freeBody = "مجوز <strong>Open-Core</strong> ما بهازای هر سرور اجازهٔ استفادهٔ رایگان برای حداکثر <strong>{{freeTierLimit}}</strong> کاربر را میدهد. برای مقیاسدهی بدون وقفه، طرح Stirling Server را توصیه میکنیم - <strong>تعداد کاربران نامحدود</strong> و <strong>پشتیبانی از SSO</strong> با $99/سرور/ماه."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "دانلود"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "تماس با فروش"
|
||||
contactToUpgrade = "برای ارتقا یا سفارشیسازی طرح خود با ما تماس بگیرید"
|
||||
maxUsers = "حداکثر کاربران"
|
||||
upTo = "تا"
|
||||
getLicense = "دریافت لایسنس سرور"
|
||||
upgradeToEnterprise = "ارتقا به سازمانی"
|
||||
selectPeriod = "انتخاب دوره پرداخت"
|
||||
monthlyBilling = "پرداخت ماهانه"
|
||||
yearlyBilling = "پرداخت سالانه"
|
||||
checkoutOpened = "فرآیند پرداخت باز شد"
|
||||
checkoutInstructions = "خرید خود را در تب Stripe کامل کنید. پس از پرداخت، برای فعالسازی لایسنس به اینجا برگردید و صفحه را نوسازی کنید. همچنین ایمیلی با کلید لایسنس دریافت خواهید کرد."
|
||||
activateLicense = "فعالسازی لایسنس شما"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "پرداخت در تب جدید باز شد"
|
||||
instructions = "خرید خود را در تب Stripe کامل کنید. پس از تکمیل پرداخت، ایمیلی با کلید لایسنس دریافت خواهید کرد."
|
||||
enterKey = "برای فعالسازی طرح خود، کلید لایسنس را در زیر وارد کنید:"
|
||||
keyDescription = "کلید لایسنس موجود در ایمیل خود را جایگذاری کنید"
|
||||
activate = "فعالسازی لایسنس"
|
||||
doLater = "بعداً انجام میدهم"
|
||||
success = "لایسنس فعال شد!"
|
||||
successMessage = "لایسنس شما با موفقیت فعال شد. اکنون میتوانید این پنجره را ببندید."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "نیاز به تأیید ایمیل"
|
||||
message = "باید آدرس ایمیل خود را در پورتال پرداخت Stripe تأیید کنید. ایمیل خود را برای لینک ورود بررسی کنید."
|
||||
|
||||
[plan.period]
|
||||
month = "ماه"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "سیستم ممیزی در دسترس نیست"
|
||||
notAvailableMessage = "سیستم ممیزی پیکربندی نشده یا در دسترس نیست."
|
||||
disabled = "ثبت وقایع ممیزی غیرفعال است"
|
||||
disabledMessage = "برای پیگیری رویدادهای سیستم، ثبت ممیزی را در پیکربندی برنامه خود فعال کنید."
|
||||
enterpriseRequired = "نیازمند لایسنس سازمانی"
|
||||
enterpriseRequiredMessage = "سیستم ثبت وقایع یک ویژگی سازمانی است. لطفاً برای دسترسی به لاگهای ممیزی و تحلیلها به لایسنس سازمانی ارتقا دهید."
|
||||
|
||||
[audit.error]
|
||||
title = "خطا در بارگذاری سیستم ممیزی"
|
||||
@@ -6370,7 +5942,6 @@ description = "URL کامل سرور خودمیزبان Stirling PDF خود را
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "لطفاً URL سرور را وارد کنید"
|
||||
invalidUrl = "قالب URL نامعتبر است. لطفاً یک URL معتبر مانند https://your-server.com وارد کنید"
|
||||
unreachable = "اتصال به سرور ممکن نشد"
|
||||
testFailed = "آزمون اتصال ناموفق بود"
|
||||
configFetch = "بازیابی پیکربندی سرور ناموفق بود. لطفاً URL را بررسی کنید و دوباره تلاش کنید."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "در حال اتصال به:"
|
||||
submit = "ورود"
|
||||
signInWith = "ورود با"
|
||||
oauthPending = "در حال باز کردن مرورگر برای احراز هویت..."
|
||||
sso = "ورود یکپارچه"
|
||||
orContinueWith = "یا با ایمیل ادامه دهید"
|
||||
serverRequirement = "توجه: سرور باید ورود را فعال کرده باشد."
|
||||
showInstructions = "نحوه فعالسازی؟"
|
||||
@@ -6455,8 +6025,6 @@ reset = "بازنشانی تغییرات"
|
||||
downloadJson = "دانلود JSON"
|
||||
generatePdf = "تولید PDF"
|
||||
saveChanges = "ذخیرهٔ تغییرات"
|
||||
applyChanges = "اعمال تغییرات"
|
||||
downloadCopy = "دانلود نسخه"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "مقیاس خودکار متن برای جا شدن در باکسها"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "نکته: برای انتخاب چندگانه باکس
|
||||
title = "قفلکردن متن ویرایششده به یک عنصر PDF واحد"
|
||||
description = "وقتی فعال باشد، هر باکس متن ویرایششده را بهصورت یک عنصر متن PDF خروجی میگیرد تا از همپوشانی گلیفها یا فونتهای ترکیبی جلوگیری شود."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "تنظیمات پیشرفته"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "محدودیتهای پیشنمایش"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "تمرکز متن و تصویر"
|
||||
text = "این فضای کاری بر ویرایش متن و جابهجایی تصاویر توکار تمرکز دارد. آثار هنری پیچیده صفحه، ابزارکهای فرم و گرافیکهای لایهای برای خروجی حفظ میشوند اما در اینجا کاملاً قابل ویرایش نیستند."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "تفاوت پیشنمایش"
|
||||
text = "برخی نماها (مانند خطوط جدول، شکلها یا ظاهر حاشیهنویسیها) ممکن است دقیقاً در پیشنمایش نمایش داده نشوند. PDF خروجی تا حد امکان دستورات رسم اصلی را حفظ میکند."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "نمایشگر آلفا"
|
||||
text = "این نمایشگر آلفا هنوز در حال تکامل است—برخی فونتها، رنگها، افکتهای شفافیت و جزئیات چیدمان ممکن است کمی جابهجا شوند. لطفاً قبل از اشتراکگذاری، PDF تولیدشده را دوباره بررسی کنید."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "ادغام باکسهای انتخابشده"
|
||||
merge = "ادغام انتخاب"
|
||||
@@ -6614,58 +6164,3 @@ title = "نتایج افزودن متن"
|
||||
|
||||
[addText.error]
|
||||
failed = "هنگام افزودن متن به PDF خطایی رخ داد."
|
||||
|
||||
[mobileUpload]
|
||||
title = "آپلود از موبایل"
|
||||
description = "برای آپلود عکسها اسکن کنید. تصاویر بهصورت خودکار به PDF تبدیل میشوند."
|
||||
descriptionNoConvert = "برای آپلود عکسها از دستگاه موبایل خود اسکن کنید."
|
||||
error = "خطای اتصال"
|
||||
pollingError = "خطا در بررسی فایلها"
|
||||
sessionId = "شناسه نشست"
|
||||
sessionCreateError = "ایجاد نشست ناموفق بود"
|
||||
expiryWarning = "نشست بهزودی منقضی میشود"
|
||||
expiryWarningMessage = "این کد QR تا {{seconds}} ثانیه دیگر منقضی میشود. یک کد جدید بهصورت خودکار تولید خواهد شد."
|
||||
filesReceived = "{{count}} فایل دریافت شد"
|
||||
connected = "دستگاه موبایل متصل شد"
|
||||
instructions = "با دوربین گوشی خود اسکن کنید. تصاویر بهصورت خودکار به PDF تبدیل میشوند."
|
||||
instructionsNoConvert = "برای آپلود فایلها با دوربین گوشی خود اسکن کنید."
|
||||
|
||||
[mobileScanner]
|
||||
title = "اسکنر موبایل"
|
||||
noSession = "نشست نامعتبر"
|
||||
noSessionMessage = "لطفاً برای دسترسی به این صفحه یک کد QR معتبر اسکن کنید."
|
||||
validating = "در حال اعتبارسنجی نشست..."
|
||||
sessionInvalid = "خطای نشست"
|
||||
sessionExpired = "این نشست منقضی شده است. لطفاً نوسازی و دوباره تلاش کنید."
|
||||
sessionNotFound = "نشست یافت نشد. لطفاً نوسازی و دوباره تلاش کنید."
|
||||
sessionValidationError = "امکان تأیید نشست نیست. لطفاً دوباره تلاش کنید."
|
||||
uploadSuccess = "آپلود موفق!"
|
||||
uploadSuccessMessage = "تصاویر شما منتقل شدند."
|
||||
httpsRequired = "دسترسی به دوربین نیازمند HTTPS یا localhost است. لطفاً از HTTPS استفاده کنید یا از طریق localhost دسترسی یابید."
|
||||
uploadFailed = "آپلود ناموفق بود. لطفاً دوباره تلاش کنید."
|
||||
uploading = "در حال آپلود..."
|
||||
connected = "متصل شد"
|
||||
connecting = "در حال اتصال..."
|
||||
chooseMethod = "انتخاب روش آپلود"
|
||||
chooseMethodDescription = "انتخاب کنید چگونه میخواهید اسناد را اسکن و آپلود کنید"
|
||||
camera = "دوربین"
|
||||
cameraDescription = "اسناد را با دوربین دستگاه خود با تشخیص خودکار لبه اسکن کنید"
|
||||
fileUpload = "آپلود فایل"
|
||||
fileDescription = "عکسها یا اسناد موجود را از دستگاه خود آپلود کنید"
|
||||
cameraAccessDenied = "دسترسی به دوربین رد شد. لطفاً دسترسی دوربین را فعال کنید."
|
||||
back = "بازگشت"
|
||||
settings = "تنظیمات"
|
||||
edgeDetection = "تشخیص لبه"
|
||||
flashlight = "چراغقوه"
|
||||
flash = "فلش"
|
||||
processing = "در حال پردازش..."
|
||||
capture = "گرفتن عکس"
|
||||
selectFilesPrompt = "فایلها را برای آپلود انتخاب کنید"
|
||||
selectImage = "انتخاب تصویر"
|
||||
preview = "پیشنمایش"
|
||||
retake = "عکس مجدد"
|
||||
addToBatch = "افزودن به دسته"
|
||||
upload = "آپلود"
|
||||
batchImages = "دسته"
|
||||
clearBatch = "پاکسازی"
|
||||
uploadAll = "آپلود همه"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Vous avez des modifications non enregistrées sur votre PDF. Que souhaitez-vous faire ?"
|
||||
pendingRedactionsTitle = "Caviardages non appliqués"
|
||||
pendingRedactions = "Vous avez des caviardages non appliqués qui seront perdus."
|
||||
areYouSure = "Voulez-vous vraiment quitter ?"
|
||||
unsavedChangesTitle = "Modifications non enregistrées"
|
||||
keepWorking = "Continuer à travailler"
|
||||
discardChanges = "Ignorer les modifications"
|
||||
discardRedactions = "Ignorer et quitter"
|
||||
applyAndContinue = "Appliquer et continuer"
|
||||
exportAndContinue = "Exporter et continuer"
|
||||
cancel = "Annuler"
|
||||
@@ -343,10 +340,6 @@ advance = "Mode avancé"
|
||||
edit = "Voir et modifier"
|
||||
popular = "Populaire"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Préférences"
|
||||
|
||||
@@ -359,7 +352,7 @@ teams = "Équipes"
|
||||
title = "Configuration"
|
||||
systemSettings = "Paramètres système"
|
||||
features = "Fonctionnalités"
|
||||
endpoints = "Endpoints"
|
||||
endpoints = "Points de terminaison"
|
||||
database = "Base de données"
|
||||
advanced = "Avancé"
|
||||
|
||||
@@ -367,11 +360,10 @@ advanced = "Avancé"
|
||||
title = "Sécurité et authentification"
|
||||
security = "Sécurité"
|
||||
connections = "Connexions"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licences et analyses"
|
||||
plan = "Plan"
|
||||
plan = "Forfait"
|
||||
audit = "Audit"
|
||||
usageAnalytics = "Analyses d'utilisation"
|
||||
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Version actuelle"
|
||||
latestVersion = "Dernière version"
|
||||
checkForUpdates = "Rechercher des mises à jour"
|
||||
viewDetails = "Voir les détails"
|
||||
serverNeedsUpdate = "Le serveur doit être mis à jour par l’administrateur"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informations de version"
|
||||
description = "Détails des versions Desktop et serveur"
|
||||
desktop = "Version Desktop"
|
||||
server = "Version du serveur"
|
||||
|
||||
[settings.security]
|
||||
title = "Sécurité"
|
||||
description = "Mettez à jour votre mot de passe pour sécuriser votre compte."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Changez votre mot de passe. Vous serez déconnecté après la mise à jour."
|
||||
required = "Tous les champs sont obligatoires."
|
||||
mismatch = "Les nouveaux mots de passe ne correspondent pas."
|
||||
error = "Impossible de mettre à jour le mot de passe. Veuillez vérifier votre mot de passe actuel et réessayer."
|
||||
success = "Mot de passe mis à jour avec succès. Veuillez vous reconnecter."
|
||||
ssoDisabled = "Les modifications de mot de passe sont gérées par votre fournisseur d’identité."
|
||||
current = "Mot de passe actuel"
|
||||
currentPlaceholder = "Saisissez votre mot de passe actuel"
|
||||
new = "Nouveau mot de passe"
|
||||
newPlaceholder = "Saisissez un nouveau mot de passe"
|
||||
confirm = "Confirmez le nouveau mot de passe"
|
||||
confirmPlaceholder = "Saisissez de nouveau votre nouveau mot de passe"
|
||||
update = "Mettre à jour le mot de passe"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Raccourcis clavier"
|
||||
@@ -522,16 +488,11 @@ low = "Faible"
|
||||
title = "Modifiez vos identifiants"
|
||||
header = "Mettez à jour vos identifiants de connexion"
|
||||
changePassword = "Vous utilisez les identifiants de connexion par défaut. Veuillez saisir un nouveau mot de passe"
|
||||
ssoManaged = "Votre compte est géré par votre fournisseur d’identité."
|
||||
newUsername = "Nouveau nom d'utilisateur"
|
||||
oldPassword = "Mot de passe actuel"
|
||||
newPassword = "Nouveau mot de passe"
|
||||
confirmNewPassword = "Confirmer le nouveau mot de passe"
|
||||
submit = "Soumettre les modifications"
|
||||
credsUpdated = "Compte mis à jour"
|
||||
description = "Modifications enregistrées. Veuillez vous reconnecter."
|
||||
error = "Impossible de mettre à jour le nom d’utilisateur. Veuillez vérifier votre mot de passe et réessayer."
|
||||
changeUsername = "Mettre à jour votre nom d’utilisateur. Vous serez déconnecté après la mise à jour."
|
||||
|
||||
[account]
|
||||
title = "Paramètres du compte"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Paramètres du compte"
|
||||
adminSettings = "Paramètres d'administration – Voir et ajouter des utilisateurs"
|
||||
userControlSettings = "Contrôle des paramètres des utilisateurs"
|
||||
changeUsername = "Modifier le nom d'utilisateur"
|
||||
changeUsernameDescription = "Mettre à jour votre nom d’utilisateur. Vous serez déconnecté après la mise à jour."
|
||||
newUsernamePlaceholder = "Saisissez votre nouveau nom d’utilisateur"
|
||||
newUsername = "Nouveau nom d'utilisateur"
|
||||
password = "Mot de passe de confirmation"
|
||||
oldPassword = "Ancien mot de passe"
|
||||
@@ -749,11 +708,6 @@ tags = "signature,autographe"
|
||||
title = "Signer"
|
||||
desc = "Ajoutez une signature au PDF avec un dessin, du texte ou une image."
|
||||
|
||||
[home.annotate]
|
||||
tags = "annoter,surligner,dessiner"
|
||||
title = "Annoter"
|
||||
desc = "Surlignez, dessinez, ajoutez des notes et des formes dans la visionneuse"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplifier,retirer,interactif"
|
||||
title = "Rendre inerte"
|
||||
@@ -965,7 +919,7 @@ title = "Superposer des PDF"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Éditeur de texte PDF"
|
||||
desc = "Afficher et modifier les exports JSON de Stirling PDF avec édition de texte groupée et régénération du PDF"
|
||||
desc = "Modifier le texte et les images existants dans les PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "texte,annotation,étiquette"
|
||||
@@ -976,7 +930,6 @@ desc = "Ajouter du texte personnalisé n’importe où dans votre PDF"
|
||||
addFiles = "Ajouter des fichiers"
|
||||
uploadFromComputer = "Téléverser depuis l’ordinateur"
|
||||
openFromComputer = "Ouvrir depuis l’ordinateur"
|
||||
mobileUpload = "Téléverser depuis un mobile"
|
||||
|
||||
[viewPdf]
|
||||
tags = "visualiser,lire,annoter,texte,image"
|
||||
@@ -1272,7 +1225,7 @@ odtExt = "Texte OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Présentation OpenDocument (.odp)"
|
||||
txtExt = "Texte brut (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Format de texte enrichi (.rtf)"
|
||||
selectedFiles = "Fichiers sélectionnés"
|
||||
noFileSelected = "Aucun fichier sélectionné. Utilisez le panneau de fichiers pour ajouter des fichiers."
|
||||
convertFiles = "Convertir les fichiers"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Options CBZ vers PDF"
|
||||
optimizeForEbook = "Optimiser le PDF pour les liseuses (utilise Ghostscript)"
|
||||
cbzOutputOptions = "Options PDF vers CBZ"
|
||||
cbzDpi = "DPI pour le rendu des images"
|
||||
cbrOptions = "Options CBR"
|
||||
cbrOutputOptions = "Options PDF vers CBR"
|
||||
cbrDpi = "DPI pour le rendu des images"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Options eBook vers PDF"
|
||||
ebookOptionsDesc = "Options de conversion des eBooks en PDF"
|
||||
embedAllFonts = "Incorporer toutes les polices"
|
||||
embedAllFontsDesc = "Incorporer toutes les polices de l’eBook dans le PDF généré"
|
||||
includeTableOfContents = "Inclure la table des matières"
|
||||
includeTableOfContentsDesc = "Ajouter une table des matières générée au PDF résultant"
|
||||
includePageNumbers = "Inclure les numéros de page"
|
||||
includePageNumbersDesc = "Ajouter des numéros de page au PDF généré"
|
||||
optimizeForEbookPdf = "Optimiser pour les liseuses"
|
||||
optimizeForEbookPdfDesc = "Optimiser le PDF pour la lecture d’eBook (taille de fichier réduite, meilleur rendu sur appareils eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Options PDF vers eBook"
|
||||
epubOptionsDesc = "Options de conversion de PDF vers EPUB/AZW3"
|
||||
detectChapters = "Détecter les chapitres"
|
||||
detectChaptersDesc = "Détecter les titres ressemblant à des chapitres et insérer des sauts de page EPUB"
|
||||
targetDevice = "Appareil cible"
|
||||
targetDeviceDesc = "Choisissez un profil de sortie optimisé pour l’appareil de lecture"
|
||||
outputFormat = "Format de sortie"
|
||||
outputFormatDesc = "Choisissez le format de sortie de l’eBook"
|
||||
tabletPhone = "Tablette/Téléphone (avec images)"
|
||||
kindleEink = "Kindle e-Ink (texte optimisé)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "pdf,conversion,img,jpg,image,photo"
|
||||
@@ -1435,11 +1361,6 @@ header = "Ajouter des pièces jointes"
|
||||
add = "Ajouter une pièce jointe"
|
||||
remove = "Supprimer la pièce jointe"
|
||||
embed = "Intégrer la pièce jointe"
|
||||
convertToPdfA3b = "Convertir en PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Crée un PDF d’archivage avec pièces jointes intégrées"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b est un format d’archivage garantissant une conservation à long terme. Il permet d’intégrer des formats de fichiers arbitraires en tant que pièces jointes. La conversion nécessite Ghostscript et peut être plus longue pour les gros fichiers."
|
||||
convertToPdfA3bTooltipHeader = "À propos de la conversion PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Ce que cela fait"
|
||||
submit = "Ajouter des pièces jointes"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Enregistrées"
|
||||
label = "Téléverser une image de signature"
|
||||
placeholder = "Sélectionner un fichier image"
|
||||
hint = "Téléversez une image PNG ou JPG de votre signature"
|
||||
removeBackground = "Supprimer le fond blanc (le rendre transparent)"
|
||||
processing = "Traitement de l’image..."
|
||||
backgroundRemovalFailedTitle = "Échec de la suppression du fond"
|
||||
backgroundRemovalFailedMessage = "Impossible de supprimer le fond de l’image. Utilisation de l’image originale à la place."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Comment ajouter une signature"
|
||||
@@ -2434,11 +2351,6 @@ note = "L’aplatissement supprime les éléments interactifs du PDF, les rendan
|
||||
label = "Aplatir uniquement les formulaires"
|
||||
desc = "Aplatir uniquement les champs de formulaire, en laissant les autres éléments interactifs intacts"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de rendu (optionnel, 150 DPI recommandé)"
|
||||
help = "Laissez vide pour utiliser la valeur par défaut du système. Un DPI plus élevé améliore la netteté mais augmente le temps de traitement et la taille du fichier."
|
||||
placeholder = "ex. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Résultats de l’aplatissement"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Redimensionner"
|
||||
submit = "Envoyer"
|
||||
noFileSelected = "Sélectionnez un fichier PDF pour commencer le recadrage"
|
||||
reset = "Réinitialiser au PDF complet"
|
||||
autoCrop = "Recadrer automatiquement les marges blanches"
|
||||
|
||||
[crop.preview]
|
||||
title = "Sélection de la zone de recadrage"
|
||||
@@ -3244,7 +3155,6 @@ title = "Méthode d’occultation"
|
||||
mode = "Mode"
|
||||
automatic = "Automatique"
|
||||
automaticDesc = "Occulter le texte selon des termes de recherche"
|
||||
automaticDisabledTooltip = "Sélectionnez des fichiers dans le gestionnaire de fichiers pour caviarder plusieurs fichiers à la fois"
|
||||
manual = "Manuel"
|
||||
manualDesc = "Cliquez et faites glisser pour occulter des zones spécifiques"
|
||||
manualComingSoon = "Occultation manuelle bientôt disponible"
|
||||
@@ -3315,35 +3225,8 @@ text = "Ne fait correspondre que les mots complets, pas les correspondances part
|
||||
title = "Convertir en PDF-image"
|
||||
text = "Convertit le PDF en PDF-image après occultation. Cela garantit que le texte derrière les boîtes est entièrement supprimé et irrécupérable."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Contrôles de caviardage manuel"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Outil de marquage de texte"
|
||||
text = "Sélectionnez le texte directement sur le PDF pour le marquer en vue du caviardage. Cliquez et faites glisser pour surligner le texte spécifique à caviarder."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Outil de marquage de zone"
|
||||
text = "Dessinez des zones rectangulaires sur le PDF pour marquer des régions à caviarder. Utile pour caviarder des images, des signatures ou des formes irrégulières."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Appliquer les caviardages"
|
||||
text = "Après avoir marqué le contenu, cliquez sur « Appliquer » pour caviarder définitivement toutes les zones marquées. Le compteur en attente indique le nombre de caviardages prêts à être appliqués."
|
||||
bullet1 = "Marquez autant de zones que nécessaire avant d’appliquer"
|
||||
bullet2 = "Tous les caviardages en attente sont appliqués en une fois"
|
||||
bullet3 = "Les caviardages ne peuvent pas être annulés après application"
|
||||
|
||||
[redact.manual]
|
||||
title = "Outils de caviardage"
|
||||
instructions = "Sélectionnez du texte ou dessinez des zones sur le PDF pour marquer le contenu à caviarder."
|
||||
markText = "Marquer du texte"
|
||||
markArea = "Marquer une zone"
|
||||
pendingLabel = "En attente :"
|
||||
applyWarning = "⚠️ Application permanente, irréversible, et les données sous-jacentes seront supprimées"
|
||||
apply = "Appliquer"
|
||||
noMarks = "Aucun marquage de caviardage. Utilisez les outils ci-dessus pour marquer le contenu à caviarder."
|
||||
header = "Occultation manuelle"
|
||||
controlsTitle = "Contrôles de caviardage manuel"
|
||||
textBasedRedaction = "Occultation basée sur le texte"
|
||||
pageBasedRedaction = "Occultation par page"
|
||||
convertPDFToImageLabel = "Convertir le PDF en PDF-image (permet de supprimer le texte derrière la boîte)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Saisir le nombre de divisions horizontales"
|
||||
label = "Divisions verticales"
|
||||
placeholder = "Entrer le nombre de divisions verticales"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Mode de fractionnement"
|
||||
description = "Choisissez comment fractionner les pages"
|
||||
splitAll = "Fractionner toutes les pages"
|
||||
splitAllExceptFirst = "Tout fractionner sauf la première"
|
||||
splitAllExceptLast = "Tout fractionner sauf la dernière"
|
||||
splitAllExceptFirstAndLast = "Tout fractionner sauf la première et la dernière"
|
||||
custom = "Pages personnalisées"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Numéros de pages personnalisés"
|
||||
placeholder = "ex. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize"
|
||||
header = "Tampon PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Taille du Fichier"
|
||||
[compress.grayscale]
|
||||
label = "Appliquer l'échelle de gris pour la compression"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linéariser le PDF pour une lecture web rapide"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Convertir les images en dessin au trait"
|
||||
description = "Utilise ImageMagick pour réduire les pages en noir et blanc à fort contraste afin de maximiser la réduction de taille."
|
||||
unavailable = "ImageMagick n’est pas installé ou activé sur ce serveur"
|
||||
detailLevel = "Niveau de détail"
|
||||
edgeEmphasis = "Accentuation des contours"
|
||||
edgeLow = "Douce"
|
||||
edgeMedium = "Équilibrée"
|
||||
edgeHigh = "Forte"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Aperçu des paramètres de compression"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Des valeurs élevées réduisent la taille du fichier"
|
||||
title = "Niveaux de gris"
|
||||
text = "Sélectionnez cette option pour convertir toutes les images en noir et blanc, ce qui peut réduire significativement la taille, en particulier pour les PDF scannés ou riches en images."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Dessin au trait"
|
||||
text = "Convertit les pages en noir et blanc à fort contraste à l’aide d’ImageMagick. Utilisez le niveau de détail pour contrôler la quantité de contenu qui devient noir, et l’accentuation des contours pour contrôler l’agressivité de la détection des contours."
|
||||
|
||||
[compress.error]
|
||||
failed = "Une erreur est survenue lors de la compression du PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Une erreur est survenue lors de la compression du PDF."
|
||||
_value = "Paramètres de compression"
|
||||
1 = "1-3 compression PDF,</br> 4-6 compression d'image légère,</br> 7-9 compression d'image intense qui réduira considérablement la qualité de l'image"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Des valeurs faibles préservent la qualité mais donnent des fichiers plus volumineux"
|
||||
range4to6 = "Compression moyenne avec réduction modérée de la qualité"
|
||||
range7to9 = "Des valeurs élevées réduisent fortement la taille du fichier mais peuvent diminuer la netteté des images"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Ce fichier est protégé par un mot de passe. Veuillez saisir le mot de passe :"
|
||||
cancelled = "Operation annulée pour le PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Supprimer les pages sélectionnées"
|
||||
closePdf = "Fermer le PDF"
|
||||
exportAll = "Exporter le PDF"
|
||||
downloadSelected = "Télécharger les fichiers sélectionnés"
|
||||
annotations = "Annotations"
|
||||
exportSelected = "Exporter les pages sélectionnées"
|
||||
saveChanges = "Enregistrer les modifications"
|
||||
downloadAll = "Tout télécharger"
|
||||
saveAll = "Tout enregistrer"
|
||||
toggleTheme = "Changer de thème"
|
||||
toggleBookmarks = "Afficher/Masquer les signets"
|
||||
language = "Langue"
|
||||
toggleAnnotations = "Afficher/masquer les annotations"
|
||||
search = "Rechercher dans le PDF"
|
||||
panMode = "Mode panoramique"
|
||||
applyRedactionsFirst = "Appliquez d’abord les caviardages"
|
||||
rotateLeft = "Pivoter à gauche"
|
||||
rotateRight = "Pivoter à droite"
|
||||
toggleSidebar = "Afficher/masquer la barre latérale"
|
||||
toggleBookmarks = "Afficher/Masquer les signets"
|
||||
exportSelected = "Exporter les pages sélectionnées"
|
||||
toggleAnnotations = "Afficher/masquer les annotations"
|
||||
annotationMode = "Basculer en mode annotation"
|
||||
print = "Imprimer le PDF"
|
||||
draw = "Dessiner"
|
||||
redact = "Caviarder"
|
||||
exitRedaction = "Quitter le mode de caviardage"
|
||||
save = "Enregistrer"
|
||||
downloadAll = "Tout télécharger"
|
||||
saveAll = "Tout enregistrer"
|
||||
|
||||
[textAlign]
|
||||
left = "Gauche"
|
||||
center = "Centre"
|
||||
right = "Droite"
|
||||
|
||||
[annotation]
|
||||
title = "Annoter"
|
||||
desc = "Utilisez surlignage, stylo, texte et notes. Les modifications restent actives—aucun aplatissement requis."
|
||||
highlight = "Surligner"
|
||||
pen = "Stylo"
|
||||
text = "Zone de texte"
|
||||
note = "Note"
|
||||
rectangle = "Rectangle"
|
||||
ellipse = "Ellipse"
|
||||
select = "Sélectionner"
|
||||
exit = "Quitter le mode d’annotation"
|
||||
strokeWidth = "Épaisseur"
|
||||
opacity = "Opacité"
|
||||
strokeOpacity = "Opacité du trait"
|
||||
fillOpacity = "Opacité de remplissage"
|
||||
fontSize = "Taille de police"
|
||||
chooseColor = "Choisir une couleur"
|
||||
color = "Couleur"
|
||||
strokeColor = "Couleur du trait"
|
||||
fillColor = "Couleur de remplissage"
|
||||
underline = "Souligner"
|
||||
strikeout = "Barré"
|
||||
squiggly = "Ondulé"
|
||||
inkHighlighter = "Surligneur à main levée"
|
||||
freehandHighlighter = "Surligneur à main levée"
|
||||
square = "Carré"
|
||||
circle = "Cercle"
|
||||
polygon = "Polygone"
|
||||
line = "Ligne"
|
||||
stamp = "Ajouter une image"
|
||||
textMarkup = "Marquage de texte"
|
||||
drawing = "Dessin"
|
||||
shapes = "Formes"
|
||||
notesStamps = "Notes et tampons"
|
||||
settings = "Paramètres"
|
||||
borderOn = "Bordure : activée"
|
||||
borderOff = "Bordure : désactivée"
|
||||
editInk = "Modifier le stylo"
|
||||
editLine = "Modifier la ligne"
|
||||
editNote = "Modifier la note"
|
||||
editText = "Modifier la zone de texte"
|
||||
editTextMarkup = "Modifier le marquage de texte"
|
||||
editSelected = "Modifier l’annotation"
|
||||
editSquare = "Modifier le carré"
|
||||
editCircle = "Modifier le cercle"
|
||||
editPolygon = "Modifier le polygone"
|
||||
unsupportedType = "Ce type d’annotation n’est pas entièrement pris en charge pour l’édition."
|
||||
textAlignment = "Alignement du texte"
|
||||
noteIcon = "Icône de note"
|
||||
imagePreview = "Aperçu"
|
||||
contents = "Texte"
|
||||
backgroundColor = "Couleur d’arrière-plan"
|
||||
clearBackground = "Supprimer l’arrière-plan"
|
||||
noBackground = "Sans arrière-plan"
|
||||
stampSettings = "Paramètres du tampon"
|
||||
savingCopy = "Préparation du téléchargement..."
|
||||
saveFailed = "Impossible d’enregistrer une copie"
|
||||
saveReady = "Téléchargement prêt"
|
||||
selectAndMove = "Sélectionner et modifier"
|
||||
editSelectDescription = "Cliquez une annotation existante pour en modifier la couleur, l’opacité, le texte ou la taille."
|
||||
editStampHint = "Pour changer l’image, supprimez ce tampon et ajoutez-en un nouveau."
|
||||
editSwitchToSelect = "Basculez sur Sélectionner et modifier pour modifier cette annotation."
|
||||
undo = "Annuler"
|
||||
redo = "Rétablir"
|
||||
applyChanges = "Appliquer les modifications"
|
||||
saveChanges = "Enregistrer les modifications"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Réglages"
|
||||
adminSettings = "Réglages admin"
|
||||
allTools = "Outils"
|
||||
reader = "Lecteur"
|
||||
tours = "Visites guidées"
|
||||
showMeAround = "Faites-moi visiter"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Visionnez des parcours ici : parcours des outils, parcours de la nouvelle interface V2 et parcours Admin."
|
||||
user = "Visionnez des parcours ici : parcours des outils et parcours de la nouvelle interface V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Visite des outils"
|
||||
toolsTourDesc = "Découvrez ce que les outils peuvent faire"
|
||||
adminTour = "Visite administrateur"
|
||||
adminTourDesc = "Découvrez les paramètres et fonctionnalités d’administration"
|
||||
whatsNewTour = "Voir les nouveautés de la V2"
|
||||
whatsNewTourDesc = "Découvrir la nouvelle interface"
|
||||
|
||||
[admin]
|
||||
error = "Erreur"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Échec du chargement des paramètres"
|
||||
saveError = "Échec de l’enregistrement des paramètres"
|
||||
saved = "Paramètres enregistrés avec succès"
|
||||
saveSuccess = "Paramètres enregistrés avec succès"
|
||||
success = "Paramètres enregistrés avec succès"
|
||||
error = "Échec de l’enregistrement des paramètres"
|
||||
save = "Enregistrer les modifications"
|
||||
discard = "Ignorer"
|
||||
restartRequired = "Redémarrage requis"
|
||||
@@ -4422,13 +4185,6 @@ description = "Chemin vers l’exécutable WeasyPrint pour la conversion HTML ve
|
||||
label = "Exécutable Unoconvert"
|
||||
description = "Chemin vers LibreOffice unoconvert pour les conversions de documents (laisser vide pour la valeur par défaut : /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "URL du frontend"
|
||||
description = "URL de base du frontend (ex., https://pdf.example.com). Utilisée pour les liens d’invitation par e-mail et les téléversements mobiles via QR code. Laissez vide pour utiliser l’URL du backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Cliquez pour voir les détails de l’abonnement"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sécurité"
|
||||
description = "Configurer l’authentification, le comportement de connexion et les politiques de sécurité."
|
||||
@@ -4505,7 +4261,7 @@ description = "Suivre les actions des utilisateurs et les événements système
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Niveau d’audit"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=DÉSACTIVÉ, 1=BASIQUE, 2=STANDARD, 3=VERBEUX"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Rétention des journaux (jours)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Connecter"
|
||||
disconnect = "Déconnecter"
|
||||
disconnected = "Fournisseur déconnecté avec succès"
|
||||
disconnectError = "Échec de la déconnexion du fournisseur"
|
||||
mobileScannerConvertToPdf = "Convertir les images en PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertir automatiquement les images téléversées en PDF. Si désactivé, les images sont conservées telles quelles."
|
||||
mobileScannerImageResolution = "Résolution d’image"
|
||||
mobileScannerImageResolutionDesc = "Résolution des images téléversées. « Réduite » redimensionne les images jusqu’à 1200px max pour réduire la taille du fichier."
|
||||
imageResolutionFull = "Pleine (taille d’origine)"
|
||||
imageResolutionReduced = "Réduite (Max 1200px)"
|
||||
mobileScannerPageFormat = "Format de page"
|
||||
mobileScannerPageFormatDesc = "Taille de page PDF pour les images converties. « Conserver » utilise les dimensions d’origine de l’image."
|
||||
pageFormatKeep = "Conserver (dimensions d’origine)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Étirer pour remplir"
|
||||
mobileScannerStretchToFitDesc = "Étirer les images pour remplir toute la page. Si désactivé, les images sont centrées avec ratio préservé."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Connexion automatique SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Créer automatiquement des comptes utilisateurs lors de la premi
|
||||
label = "Bloquer l’inscription"
|
||||
description = "Empêcher l’inscription de nouveaux utilisateurs via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Téléversement depuis mobile"
|
||||
enable = "Activer le téléversement par QR code"
|
||||
description = "Permettre aux utilisateurs de téléverser des fichiers depuis des appareils mobiles en scannant un QR code"
|
||||
note = "Remarque : nécessite la configuration de l’URL du frontend. "
|
||||
link = "Configurer dans les paramètres du système"
|
||||
mobileScannerConvertToPdf = "Convertir les images en PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertir automatiquement les images téléversées en PDF. Si désactivé, les images sont conservées telles quelles."
|
||||
mobileScannerImageResolution = "Résolution d’image"
|
||||
mobileScannerImageResolutionDesc = "Résolution des images téléversées. « Réduite » redimensionne les images jusqu’à 1200px max pour réduire la taille du fichier."
|
||||
imageResolutionFull = "Pleine (taille d’origine)"
|
||||
imageResolutionReduced = "Réduite (Max 1200px)"
|
||||
mobileScannerPageFormat = "Format de page"
|
||||
mobileScannerPageFormatDesc = "Taille de page PDF pour les images converties. « Conserver » utilise les dimensions d’origine de l’image."
|
||||
pageFormatKeep = "Conserver (dimensions d’origine)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Étirer pour remplir"
|
||||
mobileScannerStretchToFitDesc = "Étirer les images pour remplir toute la page. Si désactivé, les images sont centrées avec ratio préservé."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot Telegram"
|
||||
description = "Configurer la connectivité du bot Telegram, les contrôles d’accès et le comportement des retours."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Activer le bot Telegram"
|
||||
description = "Permettre aux utilisateurs d’interagir avec Stirling PDF via votre bot Telegram configuré."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nom d’utilisateur du bot"
|
||||
description = "Le nom d’utilisateur public de votre bot Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Jeton du bot"
|
||||
description = "Jeton API fourni par BotFather pour votre bot Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Dossier de réception"
|
||||
description = "Dossier sous le répertoire pipeline où sont stockés les fichiers Telegram entrants."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Utiliser un suffixe de dossier personnalisé"
|
||||
description = "Ajouter l’ID du chat aux dossiers des fichiers entrants pour isoler les téléversements par chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Contrôle d’accès"
|
||||
description = "Restreindre quels utilisateurs ou canaux peuvent interagir avec le bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Autoriser des ID utilisateur spécifiques"
|
||||
description = "Lorsque activé, seuls les ID utilisateur listés peuvent utiliser le bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID utilisateur autorisés"
|
||||
description = "Saisissez les ID utilisateur Telegram autorisés à interagir avec le bot."
|
||||
placeholder = "Ajoutez un ID utilisateur et appuyez sur Entrée"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Autoriser des ID de canal spécifiques"
|
||||
description = "Lorsque activé, seuls les ID de canal listés peuvent utiliser le bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID de canal autorisés"
|
||||
description = "Saisissez les ID de canal Telegram autorisés à interagir avec le bot."
|
||||
placeholder = "Ajoutez un ID de canal et appuyez sur Entrée"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Traitement"
|
||||
description = "Contrôler les intervalles d’interrogation et les délais de traitement pour les téléversements Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Délai de traitement (secondes)"
|
||||
description = "Temps d’attente maximal d’un job de traitement avant de signaler une erreur."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Intervalle d’interrogation (ms)"
|
||||
description = "Intervalle entre les vérifications des nouvelles mises à jour Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Messages de retour"
|
||||
description = "Choisissez quand le bot doit envoyer des retours aux utilisateurs et aux canaux."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Activer les retours"
|
||||
description = "Contrôler si le bot envoie des messages de retour ou non."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Règles de retour (canaux)"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Afficher « Aucun document valide » (Canal)"
|
||||
description = "Supprimer la réponse « aucun document valide » pour les téléversements de canal."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Afficher les erreurs de traitement (Canal)"
|
||||
description = "Envoyer les messages d’erreur de traitement aux canaux."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Afficher les messages d’erreur (Canal)"
|
||||
description = "Afficher des messages d’erreur détaillés pour les canaux."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Règles de retour (utilisateurs)"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Afficher « Aucun document valide » (Utilisateur)"
|
||||
description = "Supprimer la réponse « aucun document valide » pour les téléversements utilisateur."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Afficher les erreurs de traitement (Utilisateur)"
|
||||
description = "Envoyer les messages d’erreur de traitement aux utilisateurs."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Afficher les messages d’erreur (Utilisateur)"
|
||||
description = "Afficher des messages d’erreur détaillés pour les utilisateurs."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Base de données"
|
||||
description = "Configurer des paramètres de connexion à une base de données personnalisée pour les déploiements d’entreprise."
|
||||
@@ -4943,10 +4570,6 @@ description = "Permettre aux administrateurs d’inviter des utilisateurs par e-
|
||||
label = "URL du frontend"
|
||||
description = "URL de base du frontend (ex. https://pdf.example.com). Utilisée pour générer les liens d’invitation dans les e-mails. Laisser vide pour utiliser l’URL du backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Remarque : nécessite la configuration de l’URL du frontend. "
|
||||
link = "Configurer dans les paramètres du système"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documents juridiques"
|
||||
description = "Configurer les liens vers les documents et politiques juridiques."
|
||||
@@ -4976,7 +4599,7 @@ label = "Mentions légales"
|
||||
description = "URL ou nom de fichier de l’impressum (obligatoire dans certaines juridictions)"
|
||||
|
||||
[admin.settings.premium]
|
||||
title = "Premium & Enterprise"
|
||||
title = "Premium et Entreprise"
|
||||
description = "Configurer votre clé de licence Premium ou Enterprise."
|
||||
license = "Configuration de la licence"
|
||||
noInput = "Veuillez fournir une clé de licence ou un fichier"
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Mes fichiers"
|
||||
noRecentFiles = "Aucun fichier récent trouvé"
|
||||
googleDriveNotAvailable = "Intégration Google Drive non disponible"
|
||||
mobileUpload = "Téléversement mobile"
|
||||
mobileShort = "Mobile"
|
||||
mobileUploadNotAvailable = "Téléversement mobile non activé"
|
||||
downloadSelected = "Télécharger la sélection"
|
||||
saveSelected = "Enregistrer la sélection"
|
||||
openFiles = "Ouvrir des fichiers"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Chargement…"
|
||||
back = "Retour"
|
||||
continue = "Continuer"
|
||||
error = "Erreur"
|
||||
save = "Enregistrer"
|
||||
|
||||
[config.overview]
|
||||
title = "Configuration de l’application"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Toute application ou service utilisant actuellement ces clés cessera
|
||||
confirmPrompt = "Êtes-vous sûr de vouloir continuer ?"
|
||||
confirmCta = "Actualiser les clés"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Erreur de clé API"
|
||||
failedToCreateApiKey = "Échec de création de la clé API."
|
||||
failedToRetrieveApiKey = "Échec de récupération de la clé API depuis la réponse."
|
||||
failedToFetchApiKey = "Échec de récupération de la clé API."
|
||||
apiKeyRefreshed = "Clé API actualisée"
|
||||
apiKeyRefreshedBody = "Votre clé API a été actualisée avec succès."
|
||||
failedToRefreshApiKey = "Échec d’actualisation de la clé API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Sélectionner des pièces jointes"
|
||||
info = "Sélectionnez des fichiers à joindre à votre PDF. Ces fichiers seront intégrés et accessibles via le panneau des pièces jointes du PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Terminer"
|
||||
startTour = "Commencer la visite"
|
||||
startTourDescription = "Suivez une visite guidée des fonctionnalités clés de Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Commencez par le <strong>rail Accès rapide</strong> pour passer entre Lecteur, Automatiser, vos fichiers et toutes les visites."
|
||||
leftPanel = "Le panneau <strong>Outils</strong> à gauche liste tout ce que vous pouvez faire. Parcourez les catégories ou recherchez pour trouver un outil rapidement."
|
||||
fileUpload = "Utilisez le bouton <strong>Fichiers</strong> pour téléverser ou choisir un PDF récent. Nous chargerons un exemple pour vous montrer l’espace de travail."
|
||||
rightRail = "Le <strong>rail de droite</strong> contient des actions rapides pour sélectionner des fichiers, changer le thème ou la langue, et télécharger les résultats."
|
||||
topBar = "La barre supérieure permet de basculer entre la <strong>Visionneuse</strong>, <strong>l’Éditeur de pages</strong> et <strong>les fichiers actifs</strong>."
|
||||
pageEditorView = "Passez à l’Éditeur de pages pour réorganiser, pivoter ou supprimer des pages."
|
||||
activeFilesView = "Utilisez Fichiers actifs pour voir tout ce que vous avez ouvert et choisir sur quoi travailler."
|
||||
wrapUp = "Voilà les nouveautés de la V2. Ouvrez le menu <strong>Visites guidées</strong> à tout moment pour rejouer ceci, le parcours des outils ou le parcours Admin."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Bienvenue dans Stirling PDF !"
|
||||
description = "Souhaitez-vous suivre une visite guidée d’une minute pour découvrir les fonctionnalités clés et comment démarrer ?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Télécharger →"
|
||||
showMeAround = "Faites-moi faire le tour"
|
||||
skipTheTour = "Passer la visite"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Aperçu de la visite"
|
||||
body = "Stirling PDF V2 est livré avec des dizaines d’outils et une interface renouvelée. Faites une visite rapide pour voir ce qui a changé et où trouver les fonctionnalités dont vous avez besoin."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Passer pour l’instant"
|
||||
seePlans = "Voir les offres →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Mettre à niveau maintenant →"
|
||||
freeTitle = "Licence serveur"
|
||||
overLimitTitle = "Licence serveur requise"
|
||||
overLimitBody = "Notre licence autorise jusqu’à <strong>{{freeTierLimit}}</strong> utilisateurs gratuits par serveur. Vous avez <strong>{{overLimitUserCopy}}</strong> utilisateurs Stirling. Pour continuer sans interruption, passez au plan Stirling Server — <strong>places illimitées</strong>, édition de texte PDF et contrôle d’administration complet pour 99 $/serveur/mois."
|
||||
freeBody = "Notre licence <strong>Open-Core</strong> autorise jusqu’à <strong>{{freeTierLimit}}</strong> utilisateurs gratuits par serveur. Pour évoluer sans interruption et accéder en avant-première à notre nouvel <strong>outil d’édition de texte PDF</strong>, nous recommandons le plan Stirling Server — édition complète et <strong>places illimitées</strong> pour 99 $/serveur/mois."
|
||||
freeBody = "Notre régime de licence <strong>Open-Core</strong> autorise jusqu'à <strong>{{freeTierLimit}}</strong> utilisateurs gratuitement par serveur. Pour évoluer sans interruption, nous recommandons le forfait Stirling Server - <strong>places illimitées</strong> et <strong>prise en charge du SSO</strong> pour 99 $/serveur/mois."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Télécharger"
|
||||
@@ -5712,7 +5308,7 @@ active = "Actif"
|
||||
disabled = "Désactivé"
|
||||
activeSession = "Session active"
|
||||
member = "Membre"
|
||||
admin = "Admin"
|
||||
admin = "Administrateur"
|
||||
editRole = "Modifier le rôle"
|
||||
enable = "Activer"
|
||||
disable = "Désactiver"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contacter l’équipe commerciale"
|
||||
contactToUpgrade = "Contactez-nous pour mettre à niveau ou personnaliser votre forfait"
|
||||
maxUsers = "Nombre maximal d’utilisateurs"
|
||||
upTo = "Jusqu’à"
|
||||
getLicense = "Obtenir une licence serveur"
|
||||
upgradeToEnterprise = "Passer à l’Enterprise"
|
||||
selectPeriod = "Sélectionner la période de facturation"
|
||||
monthlyBilling = "Facturation mensuelle"
|
||||
yearlyBilling = "Facturation annuelle"
|
||||
checkoutOpened = "Paiement ouvert"
|
||||
checkoutInstructions = "Terminez votre achat dans l’onglet Stripe. Après le paiement, revenez ici et actualisez la page pour activer votre licence. Vous recevrez également un e-mail avec votre clé de licence."
|
||||
activateLicense = "Activer votre licence"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Paiement ouvert dans un nouvel onglet"
|
||||
instructions = "Terminez votre achat dans l’onglet Stripe. Une fois le paiement terminé, vous recevrez un e-mail avec votre clé de licence."
|
||||
enterKey = "Saisissez votre clé de licence ci-dessous pour activer votre offre :"
|
||||
keyDescription = "Collez la clé de licence depuis votre e-mail"
|
||||
activate = "Activer la licence"
|
||||
doLater = "Je le ferai plus tard"
|
||||
success = "Licence activée !"
|
||||
successMessage = "Votre licence a été activée avec succès. Vous pouvez maintenant fermer cette fenêtre."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Vérification de l’e-mail requise"
|
||||
message = "Vous devrez vérifier votre adresse e-mail dans le portail de facturation Stripe. Vérifiez votre e-mail pour un lien de connexion."
|
||||
|
||||
[plan.period]
|
||||
month = "mois"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Système d’audit non disponible"
|
||||
notAvailableMessage = "Le système d’audit n’est pas configuré ou n’est pas disponible."
|
||||
disabled = "La journalisation d’audit est désactivée"
|
||||
disabledMessage = "Activez la journalisation d’audit dans la configuration de votre application pour suivre les événements du système."
|
||||
enterpriseRequired = "Licence Enterprise requise"
|
||||
enterpriseRequiredMessage = "Le système de journalisation d’audit est une fonctionnalité Enterprise. Veuillez passer à une licence Enterprise pour accéder aux journaux d’audit et aux analyses."
|
||||
|
||||
[audit.error]
|
||||
title = "Erreur lors du chargement du système d’audit"
|
||||
@@ -6292,7 +5864,7 @@ title = "Graphique d’utilisation des endpoints"
|
||||
|
||||
[usage.table]
|
||||
title = "Statistiques détaillées"
|
||||
endpoint = "Endpoint"
|
||||
endpoint = "Point de terminaison"
|
||||
visits = "Visites"
|
||||
percentage = "Pourcentage"
|
||||
noData = "Aucune donnée disponible"
|
||||
@@ -6370,7 +5942,6 @@ description = "Saisissez l’URL complète de votre serveur Stirling PDF auto‑
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Veuillez saisir une URL de serveur"
|
||||
invalidUrl = "Format d’URL invalide. Veuillez saisir une URL valide comme https://your-server.com"
|
||||
unreachable = "Connexion au serveur impossible"
|
||||
testFailed = "Échec du test de connexion"
|
||||
configFetch = "Échec de la récupération de la configuration du serveur. Veuillez vérifier l'URL et réessayer."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Connexion à :"
|
||||
submit = "Se connecter"
|
||||
signInWith = "Se connecter avec"
|
||||
oauthPending = "Ouverture du navigateur pour l'authentification..."
|
||||
sso = "Authentification unique"
|
||||
orContinueWith = "Ou continuer avec l’email"
|
||||
serverRequirement = "Remarque : le serveur doit avoir la connexion activée."
|
||||
showInstructions = "Comment l’activer ?"
|
||||
@@ -6404,7 +5974,7 @@ label = "Nom d’utilisateur"
|
||||
placeholder = "Entrez votre nom d’utilisateur"
|
||||
|
||||
[setup.login.email]
|
||||
label = "Email"
|
||||
label = "E-mail"
|
||||
placeholder = "Saisissez votre email"
|
||||
|
||||
[setup.login.password]
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Page de paragraphe"
|
||||
sparse = "Texte clairsemé"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automatique"
|
||||
paragraph = "Paragraphe"
|
||||
singleLine = "Ligne unique"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Réinitialiser les modifications"
|
||||
downloadJson = "Télécharger le JSON"
|
||||
generatePdf = "Générer le PDF"
|
||||
saveChanges = "Enregistrer les modifications"
|
||||
applyChanges = "Appliquer les modifications"
|
||||
downloadCopy = "Télécharger une copie"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Ajuster automatiquement le texte aux cadres"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Astuce : Maintenez Ctrl (Cmd) ou Shift pour sélectionner p
|
||||
title = "Verrouiller le texte modifié à un seul élément PDF"
|
||||
description = "Lorsqu'il est activé, l'éditeur exporte chaque boîte de texte modifiée comme un seul élément de texte PDF afin d'éviter le chevauchement de glyphes ou les polices mixtes."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Paramètres avancés"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitations de l’aperçu"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Focus texte et image"
|
||||
text = "Cet espace de travail se concentre sur l’édition du texte et le repositionnement des images intégrées. Les illustrations complexes de page, widgets de formulaire et graphismes en couches sont préservés pour l’export mais ne sont pas entièrement modifiables ici."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variations de l’aperçu"
|
||||
text = "Certains éléments visuels (tels que bordures de tableau, formes ou apparence des annotations) peuvent ne pas s’afficher exactement dans l’aperçu. Le PDF exporté conserve les commandes de dessin originales lorsque c’est possible."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visionneuse Alpha"
|
||||
text = "Cette visionneuse alpha évolue encore—certaines polices, couleurs, effets de transparence et détails de mise en page peuvent légèrement varier. Veuillez vérifier le PDF généré avant de le partager."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Fusionner les boîtes sélectionnées"
|
||||
merge = "Fusionner la sélection"
|
||||
@@ -6614,58 +6164,3 @@ title = "Résultats de l'ajout de texte"
|
||||
|
||||
[addText.error]
|
||||
failed = "Une erreur est survenue lors de l'ajout de texte au PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Téléverser depuis un mobile"
|
||||
description = "Scannez pour téléverser des photos. Les images se convertissent automatiquement en PDF."
|
||||
descriptionNoConvert = "Scannez pour téléverser des photos depuis votre appareil mobile."
|
||||
error = "Erreur de connexion"
|
||||
pollingError = "Erreur lors de la vérification des fichiers"
|
||||
sessionId = "ID de session"
|
||||
sessionCreateError = "Échec de création de session"
|
||||
expiryWarning = "Expiration de la session imminente"
|
||||
expiryWarningMessage = "Ce QR code expirera dans {{seconds}} secondes. Un nouveau code sera généré automatiquement."
|
||||
filesReceived = "{{count}} fichier(s) reçu(s)"
|
||||
connected = "Appareil mobile connecté"
|
||||
instructions = "Scannez avec l’appareil photo de votre téléphone. Les images sont automatiquement converties en PDF."
|
||||
instructionsNoConvert = "Scannez avec l’appareil photo de votre téléphone pour téléverser des fichiers."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Scanner mobile"
|
||||
noSession = "Session invalide"
|
||||
noSessionMessage = "Veuillez scanner un QR code valide pour accéder à cette page."
|
||||
validating = "Validation de la session..."
|
||||
sessionInvalid = "Erreur de session"
|
||||
sessionExpired = "Cette session a expiré. Veuillez actualiser et réessayer."
|
||||
sessionNotFound = "Session introuvable. Veuillez actualiser et réessayer."
|
||||
sessionValidationError = "Impossible de vérifier la session. Veuillez réessayer."
|
||||
uploadSuccess = "Téléversement réussi !"
|
||||
uploadSuccessMessage = "Vos images ont été transférées."
|
||||
httpsRequired = "L’accès à la caméra nécessite HTTPS ou localhost. Veuillez utiliser HTTPS ou accéder via localhost."
|
||||
uploadFailed = "Échec du téléversement. Veuillez réessayer."
|
||||
uploading = "Téléversement..."
|
||||
connected = "Connecté"
|
||||
connecting = "Connexion..."
|
||||
chooseMethod = "Choisir la méthode de téléversement"
|
||||
chooseMethodDescription = "Sélectionnez comment vous souhaitez scanner et téléverser des documents"
|
||||
camera = "Appareil photo"
|
||||
cameraDescription = "Scanner des documents avec l’appareil photo de votre appareil avec détection automatique des bords"
|
||||
fileUpload = "Téléversement de fichier"
|
||||
fileDescription = "Téléverser des photos ou documents existants depuis votre appareil"
|
||||
cameraAccessDenied = "Accès à la caméra refusé. Veuillez activer l’accès à la caméra."
|
||||
back = "Retour"
|
||||
settings = "Paramètres"
|
||||
edgeDetection = "Détection des bords"
|
||||
flashlight = "Lampe torche"
|
||||
flash = "Flash"
|
||||
processing = "Traitement..."
|
||||
capture = "Prendre la photo"
|
||||
selectFilesPrompt = "Sélectionnez des fichiers à téléverser"
|
||||
selectImage = "Sélectionner une image"
|
||||
preview = "Aperçu"
|
||||
retake = "Reprendre"
|
||||
addToBatch = "Ajouter au lot"
|
||||
upload = "Téléverser"
|
||||
batchImages = "Lot"
|
||||
clearBatch = "Effacer"
|
||||
uploadAll = "Tout téléverser"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "आपके PDF में असहेजे परिवर्तन हैं।"
|
||||
pendingRedactionsTitle = "लागू न किए गए रिडैक्शन"
|
||||
pendingRedactions = "आपके पास लागू न किए गए रिडैक्शन हैं जो खो जाएँगे।"
|
||||
areYouSure = "क्या आप वाकई छोड़ना चाहते हैं?"
|
||||
unsavedChangesTitle = "असहेजे परिवर्तन"
|
||||
keepWorking = "काम जारी रखें"
|
||||
discardChanges = "त्यागें और बाहर निकलें"
|
||||
discardRedactions = "त्यागें और बाहर निकलें"
|
||||
applyAndContinue = "सहेजें और बाहर निकलें"
|
||||
exportAndContinue = "निर्यात करें और जारी रखें"
|
||||
cancel = "रद्द करें"
|
||||
@@ -134,7 +131,7 @@ unsupported = "असमर्थित"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "शुरू करने के लिए कोई टूल चुनें"
|
||||
alpha = "Alpha"
|
||||
alpha = "अल्फा"
|
||||
premiumFeature = "प्रीमियम फीचर:"
|
||||
comingSoon = "जल्द आ रहा है:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "उन्नत"
|
||||
edit = "देखें और संपादित करें"
|
||||
popular = "लोकप्रिय"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "प्राथमिकताएँ"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "एडवांस्ड"
|
||||
title = "सुरक्षा और प्रमाणीकरण"
|
||||
security = "सुरक्षा"
|
||||
connections = "कनेक्शन्स"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "लाइसेंसिंग और एनालिटिक्स"
|
||||
@@ -382,7 +374,7 @@ privacy = "गोपनीयता"
|
||||
|
||||
[settings.developer]
|
||||
title = "डेवलपर"
|
||||
apiKeys = "API Keys"
|
||||
apiKeys = "API कुंजियाँ"
|
||||
|
||||
[settings.tooltips]
|
||||
enableLoginFirst = "पहले लॉगिन मोड सक्षम करें"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "वर्तमान संस्करण"
|
||||
latestVersion = "नवीनतम संस्करण"
|
||||
checkForUpdates = "अपडेट्स जाँचें"
|
||||
viewDetails = "विवरण देखें"
|
||||
serverNeedsUpdate = "व्यवस्थापक को सर्वर अपडेट करना होगा"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "संस्करण जानकारी"
|
||||
description = "डेस्कटॉप और सर्वर संस्करण विवरण"
|
||||
desktop = "डेस्कटॉप संस्करण"
|
||||
server = "सर्वर संस्करण"
|
||||
|
||||
[settings.security]
|
||||
title = "सुरक्षा"
|
||||
description = "अपने खाते को सुरक्षित रखने के लिए अपना पासवर्ड अपडेट करें।"
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "अपना पासवर्ड बदलें। अपडेट के बाद आप लॉगआउट हो जाएँगे।"
|
||||
required = "सभी फ़ील्ड अनिवार्य हैं।"
|
||||
mismatch = "नए पासवर्ड मेल नहीं खाते।"
|
||||
error = "पासवर्ड अपडेट नहीं हो सका। कृपया अपना वर्तमान पासवर्ड जाँचें और फिर से प्रयास करें।"
|
||||
success = "पासवर्ड सफलतापूर्वक अपडेट किया गया। कृपया दोबारा साइन इन करें।"
|
||||
ssoDisabled = "पासवर्ड परिवर्तन आपके पहचान प्रदाता द्वारा प्रबंधित किए जाते हैं।"
|
||||
current = "वर्तमान पासवर्ड"
|
||||
currentPlaceholder = "अपना वर्तमान पासवर्ड दर्ज करें"
|
||||
new = "नया पासवर्ड"
|
||||
newPlaceholder = "नया पासवर्ड दर्ज करें"
|
||||
confirm = "नए पासवर्ड की पुष्टि करें"
|
||||
confirmPlaceholder = "अपने नए पासवर्ड को फिर से दर्ज करें"
|
||||
update = "पासवर्ड अपडेट करें"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "कीबोर्ड शॉर्टकट्स"
|
||||
@@ -522,16 +488,11 @@ low = "कम"
|
||||
title = "क्रेडेंशियल्स बदलें"
|
||||
header = "अपना खाता विवरण अपडेट करें"
|
||||
changePassword = "आप डिफ़ॉल्ट लॉगिन क्रेडेंशियल्स का उपयोग कर रहे हैं। कृपया एक नया पासवर्ड दर्ज करें"
|
||||
ssoManaged = "आपका खाता आपके पहचान प्रदाता द्वारा प्रबंधित है।"
|
||||
newUsername = "नया उपयोगकर्ता नाम"
|
||||
oldPassword = "वर्तमान पासवर्ड"
|
||||
newPassword = "नया पासवर्ड"
|
||||
confirmNewPassword = "नए पासवर्ड की पुष्टि करें"
|
||||
submit = "परिवर्तन जमा करें"
|
||||
credsUpdated = "खाता अपडेट किया गया"
|
||||
description = "परिवर्तन सहेजे गए। कृपया दोबारा लॉग इन करें।"
|
||||
error = "उपयोगकर्ता नाम अपडेट नहीं हो सका। कृपया अपना पासवर्ड जाँचें और फिर से प्रयास करें।"
|
||||
changeUsername = "अपना उपयोगकर्ता नाम अपडेट करें। अपडेट के बाद आप लॉगआउट हो जाएँगे।"
|
||||
|
||||
[account]
|
||||
title = "खाता सेटिंग्स"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "खाता सेटिंग्स"
|
||||
adminSettings = "व्यवस्थापक सेटिंग्स - उपयोगकर्ताओं को देखें और जोड़ें"
|
||||
userControlSettings = "उपयोगकर्ता नियंत्रण सेटिंग्स"
|
||||
changeUsername = "उपयोगकर्ता नाम बदलें"
|
||||
changeUsernameDescription = "अपना उपयोगकर्ता नाम अपडेट करें। अपडेट के बाद आप लॉगआउट हो जाएँगे।"
|
||||
newUsernamePlaceholder = "अपना नया उपयोगकर्ता नाम दर्ज करें"
|
||||
newUsername = "नया उपयोगकर्ता नाम"
|
||||
password = "पुष्टिकरण पासवर्ड"
|
||||
oldPassword = "पुराना पासवर्ड"
|
||||
@@ -749,11 +708,6 @@ tags = "हस्ताक्षर,ऑटोग्राफ"
|
||||
title = "हस्ताक्षर करें"
|
||||
desc = "चित्र बनाकर, टेक्स्ट या छवि द्वारा PDF में हस्ताक्षर जोड़ें"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotate,highlight,draw"
|
||||
title = "टिप्पणी करें"
|
||||
desc = "व्यूअर में हाइलाइट करें, ड्रॉ करें, नोट्स और आकार जोड़ें"
|
||||
|
||||
[home.flatten]
|
||||
tags = "सरल बनाएं,हटाएँ,इंटरैक्टिव"
|
||||
title = "समतल करें"
|
||||
@@ -880,7 +834,7 @@ title = "PDF हस्ताक्षर सत्यापित करें"
|
||||
desc = "PDF दस्तावेजों में डिजिटल हस्ताक्षर और प्रमाणपत्रों को सत्यापित करें"
|
||||
|
||||
[home.swagger]
|
||||
tags = "API,documentation,test"
|
||||
tags = "API,दस्तावेज़ीकरण,परीक्षण"
|
||||
title = "API दस्तावेज़ीकरण"
|
||||
desc = "API दस्तावेज़ देखें और एंडपॉइंट टेस्ट करें"
|
||||
|
||||
@@ -929,7 +883,7 @@ title = "रंग बदलें/उलटें"
|
||||
desc = "PDF दस्तावेज़ों में रंगों को प्रतिस्थापित या उलटें"
|
||||
|
||||
[home.devApi]
|
||||
tags = "API,development,documentation"
|
||||
tags = "API,विकास,दस्तावेज़ीकरण"
|
||||
title = "API"
|
||||
desc = "API दस्तावेज़ के लिए लिंक"
|
||||
|
||||
@@ -965,10 +919,10 @@ title = "PDF ओवरले करें"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF टेक्स्ट एडिटर"
|
||||
desc = "ग्रुप्ड टेक्स्ट एडिटिंग और PDF पुनर्जनन के साथ Stirling PDF JSON एक्सपोर्ट की समीक्षा व संपादन करें"
|
||||
desc = "PDF फ़ाइलों के भीतर मौजूदा टेक्स्ट और इमेज संपादित करें"
|
||||
|
||||
[home.addText]
|
||||
tags = "text,annotation,label"
|
||||
tags = "पाठ,टिप्पणी,लेबल"
|
||||
title = "टेक्स्ट जोड़ें"
|
||||
desc = "अपने PDF में कहीं भी कस्टम टेक्स्ट जोड़ें"
|
||||
|
||||
@@ -976,7 +930,6 @@ desc = "अपने PDF में कहीं भी कस्टम टेक
|
||||
addFiles = "फ़ाइलें जोड़ें"
|
||||
uploadFromComputer = "कंप्यूटर से अपलोड करें"
|
||||
openFromComputer = "कंप्यूटर से खोलें"
|
||||
mobileUpload = "मोबाइल से अपलोड करें"
|
||||
|
||||
[viewPdf]
|
||||
tags = "देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि"
|
||||
@@ -1228,7 +1181,7 @@ selectFilesPlaceholder = "शुरू करने के लिए मुख
|
||||
settings = "सेटिंग्स"
|
||||
conversionCompleted = "रूपांतरण पूरा हुआ"
|
||||
results = "परिणाम"
|
||||
defaultFilename = "converted_file"
|
||||
defaultFilename = "परिवर्तित_फ़ाइल"
|
||||
conversionResults = "रूपांतरण परिणाम"
|
||||
convertFrom = "से रूपांतरित करें"
|
||||
convertTo = "में रूपांतरित करें"
|
||||
@@ -1268,11 +1221,11 @@ pdfaDigitalSignatureWarning = "PDF में एक डिजिटल हस्
|
||||
fileFormat = "फ़ाइल फ़ॉर्मेट"
|
||||
wordDoc = "Word दस्तावेज़"
|
||||
wordDocExt = "Word दस्तावेज़ (.docx)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
odtExt = "OpenDocument टेक्स्ट (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
txtExt = "Plain Text (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
odpExt = "OpenDocument प्रस्तुति (.odp)"
|
||||
txtExt = "सादा पाठ (.txt)"
|
||||
rtfExt = "रिच टेक्स्ट फ़ॉर्मेट (.rtf)"
|
||||
selectedFiles = "चयनित फ़ाइलें"
|
||||
noFileSelected = "कोई फ़ाइल चयनित नहीं। फ़ाइलें जोड़ने के लिए फ़ाइल पैनल का उपयोग करें।"
|
||||
convertFiles = "फ़ाइलें रूपांतरित करें"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ से PDF विकल्प"
|
||||
optimizeForEbook = "ईबुक रीडर्स के लिए PDF ऑप्टिमाइज़ करें (Ghostscript का उपयोग करता है)"
|
||||
cbzOutputOptions = "PDF से CBZ विकल्प"
|
||||
cbzDpi = "इमेज रेंडरिंग के लिए DPI"
|
||||
cbrOptions = "CBR विकल्प"
|
||||
cbrOutputOptions = "PDF से CBR विकल्प"
|
||||
cbrDpi = "छवि रेंडरिंग के लिए DPI"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook से PDF विकल्प"
|
||||
ebookOptionsDesc = "eBooks को PDF में बदलने के विकल्प"
|
||||
embedAllFonts = "सभी फ़ॉन्ट एम्बेड करें"
|
||||
embedAllFontsDesc = "eBook के सभी फ़ॉन्ट जनरेट की गई PDF में एम्बेड करें"
|
||||
includeTableOfContents = "विषयसूची शामिल करें"
|
||||
includeTableOfContentsDesc = "तैयार PDF में निर्मित विषयसूची जोड़ें"
|
||||
includePageNumbers = "पेज नंबर शामिल करें"
|
||||
includePageNumbersDesc = "जनरेट की गई PDF में पेज नंबर जोड़ें"
|
||||
optimizeForEbookPdf = "ईबुक रीडर्स के लिए अनुकूलित करें"
|
||||
optimizeForEbookPdfDesc = "eBook पढ़ने के लिए PDF को अनुकूलित करें (छोटा फ़ाइल आकार, eInk डिवाइस पर बेहतर रेंडरिंग)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF से eBook विकल्प"
|
||||
epubOptionsDesc = "PDF को EPUB/AZW3 में बदलने के विकल्प"
|
||||
detectChapters = "अध्याय पहचानें"
|
||||
detectChaptersDesc = "अध्याय जैसे दिखने वाले शीर्षकों का पता लगाएँ और EPUB पेज ब्रेक जोड़ें"
|
||||
targetDevice = "लक्षित डिवाइस"
|
||||
targetDeviceDesc = "रीडर डिवाइस के लिए अनुकूलित आउटपुट प्रोफाइल चुनें"
|
||||
outputFormat = "आउटपुट फ़ॉर्मेट"
|
||||
outputFormatDesc = "ईबुक के लिए आउटपुट फ़ॉर्मेट चुनें"
|
||||
tabletPhone = "टैबलेट/फ़ोन (चित्र सहित)"
|
||||
kindleEink = "Kindle e-Ink (पाठ के लिए अनुकूलित)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "रूपांतरण,img,jpg,चित्र,फोटो"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "अटैचमेंट जोड़ें"
|
||||
remove = "अटैचमेंट हटाएँ"
|
||||
embed = "अटैचमेंट एम्बेड करें"
|
||||
convertToPdfA3b = "PDF/A-3b में बदलें"
|
||||
convertToPdfA3bDescription = "एम्बेडेड अटैचमेंट्स के साथ एक आर्काइवल PDF बनाता है"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b एक आर्काइवल फ़ॉर्मेट है जो दीर्घकालिक संरक्षण सुनिश्चित करता है। यह मनमाने फ़ाइल फ़ॉर्मेट्स को अटैचमेंट के रूप में एम्बेड करने की अनुमति देता है। कन्वर्ज़न के लिए Ghostscript आवश्यक है और बड़े फ़ाइलों में अधिक समय लग सकता है।"
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b कन्वर्ज़न के बारे में"
|
||||
convertToPdfA3bTooltipTitle = "यह क्या करता है"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1447,7 +1368,7 @@ title = "वॉटरमार्क जोड़ें"
|
||||
desc = "PDF फ़ाइलों में टेक्स्ट या इमेज वॉटरमार्क जोड़ें"
|
||||
completed = "वॉटरमार्क जोड़ा गया"
|
||||
submit = "वॉटरमार्क जोड़ें"
|
||||
filenamePrefix = "watermarked"
|
||||
filenamePrefix = "वॉटरमार्क_युक्त"
|
||||
|
||||
[watermark.error]
|
||||
failed = "PDF में वॉटरमार्क जोड़ते समय एक त्रुटि हुई।"
|
||||
@@ -1722,7 +1643,7 @@ subtitle = "प्रोसेस्ड फ़ाइल डाउनलोड
|
||||
[removePages]
|
||||
tags = "पृष्ठ निकालें,पृष्ठ हटाएं"
|
||||
title = "निकालें"
|
||||
filenamePrefix = "pages_removed"
|
||||
filenamePrefix = "पृष्ठ_हटाए_गए"
|
||||
submit = "निकालें"
|
||||
|
||||
[removePages.pageNumbers]
|
||||
@@ -1919,12 +1840,12 @@ title = "उन्नत"
|
||||
tags = "कम्प्रेस,छोटा,छोटा"
|
||||
|
||||
[unlockPDFForms]
|
||||
tags = "remove,delete,form,field,readonly"
|
||||
tags = "हटाएं,मिटाएं,फॉर्म,फ़ील्ड,रीड-ओनली"
|
||||
title = "फॉर्म फ़ील्ड से Read-Only हटाएं"
|
||||
header = "PDF फॉर्म अनलॉक करें"
|
||||
submit = "Remove"
|
||||
description = "यह टूल PDF फॉर्म फ़ील्ड से Read-Only प्रतिबंध हटाएगा, जिससे वे संपादन योग्य और भरने योग्य बनेंगे।"
|
||||
filenamePrefix = "unlocked_forms"
|
||||
filenamePrefix = "अनलॉक_फ़ॉर्म"
|
||||
|
||||
[unlockPDFForms.files]
|
||||
placeholder = "शुरू करने के लिए मुख्य दृश्य में एक PDF फ़ाइल चुनें"
|
||||
@@ -1938,7 +1859,7 @@ title = "अनलॉक किए गए फॉर्म के परिणा
|
||||
[changeMetadata]
|
||||
header = "मेटाडेटा बदलें"
|
||||
submit = "बदलें"
|
||||
filenamePrefix = "metadata"
|
||||
filenamePrefix = "मेटाडेटा"
|
||||
|
||||
[changeMetadata.settings]
|
||||
title = "मेटाडेटा सेटिंग्स"
|
||||
@@ -2385,10 +2306,6 @@ saved = "सहेजा गया"
|
||||
label = "हस्ताक्षर की इमेज अपलोड करें"
|
||||
placeholder = "इमेज फ़ाइल चुनें"
|
||||
hint = "अपने हस्ताक्षर की PNG या JPG इमेज अपलोड करें"
|
||||
removeBackground = "सफेद पृष्ठभूमि हटाएँ (पारदर्शी बनाएँ)"
|
||||
processing = "छवि संसाधित हो रही है..."
|
||||
backgroundRemovalFailedTitle = "पृष्ठभूमि हटाना विफल"
|
||||
backgroundRemovalFailedMessage = "छवि से पृष्ठभूमि नहीं हटाई जा सकी। इसके बजाय मूल छवि का उपयोग किया जाएगा।"
|
||||
|
||||
[sign.instructions]
|
||||
title = "हस्ताक्षर कैसे जोड़ें"
|
||||
@@ -2417,7 +2334,7 @@ title = "समतल करें"
|
||||
header = "PDF समतल करें"
|
||||
flattenOnlyForms = "केवल फ़ॉर्म समतल करें"
|
||||
submit = "समतल करें"
|
||||
filenamePrefix = "flattened"
|
||||
filenamePrefix = "समतलीकृत"
|
||||
|
||||
[flatten.files]
|
||||
placeholder = "शुरू करने के लिए मुख्य दृश्य में एक PDF फ़ाइल चुनें"
|
||||
@@ -2434,11 +2351,6 @@ note = "फ्लैटन करने से PDF के इंटरैक्
|
||||
label = "केवल फ़ॉर्म समतल करें"
|
||||
desc = "केवल फॉर्म फ़ील्ड फ्लैटन करें, अन्य इंटरैक्टिव तत्व यथावत रखें"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "रेंडरिंग DPI (वैकल्पिक, 150 DPI अनुशंसित)"
|
||||
help = "सिस्टम डिफ़ॉल्ट का उपयोग करने के लिए खाली छोड़ें। अधिक DPI आउटपुट को तेज़ बनाता है, पर प्रसंस्करण समय और फ़ाइल आकार बढ़ाता है।"
|
||||
placeholder = "उदा. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "फ्लैटन परिणाम"
|
||||
|
||||
@@ -2470,7 +2382,7 @@ title = "मरम्मत"
|
||||
header = "PDF मरम्मत"
|
||||
submit = "मरम्मत"
|
||||
description = "यह टूल भ्रष्ट या क्षतिग्रस्त PDF फ़ाइलों की मरम्मत करने का प्रयास करेगा। कोई अतिरिक्त सेटिंग्स आवश्यक नहीं हैं।"
|
||||
filenamePrefix = "repaired"
|
||||
filenamePrefix = "मरम्मत_किया"
|
||||
|
||||
[repair.files]
|
||||
placeholder = "शुरू करने के लिए मुख्य दृश्य में एक PDF फ़ाइल चुनें"
|
||||
@@ -2671,7 +2583,7 @@ stopButton = "तुलना रोकें"
|
||||
[certSign]
|
||||
tags = "प्रमाणीकरण,PEM,P12,आधिकारिक,एन्क्रिप्ट"
|
||||
title = "प्रमाणपत्र हस्ताक्षर"
|
||||
filenamePrefix = "signed"
|
||||
filenamePrefix = "हस्ताक्षरित"
|
||||
chooseCertificate = "प्रमाणपत्र फ़ाइल चुनें"
|
||||
chooseJksFile = "JKS फ़ाइल चुनें"
|
||||
chooseP12File = "PKCS12 फ़ाइल चुनें"
|
||||
@@ -2805,7 +2717,7 @@ header = "PDF से डिजिटल प्रमाणपत्र हटा
|
||||
selectPDF = "PDF फ़ाइल चुनें:"
|
||||
submit = "हस्ताक्षर हटाएं"
|
||||
description = "यह टूल आपके PDF दस्तावेज़ से डिजिटल प्रमाणपत्र हस्ताक्षर हटाएगा।"
|
||||
filenamePrefix = "unsigned"
|
||||
filenamePrefix = "अनहस्ताक्षरित"
|
||||
|
||||
[removeCertSign.files]
|
||||
placeholder = "शुरू करने के लिए मुख्य दृश्य में एक PDF फ़ाइल चुनें"
|
||||
@@ -2835,7 +2747,7 @@ submit = "जमा करें"
|
||||
failed = "मल्टी-पृष्ठ लेआउट बनाते समय त्रुटि हुई।"
|
||||
|
||||
[bookletImposition]
|
||||
tags = "booklet,imposition,printing,binding,folding,signature"
|
||||
tags = "बुकलेट,इम्पोज़िशन,प्रिंटिंग,बाइंडिंग,फोल्डिंग,सिग्नेचर"
|
||||
title = "बुकलेट इम्पोज़िशन"
|
||||
header = "बुकलेट इम्पोज़िशन"
|
||||
submit = "बुकलेट बनाएँ"
|
||||
@@ -2934,7 +2846,7 @@ scaleFactor = "एक पृष्ठ का ज़ूम स्तर (क्
|
||||
submit = "जमा करें"
|
||||
|
||||
[adjustPageScale]
|
||||
tags = "resize,modify,dimension,adapt"
|
||||
tags = "आकार बदलें,संशोधित करें,आयाम,अनुकूलित करें"
|
||||
title = "पृष्ठ स्केल समायोजित करें"
|
||||
header = "पृष्ठ स्केल समायोजित करें"
|
||||
submit = "पृष्ठ स्केल समायोजित करें"
|
||||
@@ -3013,7 +2925,6 @@ header = "PDF क्रॉप करें"
|
||||
submit = "जमा करें"
|
||||
noFileSelected = "क्रॉप शुरू करने के लिए एक PDF फ़ाइल चुनें"
|
||||
reset = "पूर्ण PDF पर रीसेट करें"
|
||||
autoCrop = "खाली स्थान स्वतः क्रॉप करें"
|
||||
|
||||
[crop.preview]
|
||||
title = "क्रॉप क्षेत्र चयन"
|
||||
@@ -3244,7 +3155,6 @@ title = "रिडैक्शन विधि"
|
||||
mode = "मोड"
|
||||
automatic = "स्वचालित"
|
||||
automaticDesc = "खोज शब्दों के आधार पर टेक्स्ट रिडैक्ट करें"
|
||||
automaticDisabledTooltip = "एक साथ कई फ़ाइलों पर रिडैक्शन करने के लिए फ़ाइल प्रबंधक में फ़ाइलें चुनें"
|
||||
manual = "मैनुअल"
|
||||
manualDesc = "विशिष्ट क्षेत्रों को रिडैक्ट करने के लिए क्लिक और ड्रैग करें"
|
||||
manualComingSoon = "मैनुअल रिडैक्शन जल्द आ रहा है"
|
||||
@@ -3315,35 +3225,8 @@ text = "केवल पूर्ण शब्दों से मेल कर
|
||||
title = "PDF-Image में बदलें"
|
||||
text = "रिडैक्शन के बाद PDF को इमेज-आधारित PDF में बदल देता है। यह सुनिश्चित करता है कि रिडैक्शन बॉक्स के पीछे का टेक्स्ट पूरी तरह हट जाए और पुनर्प्राप्त न हो सके।"
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "मैनुअल रिडैक्शन नियंत्रण"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "टेक्स्ट चिह्नित करने का टूल"
|
||||
text = "PDF पर सीधे टेक्स्ट चुनकर उसे रिडैक्शन के लिए चिह्नित करें। जिस टेक्स्ट को रिडैक्ट करना है उसे हाइलाइट करने के लिए क्लिक करें और खींचें।"
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "क्षेत्र चिह्नित करने का टूल"
|
||||
text = "PDF पर आयताकार क्षेत्र बनाकर रिडैक्शन के लिए क्षेत्र चिह्नित करें। छवियाँ, हस्ताक्षर, या अनियमित आकृतियों को रिडैक्ट करने में उपयोगी।"
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "रिडैक्शन लागू करें"
|
||||
text = "सामग्री चिह्नित करने के बाद 'लागू करें' पर क्लिक करें ताकि सभी चिह्नित क्षेत्रों को स्थायी रूप से रिडैक्ट किया जा सके। लंबित गिनती दिखाती है कि कितने रिडैक्शन लागू करने के लिए तैयार हैं।"
|
||||
bullet1 = "लागू करने से पहले जितने क्षेत्र आवश्यक हों, चिह्नित करें"
|
||||
bullet2 = "सभी लंबित रिडैक्शन एक साथ लागू किए जाते हैं"
|
||||
bullet3 = "लागू करने के बाद रिडैक्शन पूर्ववत नहीं किए जा सकते"
|
||||
|
||||
[redact.manual]
|
||||
title = "रिडैक्शन टूल"
|
||||
instructions = "रिडैक्शन के लिए सामग्री चिह्नित करने हेतु PDF पर टेक्स्ट चुनें या क्षेत्र बनाएं।"
|
||||
markText = "टेक्स्ट चिह्नित करें"
|
||||
markArea = "क्षेत्र चिह्नित करें"
|
||||
pendingLabel = "लंबित:"
|
||||
applyWarning = "⚠️ स्थायी लागू, पूर्ववत नहीं किया जा सकता और नीचे का डेटा हटा दिया जाएगा"
|
||||
apply = "लागू करें"
|
||||
noMarks = "कोई रिडैक्शन चिह्न नहीं। रिडैक्शन के लिए सामग्री चिह्नित करने हेतु ऊपर दिए टूल्स का उपयोग करें।"
|
||||
header = "मैनुअल रिडैक्शन"
|
||||
controlsTitle = "मैनुअल रिडैक्शन नियंत्रण"
|
||||
textBasedRedaction = "टेक्स्ट-आधारित रिडैक्शन"
|
||||
pageBasedRedaction = "पृष्ठ-आधारित रिडैक्शन"
|
||||
convertPDFToImageLabel = "PDF को PDF-Image में बदलें (बॉक्स के पीछे का टेक्स्ट हटाने हेतु)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "क्षैतिज विभाजनों की संख
|
||||
label = "ऊर्ध्वाधर विभाजन"
|
||||
placeholder = "ऊर्ध्वाधर विभाजनों की संख्या दर्ज करें"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "विभाजन मोड"
|
||||
description = "पृष्ठों को कैसे विभाजित करना है, चुनें"
|
||||
splitAll = "सभी पृष्ठ विभाजित करें"
|
||||
splitAllExceptFirst = "पहले को छोड़कर सभी विभाजित करें"
|
||||
splitAllExceptLast = "अंतिम को छोड़कर सभी विभाजित करें"
|
||||
splitAllExceptFirstAndLast = "पहले और अंतिम को छोड़कर सभी विभाजित करें"
|
||||
custom = "कस्टम पृष्ठ"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "कस्टम पेज नंबर"
|
||||
placeholder = "उदा. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "स्टैम्प, छवि जोड़ें, केंद्र छवि, वॉटरमार्क, PDF, एम्बेड, अनुकूलित"
|
||||
header = "PDF स्टैम्प करें"
|
||||
@@ -3611,7 +3481,7 @@ certHint = "कस्टम ट्रस्ट स्रोत के विर
|
||||
title = "सत्यापन सेटिंग्स"
|
||||
|
||||
[replaceColor]
|
||||
tags = "Replace Colour,Page operations,Back end,server side"
|
||||
tags = "रंग बदलें,पृष्ठ संचालन,Back end,server side"
|
||||
|
||||
[replaceColor.labels]
|
||||
settings = "सेटिंग्स"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDF को एकल पृष्ठ में"
|
||||
header = "PDF को एकल पृष्ठ में"
|
||||
submit = "एकल पृष्ठ में बदलें"
|
||||
description = "यह टूल आपके PDF के सभी पृष्ठों को एक बड़े एकल पृष्ठ में मिला देगा। चौड़ाई मूल पृष्ठों जैसी ही रहेगी, पर ऊँचाई सभी पृष्ठ ऊँचाइयों का योग होगी।"
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "एकल_पृष्ठ"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "शुरू करने के लिए मुख्य दृश्य में एक PDF फ़ाइल चुनें"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "फ़ाइल आकार"
|
||||
[compress.grayscale]
|
||||
label = "संपीड़न के लिए ग्रेस्केल लागू करें"
|
||||
|
||||
[compress.linearize]
|
||||
label = "तेज़ वेब देखने के लिए PDF को लिनियराइज़ करें"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "छवियों को लाइन आर्ट में बदलें"
|
||||
description = "ImageMagick का उपयोग करके पृष्ठों को उच्च-प्रति-विपरीत काले-सफेद में बदलता है ताकि अधिकतम आकार घटे।"
|
||||
unavailable = "ImageMagick इस सर्वर पर इंस्टॉल या सक्षम नहीं है"
|
||||
detailLevel = "विस्तार स्तर"
|
||||
edgeEmphasis = "किनारों पर जोर"
|
||||
edgeLow = "हल्का"
|
||||
edgeMedium = "संतुलित"
|
||||
edgeHigh = "प्रबल"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "संपीड़न सेटिंग्स अवलोकन"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "अधिक मान फ़ाइल आकार घटाते
|
||||
title = "श्वेत-श्याम"
|
||||
text = "सभी छवियों को काले-सफेद में बदलने के लिए इस विकल्प को चुनें, जो विशेषकर स्कैन किए गए PDFs या चित्र-प्रधान दस्तावेज़ों के लिए फ़ाइल आकार को काफी घटा सकता है।"
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "लाइन आर्ट"
|
||||
text = "ImageMagick का उपयोग करके पृष्ठों को उच्च-प्रति-विपरीत काले-सफेद में बदलें। कितना कंटेंट काला हो, इसे नियंत्रित करने के लिए 'विस्तार स्तर' और किनारों की पहचान की तीव्रता नियंत्रित करने के लिए 'किनारों पर जोर' का उपयोग करें।"
|
||||
|
||||
[compress.error]
|
||||
failed = "PDF संपीड़ित करते समय त्रुटि हुई।"
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "PDF संपीड़ित करते समय त्रुटि
|
||||
_value = "संपीड़न सेटिंग्स"
|
||||
1 = "1-3 PDF संपीड़न,</br> 4-6 हल्का छवि संपीड़न,</br> 7-9 तीव्र छवि संपीड़न छवि गुणवत्ता को काफी घटाएगा"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "कम मान गुणवत्ता बनाए रखते हैं लेकिन फ़ाइल आकार बड़ा होता है"
|
||||
range4to6 = "मध्यम संपीड़न, गुणवत्ता में मध्यम कमी के साथ"
|
||||
range7to9 = "उच्च मान फ़ाइल आकार को काफी घटाते हैं, लेकिन छवि की स्पष्टता कम हो सकती है"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "यह फ़ाइल पासवर्ड से सुरक्षित है। कृपया पासवर्ड दर्ज करें:"
|
||||
cancelled = "PDF के लिए कार्रवाई रद्द की गई: {0}"
|
||||
@@ -4027,7 +3875,7 @@ version = "वर्तमान रिलीज़"
|
||||
title = "API दस्तावेज़ीकरण"
|
||||
header = "API दस्तावेज़ीकरण"
|
||||
desc = "Stirling PDF API एंडपॉइंट्स देखें और परीक्षण करें"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,दस्तावेज़ीकरण,swagger,endpoints,विकास"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "हम कुकीज़ का उपयोग कैसे करते हैं"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "चयनित पृष्ठ हटाएँ"
|
||||
closePdf = "PDF बंद करें"
|
||||
exportAll = "PDF निर्यात करें"
|
||||
downloadSelected = "चयनित फ़ाइलें डाउनलोड करें"
|
||||
annotations = "एनोटेशन"
|
||||
exportSelected = "चयनित पृष्ठ निर्यात करें"
|
||||
saveChanges = "परिवर्तनों को सहेजें"
|
||||
downloadAll = "सभी डाउनलोड करें"
|
||||
saveAll = "सभी सहेजें"
|
||||
toggleTheme = "थीम टॉगल करें"
|
||||
toggleBookmarks = "बुकमार्क्स टॉगल करें"
|
||||
language = "भाषा"
|
||||
toggleAnnotations = "एनोटेशन दृश्यता टॉगल करें"
|
||||
search = "PDF खोजें"
|
||||
panMode = "पैन मोड"
|
||||
applyRedactionsFirst = "पहले रिडैक्शन लागू करें"
|
||||
rotateLeft = "बाएँ घुमाएँ"
|
||||
rotateRight = "दाएँ घुमाएँ"
|
||||
toggleSidebar = "साइडबार टॉगल करें"
|
||||
toggleBookmarks = "बुकमार्क्स टॉगल करें"
|
||||
exportSelected = "चयनित पृष्ठ निर्यात करें"
|
||||
toggleAnnotations = "एनोटेशन दृश्यता टॉगल करें"
|
||||
annotationMode = "एनोटेशन मोड टॉगल करें"
|
||||
print = "PDF प्रिंट करें"
|
||||
draw = "ड्रॉ"
|
||||
redact = "रिडैक्ट करें"
|
||||
exitRedaction = "रिडैक्शन मोड से बाहर निकलें"
|
||||
save = "सहेजें"
|
||||
downloadAll = "सभी डाउनलोड करें"
|
||||
saveAll = "सभी सहेजें"
|
||||
|
||||
[textAlign]
|
||||
left = "बाएँ"
|
||||
center = "मध्य"
|
||||
right = "दाएँ"
|
||||
|
||||
[annotation]
|
||||
title = "टिप्पणी करें"
|
||||
desc = "हाइलाइट, पेन, टेक्स्ट और नोट्स का उपयोग करें। परिवर्तन लाइव रहते हैं—फ़्लैटेनिंग की आवश्यकता नहीं।"
|
||||
highlight = "हाइलाइट"
|
||||
pen = "पेन"
|
||||
text = "टेक्स्ट बॉक्स"
|
||||
note = "नोट"
|
||||
rectangle = "आयत"
|
||||
ellipse = "अंडाकार"
|
||||
select = "चुनें"
|
||||
exit = "एनोटेशन मोड से बाहर निकलें"
|
||||
strokeWidth = "चौड़ाई"
|
||||
opacity = "अपारदर्शिता"
|
||||
strokeOpacity = "रेखा अपारदर्शिता"
|
||||
fillOpacity = "भराव अपारदर्शिता"
|
||||
fontSize = "फ़ॉन्ट आकार"
|
||||
chooseColor = "रंग चुनें"
|
||||
color = "रंग"
|
||||
strokeColor = "रेखा रंग"
|
||||
fillColor = "भराव रंग"
|
||||
underline = "रेखांकित"
|
||||
strikeout = "स्ट्राइकथ्रू"
|
||||
squiggly = "टेढ़ी रेखा"
|
||||
inkHighlighter = "स्वतंत्र-हस्त हाइलाइटर"
|
||||
freehandHighlighter = "स्वतंत्र-हस्त हाइलाइटर"
|
||||
square = "वर्ग"
|
||||
circle = "वृत्त"
|
||||
polygon = "बहुभुज"
|
||||
line = "रेखा"
|
||||
stamp = "छवि जोड़ें"
|
||||
textMarkup = "टेक्स्ट मार्कअप"
|
||||
drawing = "ड्रॉइंग"
|
||||
shapes = "आकृतियाँ"
|
||||
notesStamps = "नोट्स और मुहरें"
|
||||
settings = "सेटिंग्स"
|
||||
borderOn = "बॉर्डर: चालू"
|
||||
borderOff = "बॉर्डर: बंद"
|
||||
editInk = "पेन संपादित करें"
|
||||
editLine = "रेखा संपादित करें"
|
||||
editNote = "नोट संपादित करें"
|
||||
editText = "टेक्स्ट बॉक्स संपादित करें"
|
||||
editTextMarkup = "टेक्स्ट मार्कअप संपादित करें"
|
||||
editSelected = "एनोटेशन संपादित करें"
|
||||
editSquare = "वर्ग संपादित करें"
|
||||
editCircle = "वृत्त संपादित करें"
|
||||
editPolygon = "बहुभुज संपादित करें"
|
||||
unsupportedType = "इस एनोटेशन प्रकार का संपादन पूर्ण रूप से समर्थित नहीं है।"
|
||||
textAlignment = "टेक्स्ट संरेखण"
|
||||
noteIcon = "नोट आइकन"
|
||||
imagePreview = "पूर्वावलोकन"
|
||||
contents = "टेक्स्ट"
|
||||
backgroundColor = "पृष्ठभूमि रंग"
|
||||
clearBackground = "पृष्ठभूमि हटाएँ"
|
||||
noBackground = "कोई पृष्ठभूमि नहीं"
|
||||
stampSettings = "मुहर सेटिंग्स"
|
||||
savingCopy = "डाउनलोड तैयार किया जा रहा है..."
|
||||
saveFailed = "कॉपी सहेजी नहीं जा सकी"
|
||||
saveReady = "डाउनलोड तैयार"
|
||||
selectAndMove = "चुनें और संपादित करें"
|
||||
editSelectDescription = "किसी मौजूदा एनोटेशन पर क्लिक कर उसका रंग, अपारदर्शिता, टेक्स्ट या आकार संपादित करें।"
|
||||
editStampHint = "छवि बदलने के लिए, इस मुहर को हटाएँ और नई जोड़ें।"
|
||||
editSwitchToSelect = "इस एनोटेशन को संपादित करने के लिए 'चुनें और संपादित करें' पर स्विच करें।"
|
||||
undo = "पूर्ववत"
|
||||
redo = "फिर करें"
|
||||
applyChanges = "परिवर्तन लागू करें"
|
||||
saveChanges = "परिवर्तन सहेजें"
|
||||
saveChanges = "परिवर्तनों को सहेजें"
|
||||
|
||||
[search]
|
||||
title = "PDF खोजें"
|
||||
@@ -4265,20 +4038,12 @@ settings = "सेटिंग्स"
|
||||
adminSettings = "एडमिन सेटिंग्स"
|
||||
allTools = "All Tools"
|
||||
reader = "रीडर"
|
||||
tours = "टूर"
|
||||
showMeAround = "मुझे दिखाएँ"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "यहाँ वॉकथ्रू देखें: टूल्स टूर, नया V2 लेआउट टूर, और एडमिन टूर।"
|
||||
user = "यहाँ वॉकथ्रू देखें: टूल्स टूर और नया V2 लेआउट टूर।"
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "टूल्स टूर"
|
||||
toolsTourDesc = "जानें कि टूल क्या कर सकते हैं"
|
||||
adminTour = "एडमिन टूर"
|
||||
adminTourDesc = "एडमिन सेटिंग्स और फ़ीचर्स का अन्वेषण करें"
|
||||
whatsNewTour = "V2 में नया क्या है देखें"
|
||||
whatsNewTourDesc = "अद्यतन लेआउट का टूर"
|
||||
|
||||
[admin]
|
||||
error = "त्रुटि"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "सेटिंग्स लोड करने में वि
|
||||
saveError = "सेटिंग्स सहेजने में विफल"
|
||||
saved = "सेटिंग्स सफलतापूर्वक सहेजी गईं"
|
||||
saveSuccess = "सेटिंग्स सफलतापूर्वक सहेजी गईं"
|
||||
success = "सेटिंग्स सफलतापूर्वक सहेजी गईं"
|
||||
error = "सेटिंग्स सहेजने में विफल"
|
||||
save = "परिवर्तनों को सहेजें"
|
||||
discard = "त्यागें"
|
||||
restartRequired = "रीस्टार्ट आवश्यक"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTML से PDF कन्वर्ज़न के लिए Weas
|
||||
label = "Unoconvert एक्ज़िक्यूटेबल"
|
||||
description = "दस्तावेज़ कन्वर्ज़न के लिए LibreOffice unoconvert का पाथ (डिफ़ॉल्ट हेतु खाली छोड़ें: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "फ्रंटएंड URL"
|
||||
description = "फ्रंटएंड के लिए बेस URL (उदा., https://pdf.example.com)। ईमेल आमंत्रण लिंक और मोबाइल QR कोड अपलोड के लिए उपयोग होता है। बैकएंड URL उपयोग करने के लिए खाली छोड़ें।"
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "प्लान विवरण देखने के लिए क्लिक करें"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "सुरक्षा"
|
||||
description = "प्रमाणीकरण, लॉगिन व्यवहार, और सुरक्षा नीतियाँ कॉन्फ़िगर करें।"
|
||||
@@ -4565,19 +4321,6 @@ connect = "कनेक्ट करें"
|
||||
disconnect = "डिसकनेक्ट करें"
|
||||
disconnected = "प्रदाता सफलतापूर्वक डिसकनेक्ट किया गया"
|
||||
disconnectError = "प्रदाता को डिसकनेक्ट करने में विफल"
|
||||
mobileScannerConvertToPdf = "छवियों को PDF में बदलें"
|
||||
mobileScannerConvertToPdfDesc = "अपलोड की गई छवियों को स्वचालित रूप से PDF फ़ॉर्मेट में बदलें। अक्षम होने पर, छवियाँ जैसे हैं वैसी ही रहेंगी।"
|
||||
mobileScannerImageResolution = "छवि रेज़ोल्यूशन"
|
||||
mobileScannerImageResolutionDesc = "अपलोड की गई छवियों का रेज़ोल्यूशन। \"Reduced\" विकल्प छवियों को अधिकतम 1200px तक स्केल कर फ़ाइल आकार घटाता है।"
|
||||
imageResolutionFull = "पूर्ण (मूल आकार)"
|
||||
imageResolutionReduced = "कम (अधिकतम 1200px)"
|
||||
mobileScannerPageFormat = "पृष्ठ फ़ॉर्मेट"
|
||||
mobileScannerPageFormatDesc = "PDF पृष्ठ आकार परिवर्तित छवियों के लिए। \"Keep\" मूल छवि आयामों का उपयोग करता है।"
|
||||
pageFormatKeep = "जैसा है रखें (मूल आयाम)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "फिट करने हेतु फैलाएँ"
|
||||
mobileScannerStretchToFitDesc = "छवि को पूरी पृष्ठ भरने के लिए फैलाएँ। अक्षम होने पर, छवियाँ केंद्रित रहती हैं और अनुपात सुरक्षित रहता है।"
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO ऑटो लॉगिन"
|
||||
@@ -4596,15 +4339,15 @@ label = "प्रदाता"
|
||||
description = "प्रमाणीकरण के लिए उपयोग किया जाने वाला OAuth2 प्रदाता"
|
||||
|
||||
[admin.settings.connections.oauth2.issuer]
|
||||
label = "Issuer URL"
|
||||
label = "जारीकर्ता URL"
|
||||
description = "OAuth2 प्रदाता का Issuer URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "क्लाइंट ID"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client ID"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "क्लाइंट सीक्रेट"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client Secret"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4646,122 +4389,6 @@ description = "पहले SAML2 लॉगिन पर उपयोगकर
|
||||
label = "पंजीकरण रोकें"
|
||||
description = "SAML2 के माध्यम से नए उपयोगकर्ता पंजीकरण को रोकें"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "मोबाइल फ़ोन अपलोड"
|
||||
enable = "QR कोड अपलोड सक्षम करें"
|
||||
description = "उपयोगकर्ताओं को QR कोड स्कैन करके मोबाइल डिवाइसेज़ से फ़ाइलें अपलोड करने दें"
|
||||
note = "ध्यान दें: इसके लिए फ्रंटएंड URL कॉन्फ़िगर होना आवश्यक है। "
|
||||
link = "सिस्टम सेटिंग्स में कॉन्फ़िगर करें"
|
||||
mobileScannerConvertToPdf = "छवियों को PDF में बदलें"
|
||||
mobileScannerConvertToPdfDesc = "अपलोड की गई छवियों को स्वचालित रूप से PDF फ़ॉर्मेट में बदलें। अक्षम होने पर, छवियाँ जैसे हैं वैसी ही रहेंगी।"
|
||||
mobileScannerImageResolution = "छवि रेज़ोल्यूशन"
|
||||
mobileScannerImageResolutionDesc = "अपलोड की गई छवियों का रेज़ोल्यूशन। \"Reduced\" विकल्प छवियों को अधिकतम 1200px तक स्केल कर फ़ाइल आकार घटाता है।"
|
||||
imageResolutionFull = "पूर्ण (मूल आकार)"
|
||||
imageResolutionReduced = "कम (अधिकतम 1200px)"
|
||||
mobileScannerPageFormat = "पृष्ठ फ़ॉर्मेट"
|
||||
mobileScannerPageFormatDesc = "PDF पृष्ठ आकार परिवर्तित छवियों के लिए। \"Keep\" मूल छवि आयामों का उपयोग करता है।"
|
||||
pageFormatKeep = "जैसा है रखें (मूल आयाम)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "फिट करने हेतु फैलाएँ"
|
||||
mobileScannerStretchToFitDesc = "छवि को पूरी पृष्ठ भरने के लिए फैलाएँ। अक्षम होने पर, छवियाँ केंद्रित रहती हैं और अनुपात सुरक्षित रहता है।"
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram बॉट"
|
||||
description = "Telegram बॉट कनेक्टिविटी, एक्सेस नियंत्रण और फ़ीडबैक व्यवहार कॉन्फ़िगर करें।"
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram बॉट सक्षम करें"
|
||||
description = "उपयोगकर्ताओं को आपके कॉन्फ़िगर किए गए Telegram बॉट के माध्यम से Stirling PDF के साथ इंटरेक्ट करने दें।"
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "बॉट उपयोगकर्ता नाम"
|
||||
description = "आपके Telegram बॉट का सार्वजनिक उपयोगकर्ता नाम।"
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "बॉट टोकन"
|
||||
description = "आपके Telegram बॉट के लिए BotFather द्वारा प्रदत्त API टोकन।"
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "इनबॉक्स फ़ोल्डर"
|
||||
description = "पाइपलाइन डायरेक्टरी के अंतर्गत वह फ़ोल्डर जहाँ आने वाली Telegram फ़ाइलें संग्रहीत होती हैं।"
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "कस्टम फ़ोल्डर प्रत्यय उपयोग करें"
|
||||
description = "प्रत्येक चैट के अपलोड अलग रखने हेतु आने वाली फ़ाइल फ़ोल्डरों में चैट ID जोड़ें।"
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "प्रवेश नियंत्रण"
|
||||
description = "कौन-से उपयोगकर्ता या चैनल बॉट के साथ इंटरेक्ट कर सकते हैं, इसे सीमित करें।"
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "विशिष्ट उपयोगकर्ता IDs को अनुमति दें"
|
||||
description = "सक्रिय होने पर, केवल सूचीबद्ध उपयोगकर्ता IDs बॉट का उपयोग कर सकते हैं।"
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "अनुमत उपयोगकर्ता IDs"
|
||||
description = "बॉट से इंटरेक्ट करने के लिए अनुमत Telegram उपयोगकर्ता IDs दर्ज करें।"
|
||||
placeholder = "उपयोगकर्ता ID जोड़ें और एंटर दबाएँ"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "विशिष्ट चैनल IDs को अनुमति दें"
|
||||
description = "सक्रिय होने पर, केवल सूचीबद्ध चैनल IDs बॉट का उपयोग कर सकते हैं।"
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "अनुमत चैनल IDs"
|
||||
description = "बॉट से इंटरेक्ट करने के लिए अनुमत Telegram चैनल IDs दर्ज करें।"
|
||||
placeholder = "चैनल ID जोड़ें और एंटर दबाएँ"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "प्रसंस्करण"
|
||||
description = "Telegram अपलोड के लिए पोलिंग अंतराल और प्रोसेसिंग टाइमआउट नियंत्रित करें।"
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "प्रोसेसिंग टाइमआउट (सेकंड)"
|
||||
description = "त्रुटि रिपोर्ट करने से पहले प्रोसेसिंग जॉब के लिए प्रतीक्षा का अधिकतम समय।"
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "पोलिंग अंतराल (ms)"
|
||||
description = "नए Telegram अपडेट की जाँच के बीच का अंतराल।"
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "फ़ीडबैक संदेश"
|
||||
description = "बॉट उपयोगकर्ताओं और चैनलों को फ़ीडबैक कब भेजे, यह चुनें।"
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "फ़ीडबैक सक्षम करें"
|
||||
description = "नियंत्रित करें कि बॉट कोई फ़ीडबैक संदेश भेजे या नहीं।"
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "चैनल फ़ीडबैक नियम"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "\"No valid document\" दिखाएँ (चैनल)"
|
||||
description = "चैनल अपलोड के लिए 'no valid document' प्रतिक्रिया को दबाएँ।"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "प्रोसेसिंग त्रुटियाँ दिखाएँ (चैनल)"
|
||||
description = "प्रोसेसिंग त्रुटि संदेश चैनलों को भेजें।"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "त्रुटि संदेश दिखाएँ (चैनल)"
|
||||
description = "चैनलों के लिए विस्तृत त्रुटि संदेश दिखाएँ।"
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "उपयोगकर्ता फ़ीडबैक नियम"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "\"No valid document\" दिखाएँ (उपयोगकर्ता)"
|
||||
description = "उपयोगकर्ता अपलोड के लिए 'no valid document' प्रतिक्रिया को दबाएँ।"
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "प्रोसेसिंग त्रुटियाँ दिखाएँ (उपयोगकर्ता)"
|
||||
description = "प्रोसेसिंग त्रुटि संदेश उपयोगकर्ताओं को भेजें।"
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "त्रुटि संदेश दिखाएँ (उपयोगकर्ता)"
|
||||
description = "उपयोगकर्ताओं के लिए विस्तृत त्रुटि संदेश दिखाएँ।"
|
||||
|
||||
[admin.settings.database]
|
||||
title = "डेटाबेस"
|
||||
description = "एंटरप्राइज़ डिप्लॉयमेंट के लिए कस्टम डेटाबेस कनेक्शन सेटिंग्स कॉन्फ़िगर करें।"
|
||||
@@ -4888,7 +4515,7 @@ description = "विस्तृत सिस्टम टेम्प डा
|
||||
label = "प्रोसेस एक्सीक्यूटर सीमाएँ"
|
||||
description = "प्रत्येक प्रोसेस एक्सीक्यूटर के लिए सेशन सीमाएँ और टाइमआउट कॉन्फ़िगर करें"
|
||||
libreOffice = "LibreOffice"
|
||||
pdfToHtml = "PDF to HTML"
|
||||
pdfToHtml = "PDF से HTML"
|
||||
qpdf = "QPDF"
|
||||
tesseract = "Tesseract OCR"
|
||||
pythonOpenCv = "Python OpenCV"
|
||||
@@ -4943,10 +4570,6 @@ description = "एडमिन को ऑटो-जनरेटेड पास
|
||||
label = "फ़्रंटएंड URL"
|
||||
description = "फ़्रंटएंड के लिए बेस URL (उदा. https://pdf.example.com)। ईमेल में इनवाइट लिंक जनरेट करने के लिए उपयोग। खाली छोड़ने पर बैकएंड URL उपयोग होगा।"
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "ध्यान दें: इसके लिए फ्रंटएंड URL कॉन्फ़िगर होना आवश्यक है। "
|
||||
link = "सिस्टम सेटिंग्स में कॉन्फ़िगर करें"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "कानूनी दस्तावेज़"
|
||||
description = "कानूनी दस्तावेज़ों और नीतियों के लिंक कॉन्फ़िगर करें।"
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "मेरी फ़ाइलें"
|
||||
noRecentFiles = "कोई हालिया फ़ाइल नहीं मिली"
|
||||
googleDriveNotAvailable = "Google Drive इंटीग्रेशन उपलब्ध नहीं"
|
||||
mobileUpload = "मोबाइल अपलोड"
|
||||
mobileShort = "मोबाइल"
|
||||
mobileUploadNotAvailable = "मोबाइल अपलोड सक्षम नहीं है"
|
||||
downloadSelected = "चयनित डाउनलोड करें"
|
||||
saveSelected = "चयनित सहेजें"
|
||||
openFiles = "फ़ाइलें खोलें"
|
||||
@@ -5449,7 +5069,6 @@ loading = "लोड हो रहा है..."
|
||||
back = "वापस"
|
||||
continue = "जारी रखें"
|
||||
error = "त्रुटि"
|
||||
save = "सहेजें"
|
||||
|
||||
[config.overview]
|
||||
title = "एप्लिकेशन कॉन्फ़िगरेशन"
|
||||
@@ -5512,15 +5131,6 @@ impact = "वर्तमान में इन कुंजियों का
|
||||
confirmPrompt = "क्या आप वाकई जारी रखना चाहते हैं?"
|
||||
confirmCta = "कुंजियाँ रीफ़्रेश करें"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API कुंजी त्रुटि"
|
||||
failedToCreateApiKey = "API कुंजी बनाने में विफल।"
|
||||
failedToRetrieveApiKey = "प्रतिक्रिया से API कुंजी प्राप्त करने में विफल।"
|
||||
failedToFetchApiKey = "API कुंजी फ़ेच करने में विफल।"
|
||||
apiKeyRefreshed = "API कुंजी रीफ़्रेश की गई"
|
||||
apiKeyRefreshedBody = "आपकी API कुंजी सफलतापूर्वक रीफ़्रेश की गई है।"
|
||||
failedToRefreshApiKey = "API कुंजी रीफ़्रेश करने में विफल।"
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "संलग्नक चुनें"
|
||||
info = "अपनी PDF में संलग्न करने के लिए फ़ाइलें चुनें। ये फ़ाइलें एम्बेड की जाएँगी और PDF के अटैचमेंट पैनल से एक्सेस की जा सकेंगी।"
|
||||
@@ -5625,16 +5235,6 @@ finish = "समाप्त करें"
|
||||
startTour = "टूर शुरू करें"
|
||||
startTourDescription = "Stirling PDF की प्रमुख विशेषताओं का मार्गदर्शित टूर लें"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "रीडर, ऑटोमेट, आपकी फ़ाइलें और सभी टूर के बीच जाने के लिए <strong>Quick Access</strong> रेल से शुरू करें।"
|
||||
leftPanel = "बाएँ <strong>Tools</strong> पैनल में वे सब सूचीबद्ध है जो आप कर सकते हैं। श्रेणियाँ ब्राउज़ करें या जल्दी टूल खोजने के लिए सर्च करें।"
|
||||
fileUpload = "<strong>Files</strong> बटन से अपलोड करें या हाल की PDF चुनें। हम एक नमूना लोड करेंगे ताकि आप वर्कस्पेस देख सकें।"
|
||||
rightRail = "<strong>Right Rail</strong> में त्वरित क्रियाएँ होती हैं जिनसे फ़ाइलें चुनें, थीम या भाषा बदलें, और परिणाम डाउनलोड करें।"
|
||||
topBar = "ऊपरी बार आपको <strong>Viewer</strong>, <strong>Page Editor</strong>, और <strong>Active Files</strong> के बीच स्विच करने देता है।"
|
||||
pageEditorView = "पेजों को पुनःक्रमित, घुमाने या हटाने के लिए Page Editor पर स्विच करें।"
|
||||
activeFilesView = "Active Files में अपनी सभी खुली फ़ाइलें देखें और जिस पर काम करना है उसे चुनें।"
|
||||
wrapUp = "V2 में नया यही है। इसे, Tools टूर या Admin टूर को फिर से देखने के लिए कभी भी <strong>Tours</strong> मेनू खोलें।"
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Stirling PDF में आपका स्वागत है!"
|
||||
description = "क्या आप 1-मिनट का त्वरित टूर लेना चाहेंगे ताकि मुख्य फीचर्स और शुरुआत करने का तरीका जान सकें?"
|
||||
@@ -5655,10 +5255,6 @@ download = "डाउनलोड →"
|
||||
showMeAround = "मुझे दिखाएँ"
|
||||
skipTheTour = "टूर छोड़ें"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "टूर अवलोकन"
|
||||
body = "Stirling PDF V2 दर्जनों टूल और नए लेआउट के साथ आता है। क्या बदला है और आवश्यक फीचर्स कहाँ मिलेंगे, यह देखने के लिए एक त्वरित टूर लें।"
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "अभी छोड़ें"
|
||||
seePlans = "प्लान देखें →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "अभी अपग्रेड करें →"
|
||||
freeTitle = "सर्वर लाइसेंस"
|
||||
overLimitTitle = "सर्वर लाइसेंस आवश्यक"
|
||||
overLimitBody = "हमारा लाइसेंसिंग प्रति सर्वर अधिकतम <strong>{{freeTierLimit}}</strong> उपयोगकर्ताओं को मुफ्त अनुमति देता है। आपके पास <strong>{{overLimitUserCopy}}</strong> Stirling उपयोगकर्ता हैं। बिना बाधा के जारी रखने के लिए, Stirling Server प्लान में अपग्रेड करें - <strong>अनलिमिटेड सीट्स</strong>, PDF टेक्स्ट एडिटिंग, और पूर्ण एडमिन नियंत्रण $99/server/mo में।"
|
||||
freeBody = "हमारा <strong>Open-Core</strong> लाइसेंसिंग प्रति सर्वर अधिकतम <strong>{{freeTierLimit}}</strong> उपयोगकर्ताओं को मुफ्त अनुमति देता है। बिना बाधा स्केल करने और हमारे नए <strong>PDF टेक्स्ट एडिटिंग टूल</strong> की प्रारंभिक पहुँच पाने के लिए हम Stirling Server प्लान की सलाह देते हैं - पूर्ण एडिटिंग और <strong>अनलिमिटेड सीट्स</strong> $99/server/mo में।"
|
||||
freeBody = "हमारा <strong>Open-Core</strong> लाइसेंसिंग प्रति सर्वर अधिकतम <strong>{{freeTierLimit}}</strong> उपयोगकर्ताओं को निःशुल्क अनुमति देता है। बिना रुकावट स्केल करने के लिए, हम Stirling Server प्लान की अनुशंसा करते हैं - <strong>असीमित सीटें</strong> और <strong>SSO समर्थन</strong> $99/सर्वर/माह पर।"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "डाउनलोड"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "सेल्स से संपर्क करें"
|
||||
contactToUpgrade = "अपने प्लान को अपग्रेड या कस्टमाइज़ करने के लिए हमसे संपर्क करें"
|
||||
maxUsers = "अधिकतम उपयोगकर्ता"
|
||||
upTo = "तक"
|
||||
getLicense = "सर्वर लाइसेंस प्राप्त करें"
|
||||
upgradeToEnterprise = "एंटरप्राइज़ में अपग्रेड करें"
|
||||
selectPeriod = "बिलिंग अवधि चुनें"
|
||||
monthlyBilling = "मासिक बिलिंग"
|
||||
yearlyBilling = "वार्षिक बिलिंग"
|
||||
checkoutOpened = "चेकआउट खुला"
|
||||
checkoutInstructions = "Stripe टैब में अपनी खरीद पूरी करें। भुगतान के बाद यहाँ लौटें और अपना लाइसेंस सक्रिय करने के लिए पेज रीफ़्रेश करें। आपको अपने लाइसेंस कुंजी के साथ ईमेल भी प्राप्त होगा।"
|
||||
activateLicense = "अपना लाइसेंस सक्रिय करें"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "नए टैब में चेकआउट खोला गया"
|
||||
instructions = "Stripe टैब में अपनी खरीद पूरी करें। भुगतान पूरा होने पर आपको अपनी लाइसेंस कुंजी के साथ ईमेल प्राप्त होगा।"
|
||||
enterKey = "अपनी योजना सक्रिय करने के लिए नीचे अपनी लाइसेंस कुंजी दर्ज करें:"
|
||||
keyDescription = "ईमेल से मिली लाइसेंस कुंजी पेस्ट करें"
|
||||
activate = "लाइसेंस सक्रिय करें"
|
||||
doLater = "यह बाद में करूँगा"
|
||||
success = "लाइसेंस सक्रिय हुआ!"
|
||||
successMessage = "आपका लाइसेंस सफलतापूर्वक सक्रिय हो गया है। अब आप यह विंडो बंद कर सकते हैं।"
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "ईमेल सत्यापन आवश्यक"
|
||||
message = "आपको Stripe बिलिंग पोर्टल में अपना ईमेल पता सत्यापित करना होगा। लॉगिन लिंक के लिए अपना ईमेल देखें।"
|
||||
|
||||
[plan.period]
|
||||
month = "माह"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "ऑडिट सिस्टम उपलब्ध नहीं"
|
||||
notAvailableMessage = "ऑडिट सिस्टम कॉन्फ़िगर नहीं है या उपलब्ध नहीं है।"
|
||||
disabled = "ऑडिट लॉगिंग अक्षम है"
|
||||
disabledMessage = "सिस्टम ईवेंट ट्रैक करने के लिए अपनी एप्लिकेशन कॉन्फ़िगरेशन में ऑडिट लॉगिंग सक्षम करें।"
|
||||
enterpriseRequired = "एंटरप्राइज़ लाइसेंस आवश्यक"
|
||||
enterpriseRequiredMessage = "ऑडिट लॉगिंग सिस्टम एक एंटरप्राइज़ फीचर है। ऑडिट लॉग और एनालिटिक्स तक पहुँच के लिए कृपया एंटरप्राइज़ लाइसेंस में अपग्रेड करें।"
|
||||
|
||||
[audit.error]
|
||||
title = "ऑडिट सिस्टम लोड करने में त्रुटि"
|
||||
@@ -6370,7 +5942,6 @@ description = "अपने सेल्फ-होस्टेड Stirling PDF
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "कृपया सर्वर URL दर्ज करें"
|
||||
invalidUrl = "अमान्य URL प्रारूप। कृपया https://your-server.com जैसे वैध URL दर्ज करें"
|
||||
unreachable = "सर्वर से कनेक्ट नहीं हो सका"
|
||||
testFailed = "कनेक्शन परीक्षण विफल"
|
||||
configFetch = "सर्वर कॉन्फ़िगरेशन प्राप्त करने में विफल। कृपया URL जाँचें और फिर से प्रयास करें।"
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "किससे कनेक्ट हो रहा है:"
|
||||
submit = "लॉगिन"
|
||||
signInWith = "इसके साथ साइन इन करें"
|
||||
oauthPending = "प्रमाणीकरण के लिए ब्राउज़र खुल रहा है..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "या ईमेल के साथ जारी रखें"
|
||||
serverRequirement = "ध्यान दें: सर्वर पर लॉगिन सक्षम होना चाहिए।"
|
||||
showInstructions = "कैसे सक्षम करें?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "परिवर्तन रीसेट करें"
|
||||
downloadJson = "JSON डाउनलोड करें"
|
||||
generatePdf = "PDF जनरेट करें"
|
||||
saveChanges = "परिवर्तन सहेजें"
|
||||
applyChanges = "परिवर्तन लागू करें"
|
||||
downloadCopy = "कॉपी डाउनलोड करें"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "टेक्स्ट को बॉक्स में फिट करने हेतु ऑटो-स्केल"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "टिप: मल्टी-सेलेक्ट करन
|
||||
title = "संपादित टेक्स्ट को एक ही PDF एलिमेंट में लॉक करें"
|
||||
description = "सक्रिय होने पर, ओवरलैपिंग glyphs या मिश्रित फ़ॉन्ट्स से बचने के लिए, एडिटर संपादित हर टेक्स्ट बॉक्स को एक PDF टेक्स्ट एलिमेंट के रूप में एक्सपोर्ट करता है."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "उन्नत सेटिंग्स"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "पूर्वावलोकन सीमाएँ"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "टेक्स्ट और छवि फोकस"
|
||||
text = "यह कार्यक्षेत्र टेक्स्ट संपादन और एम्बेडेड छवियों को पुनर्स्थापित करने पर केंद्रित है। जटिल पेज आर्टवर्क, फ़ॉर्म विजेट और लेयर्ड ग्राफ़िक्स निर्यात के लिए सुरक्षित रहते हैं, लेकिन यहाँ पूरी तरह संपादन योग्य नहीं हैं।"
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "पूर्वावलोकन अंतर"
|
||||
text = "कुछ विज़ुअल (जैसे टेबल बॉर्डर, आकृतियाँ, या एनोटेशन की उपस्थिति) पूर्वावलोकन में ठीक वैसे प्रदर्शित नहीं हो सकते। निर्यातित PDF जहाँ संभव हो, मूल ड्रॉइंग कमांड बनाए रखता है।"
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "अल्फा व्यूअर"
|
||||
text = "यह अल्फा व्यूअर अभी विकसित हो रहा है—कुछ फ़ॉन्ट, रंग, पारदर्शिता प्रभाव और लेआउट विवरण हल्के बदल सकते हैं। साझा करने से पहले कृपया जनरेट की गई PDF को दोबारा जाँच लें।"
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "चयनित बॉक्सों को मर्ज करें"
|
||||
merge = "चयन मर्ज करें"
|
||||
@@ -6556,7 +6106,7 @@ warnings = "चेतावनियाँ"
|
||||
suggestions = "नोट्स"
|
||||
currentPageFonts = "इस पेज के फ़ॉन्ट्स"
|
||||
allFonts = "सभी फ़ॉन्ट्स"
|
||||
fallback = "fallback"
|
||||
fallback = "फॉलबैक"
|
||||
missing = "गायब"
|
||||
perfectMessage = "सभी फ़ॉन्ट्स को पूरी तरह पुनरुत्पादित किया जा सकता है."
|
||||
warningMessage = "कुछ फ़ॉन्ट्स सही से रेंडर नहीं हो सकते हैं."
|
||||
@@ -6577,7 +6127,7 @@ insufficientPermissions = "आपके पास यह क्रिया क
|
||||
[addText]
|
||||
title = "टेक्स्ट जोड़ें"
|
||||
header = "PDFs में टेक्स्ट जोड़ें"
|
||||
tags = "text,annotation,label"
|
||||
tags = "पाठ,टिप्पणी,लेबल"
|
||||
applySignatures = "टेक्स्ट लागू करें"
|
||||
|
||||
[addText.text]
|
||||
@@ -6614,58 +6164,3 @@ title = "टेक्स्ट जोड़ने के परिणाम"
|
||||
|
||||
[addText.error]
|
||||
failed = "PDF में टेक्स्ट जोड़ते समय त्रुटि हुई."
|
||||
|
||||
[mobileUpload]
|
||||
title = "मोबाइल से अपलोड करें"
|
||||
description = "फ़ोटो अपलोड करने के लिए स्कैन करें। छवियाँ स्वतः PDF में बदल जाती हैं।"
|
||||
descriptionNoConvert = "अपने मोबाइल डिवाइस से फ़ोटो अपलोड करने के लिए स्कैन करें।"
|
||||
error = "कनेक्शन त्रुटि"
|
||||
pollingError = "फ़ाइलें जाँचने में त्रुटि"
|
||||
sessionId = "सेशन ID"
|
||||
sessionCreateError = "सेशन बनाने में विफल"
|
||||
expiryWarning = "सेशन शीघ्र ही समाप्त हो रहा है"
|
||||
expiryWarningMessage = "यह QR कोड {{seconds}} सेकंड में समाप्त हो जाएगा। नया कोड स्वचालित रूप से जनरेट हो जाएगा।"
|
||||
filesReceived = "{{count}} फ़ाइल(ें) प्राप्त हुईं"
|
||||
connected = "मोबाइल डिवाइस कनेक्टेड"
|
||||
instructions = "अपने फ़ोन कैमरे से स्कैन करें। छवियाँ स्वतः PDF में बदल जाती हैं।"
|
||||
instructionsNoConvert = "फ़ाइलें अपलोड करने के लिए अपने फ़ोन कैमरे से स्कैन करें।"
|
||||
|
||||
[mobileScanner]
|
||||
title = "मोबाइल स्कैनर"
|
||||
noSession = "अमान्य सेशन"
|
||||
noSessionMessage = "इस पेज तक पहुँचने के लिए कृपया वैध QR कोड स्कैन करें।"
|
||||
validating = "सेशन सत्यापित किया जा रहा है..."
|
||||
sessionInvalid = "सेशन त्रुटि"
|
||||
sessionExpired = "यह सेशन समाप्त हो गया है। कृपया रिफ़्रेश करें और फिर से प्रयास करें।"
|
||||
sessionNotFound = "सेशन नहीं मिला। कृपया रिफ़्रेश करें और फिर से प्रयास करें।"
|
||||
sessionValidationError = "सेशन सत्यापित नहीं हो सका। कृपया फिर से प्रयास करें।"
|
||||
uploadSuccess = "अपलोड सफल!"
|
||||
uploadSuccessMessage = "आपकी छवियाँ स्थानांतरित कर दी गई हैं।"
|
||||
httpsRequired = "कैमरा एक्सेस के लिए HTTPS या localhost आवश्यक है। कृपया HTTPS उपयोग करें या localhost के माध्यम से पहुँचें।"
|
||||
uploadFailed = "अपलोड विफल। कृपया फिर से प्रयास करें।"
|
||||
uploading = "अपलोड हो रहा है..."
|
||||
connected = "कनेक्टेड"
|
||||
connecting = "कनेक्ट किया जा रहा है..."
|
||||
chooseMethod = "अपलोड विधि चुनें"
|
||||
chooseMethodDescription = "दस्तावेज़ स्कैन और अपलोड करने का तरीका चुनें"
|
||||
camera = "कैमरा"
|
||||
cameraDescription = "अपने डिवाइस कैमरे से स्वचालित किनारा पहचान के साथ दस्तावेज़ स्कैन करें"
|
||||
fileUpload = "फ़ाइल अपलोड"
|
||||
fileDescription = "अपने डिवाइस से मौजूदा फ़ोटो या दस्तावेज़ अपलोड करें"
|
||||
cameraAccessDenied = "कैमरा एक्सेस अस्वीकृत। कृपया कैमरा एक्सेस सक्षम करें।"
|
||||
back = "वापस"
|
||||
settings = "सेटिंग्स"
|
||||
edgeDetection = "किनारों की पहचान"
|
||||
flashlight = "फ्लैशलाइट"
|
||||
flash = "फ्लैश"
|
||||
processing = "प्रसंस्करण..."
|
||||
capture = "फ़ोटो कैप्चर करें"
|
||||
selectFilesPrompt = "अपलोड करने के लिए फ़ाइलें चुनें"
|
||||
selectImage = "छवि चुनें"
|
||||
preview = "पूर्वावलोकन"
|
||||
retake = "फिर से लें"
|
||||
addToBatch = "बैच में जोड़ें"
|
||||
upload = "अपलोड"
|
||||
batchImages = "बैच"
|
||||
clearBatch = "साफ़ करें"
|
||||
uploadAll = "सभी अपलोड करें"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Imate nespremljene promjene u svom PDF-u."
|
||||
pendingRedactionsTitle = "Neprimijenjena zacrnjivanja"
|
||||
pendingRedactions = "Imate neprimijenjena zacrnjivanja koja će biti izgubljena."
|
||||
areYouSure = "Jeste li sigurni da želite izaći?"
|
||||
unsavedChangesTitle = "Nespremljene promjene"
|
||||
keepWorking = "Nastavi raditi"
|
||||
discardChanges = "Odbaci i izađi"
|
||||
discardRedactions = "Odbaci i izađi"
|
||||
applyAndContinue = "Spremi i izađi"
|
||||
exportAndContinue = "Izvezi i nastavi"
|
||||
cancel = "Odustani"
|
||||
@@ -343,10 +340,6 @@ advance = "Napredno"
|
||||
edit = "Pregled & Uređivanje"
|
||||
popular = "Popularno"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferencije"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Napredno"
|
||||
title = "Sigurnost i autentikacija"
|
||||
security = "Sigurnost"
|
||||
connections = "Povezivanja"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licenciranje i analitika"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Trenutačna verzija"
|
||||
latestVersion = "Najnovija verzija"
|
||||
checkForUpdates = "Provjeri ažuriranja"
|
||||
viewDetails = "Prikaži detalje"
|
||||
serverNeedsUpdate = "Administrator treba ažurirati poslužitelj"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informacije o verziji"
|
||||
description = "Detalji o verziji desktopa i poslužitelja"
|
||||
desktop = "Verzija desktopa"
|
||||
server = "Verzija poslužitelja"
|
||||
|
||||
[settings.security]
|
||||
title = "Sigurnost"
|
||||
description = "Ažurirajte svoju lozinku kako biste osigurali račun."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Promijenite lozinku. Bit ćete odjavljeni nakon ažuriranja."
|
||||
required = "Sva polja su obavezna."
|
||||
mismatch = "Nove lozinke se ne podudaraju."
|
||||
error = "Nije moguće ažurirati lozinku. Provjerite trenutačnu lozinku i pokušajte ponovno."
|
||||
success = "Lozinka je uspješno ažurirana. Prijavite se ponovno."
|
||||
ssoDisabled = "Promjenama lozinke upravlja vaš davatelj identiteta."
|
||||
current = "Trenutačna lozinka"
|
||||
currentPlaceholder = "Unesite svoju trenutačnu lozinku"
|
||||
new = "Nova lozinka"
|
||||
newPlaceholder = "Unesite novu lozinku"
|
||||
confirm = "Potvrdite novu lozinku"
|
||||
confirmPlaceholder = "Ponovno unesite novu lozinku"
|
||||
update = "Ažuriraj lozinku"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Prečaci tipkovnice"
|
||||
@@ -522,16 +488,11 @@ low = "Nizak"
|
||||
title = "Promijeni pristupne podatke"
|
||||
header = "Ažurirajte korisničke podatke"
|
||||
changePassword = "Koristite zadanu lozinku za prijavu. Unesite novu lozinku"
|
||||
ssoManaged = "Vašim računom upravlja vaš davatelj identiteta."
|
||||
newUsername = "Novo korisničko ime"
|
||||
oldPassword = "Trenutna zaporka"
|
||||
newPassword = "Nova zaporka"
|
||||
confirmNewPassword = "Potvrdite novu lozinku"
|
||||
submit = "Potvrdi"
|
||||
credsUpdated = "Račun ažuriran"
|
||||
description = "Promjene su spremljene. Prijavite se ponovno."
|
||||
error = "Nije moguće ažurirati korisničko ime. Provjerite lozinku i pokušajte ponovno."
|
||||
changeUsername = "Ažurirajte svoje korisničko ime. Bit ćete odjavljeni nakon ažuriranja."
|
||||
|
||||
[account]
|
||||
title = "Postavke računa"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Postavke računa"
|
||||
adminSettings = "Admin Postavka - Pregled i dodavanje korisnika"
|
||||
userControlSettings = "Postavke kontrole korisnika"
|
||||
changeUsername = "Promijeni korisničko ime"
|
||||
changeUsernameDescription = "Ažurirajte svoje korisničko ime. Bit ćete odjavljeni nakon ažuriranja."
|
||||
newUsernamePlaceholder = "Unesite novo korisničko ime"
|
||||
newUsername = "Novo korisničko ime"
|
||||
password = "Potvrda lozinke"
|
||||
oldPassword = "Stara zaporka"
|
||||
@@ -749,11 +708,6 @@ tags = "potpis,autogram"
|
||||
title = "Potpisati"
|
||||
desc = "Dodaje potpis u PDF crtežom, tekstom ili slikom"
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotiraj,istakni,crtaj"
|
||||
title = "Anotiraj"
|
||||
desc = "Istakni, crtaj, dodaj bilješke i oblike u pregledniku"
|
||||
|
||||
[home.flatten]
|
||||
tags = "pojednostavi,ukloni,interaktivno"
|
||||
title = "Ravnanje (Flatten)"
|
||||
@@ -964,8 +918,8 @@ desc = "Preklapa PDF-ove na drugi PDF"
|
||||
title = "Preklapanje PDF-ova"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF uređivač teksta"
|
||||
desc = "Pregledajte i uredite Stirling PDF JSON izvoze s grupnim uređivanjem teksta i ponovnim generiranjem PDF-a"
|
||||
title = "Uređivač teksta PDF-a"
|
||||
desc = "Uređujte postojeći tekst i slike unutar PDF-ova"
|
||||
|
||||
[home.addText]
|
||||
tags = "tekst,anotacija,oznaka"
|
||||
@@ -976,7 +930,6 @@ desc = "Dodajte prilagođeni tekst bilo gdje u PDF-u"
|
||||
addFiles = "Dodaj datoteke"
|
||||
uploadFromComputer = "Učitaj s računala"
|
||||
openFromComputer = "Otvori s računala"
|
||||
mobileUpload = "Otpremanje s mobitela"
|
||||
|
||||
[viewPdf]
|
||||
tags = "pregled,čitanje,komentiranje,tekst,slika"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opcije CBZ u PDF"
|
||||
optimizeForEbook = "Optimiziraj PDF za e-čitače (koristi Ghostscript)"
|
||||
cbzOutputOptions = "Opcije PDF u CBZ"
|
||||
cbzDpi = "DPI za renderiranje slike"
|
||||
cbrOptions = "CBR opcije"
|
||||
cbrOutputOptions = "Opcije PDF u CBR"
|
||||
cbrDpi = "DPI za renderiranje slike"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opcije eBook u PDF"
|
||||
ebookOptionsDesc = "Opcije za pretvorbu eBook-a u PDF"
|
||||
embedAllFonts = "Ugradi sve fontove"
|
||||
embedAllFontsDesc = "Ugradi sve fontove iz eBooka u generirani PDF"
|
||||
includeTableOfContents = "Uključi sadržaj"
|
||||
includeTableOfContentsDesc = "Dodaj generirani sadržaj u rezultatni PDF"
|
||||
includePageNumbers = "Uključi brojeve stranica"
|
||||
includePageNumbersDesc = "Dodaj brojeve stranica u generirani PDF"
|
||||
optimizeForEbookPdf = "Optimiziraj za čitače e-knjiga"
|
||||
optimizeForEbookPdfDesc = "Optimiziraj PDF za čitanje na eBook uređajima (manja veličina, bolje renderiranje na eInk uređajima)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opcije PDF u eBook"
|
||||
epubOptionsDesc = "Opcije za pretvorbu PDF-a u EPUB/AZW3"
|
||||
detectChapters = "Otkrij poglavlja"
|
||||
detectChaptersDesc = "Otkrij naslove koji izgledaju kao poglavlja i umetni EPUB prijelome stranica"
|
||||
targetDevice = "Ciljani uređaj"
|
||||
targetDeviceDesc = "Odaberite izlazni profil optimiziran za uređaj za čitanje"
|
||||
outputFormat = "Izlazni format"
|
||||
outputFormatDesc = "Odaberite izlazni format za e-knjigu"
|
||||
tabletPhone = "Tablet/mobitel (sa slikama)"
|
||||
kindleEink = "Kindle e-Ink (optimizirano za tekst)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konverzija,pretvaranje,img,jpg,slika,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Dodaj privitak"
|
||||
remove = "Ukloni privitak"
|
||||
embed = "Ugradi privitak"
|
||||
convertToPdfA3b = "Pretvori u PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Stvara arhivski PDF s ugrađenim privicima"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b je arhivski format koji osigurava dugoročno očuvanje. Omogućuje ugradnju proizvoljnih formata datoteka kao privitaka. Pretvorba zahtijeva Ghostscript i može dulje trajati za velike datoteke."
|
||||
convertToPdfA3bTooltipHeader = "O pretvorbi u PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Što radi"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Spremljeno"
|
||||
label = "Učitaj sliku potpisa"
|
||||
placeholder = "Odaberite slikovnu datoteku"
|
||||
hint = "Učitajte PNG ili JPG sliku svojega potpisa"
|
||||
removeBackground = "Ukloni bijelu pozadinu (učini prozirnom)"
|
||||
processing = "Obrada slike..."
|
||||
backgroundRemovalFailedTitle = "Uklanjanje pozadine nije uspjelo"
|
||||
backgroundRemovalFailedMessage = "Nije moguće ukloniti pozadinu sa slike. Umjesto toga koristi se izvorna slika."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Kako dodati potpis"
|
||||
@@ -2434,11 +2351,6 @@ note = "Spljoštavanje uklanja interaktivne elemente iz PDF-a, čineći ih neure
|
||||
label = "Izravnati samo obrasce"
|
||||
desc = "Spljošti samo polja obrazaca, ostavljajući druge interaktivne elemente netaknute"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI renderiranja (neobavezno, preporučeno 150 DPI)"
|
||||
help = "Ostavite prazno za zadanu vrijednost sustava. Veći DPI oštri izlaz, ali povećava vrijeme obrade i veličinu datoteke."
|
||||
placeholder = "npr. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Rezultati spljoštavanja"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Izreži sliku"
|
||||
submit = "Potvrdi"
|
||||
noFileSelected = "Odaberite PDF datoteku za početak izrezivanja"
|
||||
reset = "Vrati na cijeli PDF"
|
||||
autoCrop = "Automatski obreži bijeli prostor"
|
||||
|
||||
[crop.preview]
|
||||
title = "Odabir područja izrezivanja"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metoda redakcije"
|
||||
mode = "Način"
|
||||
automatic = "Automatski"
|
||||
automaticDesc = "Redigiraj tekst na temelju pojmova pretraživanja"
|
||||
automaticDisabledTooltip = "Odaberite datoteke u upravitelju datotekama kako biste zacrnili više datoteka odjednom"
|
||||
manual = "Ručni"
|
||||
manualDesc = "Kliknite i povucite za redakciju određenih područja"
|
||||
manualComingSoon = "Ručna redakcija uskoro dolazi"
|
||||
@@ -3315,35 +3225,8 @@ text = "Podudara samo cijele riječi, ne djelomična poklapanja. 'John' neće od
|
||||
title = "Pretvori u PDF-Image"
|
||||
text = "Pretvara PDF u PDF temeljen na slici nakon redakcije. Time se osigurava da je tekst iza okvira za redakciju potpuno uklonjen i neobnovljiv."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Kontrole ručnog zacrnjivanja"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Alat za označavanje teksta"
|
||||
text = "Odaberite tekst izravno na PDF-u kako biste ga označili za zacrnjivanje. Kliknite i povucite za isticanje određenog teksta koji želite zacrniti."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Alat za označavanje područja"
|
||||
text = "Nacrtajte pravokutna područja na PDF-u kako biste označili regije za zacrnjivanje. Korisno za zacrnjivanje slika, potpisa ili nepravilnih oblika."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Primijeni zacrnjivanja"
|
||||
text = "Nakon označavanja sadržaja kliknite 'Primijeni' kako biste trajno zacrnili sva označena područja. Brojač na čekanju pokazuje koliko je zacrnjivanja spremno za primjenu."
|
||||
bullet1 = "Označite koliko god područja trebate prije primjene"
|
||||
bullet2 = "Sva zacrnjivanja na čekanju primjenjuju se odjednom"
|
||||
bullet3 = "Zacrnjivanja se ne mogu poništiti nakon primjene"
|
||||
|
||||
[redact.manual]
|
||||
title = "Alati za zacrnjivanje"
|
||||
instructions = "Odaberite tekst ili nacrtajte područja na PDF-u kako biste označili sadržaj za zacrnjivanje."
|
||||
markText = "Označi tekst"
|
||||
markArea = "Označi područje"
|
||||
pendingLabel = "Na čekanju:"
|
||||
applyWarning = "⚠️ Trajna primjena, ne može se poništiti i podaci ispod će biti izbrisani"
|
||||
apply = "Primijeni"
|
||||
noMarks = "Nema oznaka zacrnjivanja. Upotrijebite alate iznad za označavanje sadržaja za zacrnjivanje."
|
||||
header = "Ručna redakcija"
|
||||
controlsTitle = "Kontrole ručnog zacrnjivanja"
|
||||
textBasedRedaction = "Redakcija temeljena na tekstu"
|
||||
pageBasedRedaction = "Redakcija po stranicama"
|
||||
convertPDFToImageLabel = "Pretvori PDF u PDF-Image (koristi se za uklanjanje teksta iza okvira)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Unesite broj vodoravnih podjela"
|
||||
label = "Okomite podjele"
|
||||
placeholder = "Unesite broj okomitih podjela"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Način dijeljenja"
|
||||
description = "Odaberite kako podijeliti stranice"
|
||||
splitAll = "Podijeli sve stranice"
|
||||
splitAllExceptFirst = "Podijeli sve osim prve"
|
||||
splitAllExceptLast = "Podijeli sve osim zadnje"
|
||||
splitAllExceptFirstAndLast = "Podijeli sve osim prve i zadnje"
|
||||
custom = "Prilagođene stranice"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Prilagođeni brojevi stranica"
|
||||
placeholder = "npr. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Pečat, dodavanje slike, središnja slika, vodeni žig, PDF, ugradnja, prilagodba"
|
||||
header = "Pečat PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Veličina datoteke"
|
||||
[compress.grayscale]
|
||||
label = "Primijeni sivinu za kompresiju"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Lineariziraj PDF za brzo web pregledavanje"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Pretvori slike u linijsku grafiku"
|
||||
description = "Koristi ImageMagick za reduciranje stranica na crno-bijele visokog kontrasta radi maksimalnog smanjenja veličine."
|
||||
unavailable = "ImageMagick nije instaliran ili omogućen na ovom poslužitelju"
|
||||
detailLevel = "Razina detalja"
|
||||
edgeEmphasis = "Naglašavanje rubova"
|
||||
edgeLow = "Blago"
|
||||
edgeMedium = "Uravnoteženo"
|
||||
edgeHigh = "Jako"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Pregled postavki kompresije"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Više vrijednosti smanjuju veličinu datoteke"
|
||||
title = "Sivi tonovi"
|
||||
text = "Odaberite ovu opciju kako biste sve slike pretvorili u crno-bijele, što može znatno smanjiti veličinu datoteke, osobito za skenirane PDF-ove ili dokumente s mnogo slika."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Linijska grafika"
|
||||
text = "Pretvori stranice u crno-bijele visokog kontrasta pomoću ImageMagicka. Upotrijebite razinu detalja za kontrolu koliko sadržaja postaje crn, a naglašavanje rubova za kontrolu koliko agresivno se otkrivaju rubovi."
|
||||
|
||||
[compress.error]
|
||||
failed = "Došlo je do pogreške pri komprimiranju PDF-a."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Došlo je do pogreške pri komprimiranju PDF-a."
|
||||
_value = "Postavke kompresije"
|
||||
1 = "1-3 PDF kompresija,</br> 4-6 blaga kompresija slika,</br> 7-9 jaka kompresija slika značajno će smanjiti kvalitetu slike"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Niže vrijednosti čuvaju kvalitetu, ali rezultiraju većim datotekama"
|
||||
range4to6 = "Srednje sažimanje s umjerenim smanjenjem kvalitete"
|
||||
range7to9 = "Više vrijednosti znatno smanjuju veličinu datoteke, ali mogu smanjiti jasnoću slike"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Ova je datoteka zaštićena lozinkom. Unesite lozinku:"
|
||||
cancelled = "Operacija otkazana za PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Izbriši odabrane stranice"
|
||||
closePdf = "Zatvori PDF"
|
||||
exportAll = "Izvezi PDF"
|
||||
downloadSelected = "Preuzmi odabrane datoteke"
|
||||
annotations = "Anotacije"
|
||||
exportSelected = "Izvezi odabrane stranice"
|
||||
saveChanges = "Spremi promjene"
|
||||
downloadAll = "Preuzmi sve"
|
||||
saveAll = "Spremi sve"
|
||||
toggleTheme = "Prebaci temu"
|
||||
toggleBookmarks = "Prebaci knjižne oznake"
|
||||
language = "Jezik"
|
||||
toggleAnnotations = "Prebaci vidljivost bilješki"
|
||||
search = "Pretraži PDF"
|
||||
panMode = "Način pomicanja"
|
||||
applyRedactionsFirst = "Najprije primijeni zacrnjivanja"
|
||||
rotateLeft = "Rotiraj ulijevo"
|
||||
rotateRight = "Rotiraj udesno"
|
||||
toggleSidebar = "Prebaci bočnu traku"
|
||||
toggleBookmarks = "Prebaci knjižne oznake"
|
||||
exportSelected = "Izvezi odabrane stranice"
|
||||
toggleAnnotations = "Prebaci vidljivost bilješki"
|
||||
annotationMode = "Prebaci način bilješki"
|
||||
print = "Ispis PDF-a"
|
||||
draw = "Crtaj"
|
||||
redact = "Zacrni"
|
||||
exitRedaction = "Izađi iz načina zacrnjivanja"
|
||||
save = "Spremi"
|
||||
downloadAll = "Preuzmi sve"
|
||||
saveAll = "Spremi sve"
|
||||
|
||||
[textAlign]
|
||||
left = "Lijevo"
|
||||
center = "Centar"
|
||||
right = "Desno"
|
||||
|
||||
[annotation]
|
||||
title = "Anotiraj"
|
||||
desc = "Koristite isticanje, olovku, tekst i napomene. Promjene ostaju aktivne — nije potrebno spljoštavanje."
|
||||
highlight = "Isticanje"
|
||||
pen = "Olovka"
|
||||
text = "Tekstni okvir"
|
||||
note = "Napomena"
|
||||
rectangle = "Pravokutnik"
|
||||
ellipse = "Elipsa"
|
||||
select = "Odaberi"
|
||||
exit = "Izađi iz načina anotacije"
|
||||
strokeWidth = "Širina"
|
||||
opacity = "Neprozirnost"
|
||||
strokeOpacity = "Neprozirnost poteza"
|
||||
fillOpacity = "Neprozirnost ispune"
|
||||
fontSize = "Veličina fonta"
|
||||
chooseColor = "Odaberi boju"
|
||||
color = "Boja"
|
||||
strokeColor = "Boja poteza"
|
||||
fillColor = "Boja ispune"
|
||||
underline = "Podcrtavanje"
|
||||
strikeout = "Precrtavanje"
|
||||
squiggly = "Valovito"
|
||||
inkHighlighter = "Ručni marker"
|
||||
freehandHighlighter = "Ručni marker"
|
||||
square = "Kvadrat"
|
||||
circle = "Krug"
|
||||
polygon = "Poligon"
|
||||
line = "Linija"
|
||||
stamp = "Dodaj sliku"
|
||||
textMarkup = "Označavanje teksta"
|
||||
drawing = "Crtanje"
|
||||
shapes = "Oblici"
|
||||
notesStamps = "Napomene i pečati"
|
||||
settings = "Postavke"
|
||||
borderOn = "Obrub: uključen"
|
||||
borderOff = "Obrub: isključen"
|
||||
editInk = "Uredi olovku"
|
||||
editLine = "Uredi liniju"
|
||||
editNote = "Uredi napomenu"
|
||||
editText = "Uredi tekstni okvir"
|
||||
editTextMarkup = "Uredi označavanje teksta"
|
||||
editSelected = "Uredi anotaciju"
|
||||
editSquare = "Uredi kvadrat"
|
||||
editCircle = "Uredi krug"
|
||||
editPolygon = "Uredi poligon"
|
||||
unsupportedType = "Ova vrsta anotacije nije u potpunosti podržana za uređivanje."
|
||||
textAlignment = "Poravnanje teksta"
|
||||
noteIcon = "Ikona napomene"
|
||||
imagePreview = "Pretpregled"
|
||||
contents = "Tekst"
|
||||
backgroundColor = "Boja pozadine"
|
||||
clearBackground = "Ukloni pozadinu"
|
||||
noBackground = "Bez pozadine"
|
||||
stampSettings = "Postavke pečata"
|
||||
savingCopy = "Priprema preuzimanja..."
|
||||
saveFailed = "Nije moguće spremiti kopiju"
|
||||
saveReady = "Preuzimanje spremno"
|
||||
selectAndMove = "Odaberi i uredi"
|
||||
editSelectDescription = "Kliknite postojeću anotaciju kako biste uredili njezinu boju, neprozirnost, tekst ili veličinu."
|
||||
editStampHint = "Za promjenu slike izbrišite ovaj pečat i dodajte novi."
|
||||
editSwitchToSelect = "Prebacite se na Odaberi i uredi kako biste uredili ovu anotaciju."
|
||||
undo = "Poništi"
|
||||
redo = "Ponovi"
|
||||
applyChanges = "Primijeni promjene"
|
||||
saveChanges = "Spremi promjene"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Postavke"
|
||||
adminSettings = "Admin postavke"
|
||||
allTools = "All Tools"
|
||||
reader = "Čitač"
|
||||
tours = "Obilasci"
|
||||
showMeAround = "Provedi me kroz"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Pogledajte vodiče ovdje: obilazak alata, obilazak novog V2 izgleda i administratorski obilazak."
|
||||
user = "Pogledajte vodiče ovdje: obilazak alata i obilazak novog V2 izgleda."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Vodič kroz alate"
|
||||
toolsTourDesc = "Saznajte što alati mogu"
|
||||
adminTour = "Vodič za administratore"
|
||||
adminTourDesc = "Istražite administratorske postavke i značajke"
|
||||
whatsNewTour = "Pogledajte novosti u V2"
|
||||
whatsNewTourDesc = "Obilazak ažuriranog izgleda"
|
||||
|
||||
[admin]
|
||||
error = "Pogreška"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Nije uspjelo učitavanje postavki"
|
||||
saveError = "Nije uspjelo spremanje postavki"
|
||||
saved = "Postavke su uspješno spremljene"
|
||||
saveSuccess = "Postavke su uspješno spremljene"
|
||||
success = "Postavke su uspješno spremljene"
|
||||
error = "Nije uspjelo spremanje postavki"
|
||||
save = "Spremi promjene"
|
||||
discard = "Odbaci"
|
||||
restartRequired = "Potrebno ponovno pokretanje"
|
||||
@@ -4422,13 +4185,6 @@ description = "Put do izvršne datoteke WeasyPrinta za pretvorbu HTML u PDF (ost
|
||||
label = "Izvršna datoteka Unoconverta"
|
||||
description = "Put do LibreOffice unoconverta za pretvorbe dokumenata (ostavite prazno za zadano: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Osnovni URL za frontend (npr. https://pdf.example.com). Koristi se za poveznice pozivnica e-poštom i otpremanje putem mobilnog QR koda. Ostavite prazno za korištenje backend URL-a."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Kliknite za prikaz detalja plana"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sigurnost"
|
||||
description = "Konfigurirajte autentikaciju, ponašanje prijave i sigurnosne politike."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Poveži"
|
||||
disconnect = "Prekini vezu"
|
||||
disconnected = "Pružatelj je uspješno odspojen"
|
||||
disconnectError = "Nije uspjelo odspajanje pružatelja"
|
||||
mobileScannerConvertToPdf = "Pretvori slike u PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatski pretvori otpremljene slike u PDF format. Ako je onemogućeno, slike će ostati nepromijenjene."
|
||||
mobileScannerImageResolution = "Rezolucija slike"
|
||||
mobileScannerImageResolutionDesc = "Rezolucija otpremljenih slika. \"Smanjena\" skalira slike na najviše 1200 px radi smanjenja veličine datoteke."
|
||||
imageResolutionFull = "Puna (izvorna veličina)"
|
||||
imageResolutionReduced = "Smanjena (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Format stranice"
|
||||
mobileScannerPageFormatDesc = "Veličina PDF stranice za pretvorene slike. \"Zadrži\" koristi izvorne dimenzije slike."
|
||||
pageFormatKeep = "Zadrži (izvorne dimenzije)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Razvuci da ispuni"
|
||||
mobileScannerStretchToFitDesc = "Razvuci slike kako bi ispunile cijelu stranicu. Ako je onemogućeno, slike su centrirane uz očuvanje omjera."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Automatska SSO prijava"
|
||||
@@ -4646,122 +4389,6 @@ description = "Automatski izradi korisničke račune pri prvoj SAML2 prijavi"
|
||||
label = "Blokiraj registraciju"
|
||||
description = "Spriječi registraciju novih korisnika putem SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Otpremanje s mobitela"
|
||||
enable = "Omogući otpremanje putem QR koda"
|
||||
description = "Dopustite korisnicima otpremanje datoteka s mobilnih uređaja skeniranjem QR koda"
|
||||
note = "Napomena: Potrebno je konfigurirati Frontend URL. "
|
||||
link = "Konfiguriraj u postavkama sustava"
|
||||
mobileScannerConvertToPdf = "Pretvori slike u PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatski pretvori otpremljene slike u PDF format. Ako je onemogućeno, slike će ostati nepromijenjene."
|
||||
mobileScannerImageResolution = "Rezolucija slike"
|
||||
mobileScannerImageResolutionDesc = "Rezolucija otpremljenih slika. \"Smanjena\" skalira slike na najviše 1200 px radi smanjenja veličine datoteke."
|
||||
imageResolutionFull = "Puna (izvorna veličina)"
|
||||
imageResolutionReduced = "Smanjena (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Format stranice"
|
||||
mobileScannerPageFormatDesc = "Veličina PDF stranice za pretvorene slike. \"Zadrži\" koristi izvorne dimenzije slike."
|
||||
pageFormatKeep = "Zadrži (izvorne dimenzije)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Razvuci da ispuni"
|
||||
mobileScannerStretchToFitDesc = "Razvuci slike kako bi ispunile cijelu stranicu. Ako je onemogućeno, slike su centrirane uz očuvanje omjera."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram bot"
|
||||
description = "Konfigurirajte povezivanje Telegram bota, kontrole pristupa i ponašanje povratnih poruka."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Omogući Telegram bot"
|
||||
description = "Dopustite korisnicima interakciju sa Stirling PDF-om putem konfiguriranog Telegram bota."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Korisničko ime bota"
|
||||
description = "Javno korisničko ime vašeg Telegram bota."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token bota"
|
||||
description = "API token koji je dao BotFather za vaš Telegram bot."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Ulazna mapa"
|
||||
description = "Mapa unutar direktorija pipeline u koju se spremaju dolazne Telegram datoteke."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Koristi prilagođeni sufiks mape"
|
||||
description = "Dodaj ID chata u dolazne mape datoteka kako bi se odvojile po chatu."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Kontrola pristupa"
|
||||
description = "Ograničite koje osobe ili kanali mogu komunicirati s botom."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Dopusti određene korisničke ID-jeve"
|
||||
description = "Kad je omogućeno, samo navedeni korisnički ID-jevi mogu koristiti bota."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Dopušteni korisnički ID-jevi"
|
||||
description = "Unesite Telegram korisničke ID-jeve koji smiju komunicirati s botom."
|
||||
placeholder = "Dodajte korisnički ID i pritisnite Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Dopusti određene ID-jeve kanala"
|
||||
description = "Kad je omogućeno, samo navedeni ID-jevi kanala mogu koristiti bota."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Dopušteni ID-jevi kanala"
|
||||
description = "Unesite Telegram ID-jeve kanala koji smiju komunicirati s botom."
|
||||
placeholder = "Dodajte ID kanala i pritisnite Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Obrada"
|
||||
description = "Upravljajte intervalima dohvaćanja i vremenskim ograničenjima obrade za Telegram otpremanja."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Vremensko ograničenje obrade (sekunde)"
|
||||
description = "Maksimalno vrijeme čekanja na zadatak obrade prije prijave pogreške."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interval dohvaćanja (ms)"
|
||||
description = "Interval između provjera novih Telegram ažuriranja."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Povratne poruke"
|
||||
description = "Odaberite kada bot treba slati povratne poruke korisnicima i kanalima."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Omogući povratne poruke"
|
||||
description = "Kontrolira hoće li bot uopće slati povratne poruke."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Pravila povratnih poruka (kanali)"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Prikaži \"Nema valjanog dokumenta\" (kanal)"
|
||||
description = "Potisni odgovor 'Nema valjanog dokumenta' za otpremanja u kanal."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Prikaži pogreške obrade (kanal)"
|
||||
description = "Šalji poruke o pogreškama obrade kanalima."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Prikaži poruke o pogreškama (kanal)"
|
||||
description = "Prikaži detaljne poruke o pogreškama za kanale."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Pravila povratnih poruka (korisnici)"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Prikaži \"Nema valjanog dokumenta\" (korisnik)"
|
||||
description = "Potisni odgovor 'Nema valjanog dokumenta' za korisnička otpremanja."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Prikaži pogreške obrade (korisnik)"
|
||||
description = "Šalji poruke o pogreškama obrade korisnicima."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Prikaži poruke o pogreškama (korisnik)"
|
||||
description = "Prikaži detaljne poruke o pogreškama za korisnike."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Baza podataka"
|
||||
description = "Konfigurirajte prilagođene postavke povezivanja baze podataka za enterprise implementacije."
|
||||
@@ -4943,10 +4570,6 @@ description = "Dopusti administratorima pozivanje korisnika e-poštom s automats
|
||||
label = "Frontend URL"
|
||||
description = "Osnovni URL za frontend (npr. https://pdf.example.com). Koristi se za generiranje poveznica za pozivnice u e-porukama. Ostavite prazno za korištenje backend URL-a."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Napomena: Potrebno je konfigurirati Frontend URL. "
|
||||
link = "Konfiguriraj u postavkama sustava"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Pravni dokumenti"
|
||||
description = "Konfigurirajte poveznice na pravne dokumente i politike."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Moje datoteke"
|
||||
noRecentFiles = "Nema nedavnih datoteka"
|
||||
googleDriveNotAvailable = "Integracija Google Drive nije dostupna"
|
||||
mobileUpload = "Otpremanje s mobitela"
|
||||
mobileShort = "Mobitel"
|
||||
mobileUploadNotAvailable = "Otpremanje s mobitela nije omogućeno"
|
||||
downloadSelected = "Preuzmi odabrano"
|
||||
saveSelected = "Spremi odabrano"
|
||||
openFiles = "Otvori datoteke"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Učitavanje..."
|
||||
back = "Natrag"
|
||||
continue = "Nastavi"
|
||||
error = "Pogreška"
|
||||
save = "Spremi"
|
||||
|
||||
[config.overview]
|
||||
title = "Konfiguracija aplikacije"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Sve aplikacije ili servisi koji trenutno koriste ove ključeve prestat
|
||||
confirmPrompt = "Jeste li sigurni da želite nastaviti?"
|
||||
confirmCta = "Osvježi ključeve"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Pogreška API ključa"
|
||||
failedToCreateApiKey = "Neuspjelo stvaranje API ključa."
|
||||
failedToRetrieveApiKey = "Neuspjelo dohvaćanje API ključa iz odgovora."
|
||||
failedToFetchApiKey = "Neuspjelo dohvaćanje API ključa."
|
||||
apiKeyRefreshed = "API ključ osvježen"
|
||||
apiKeyRefreshedBody = "Vaš API ključ je uspješno osvježen."
|
||||
failedToRefreshApiKey = "Neuspjelo osvježavanje API ključa."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Odaberite privitke"
|
||||
info = "Odaberite datoteke koje želite priložiti svom PDF-u. Te će datoteke biti ugrađene i dostupne kroz panel privitaka PDF-a."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Završi"
|
||||
startTour = "Započni obilazak"
|
||||
startTourDescription = "Krenite u vođeni obilazak ključnih značajki alata Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Započnite na traci <strong>Brzi pristup</strong> kako biste skakali između Čitača, Automatizacije, svojih datoteka i svih obilazaka."
|
||||
leftPanel = "Lijevi panel <strong>Alati</strong> navodi sve što možete učiniti. Pregledajte kategorije ili pretražite kako biste brzo našli alat."
|
||||
fileUpload = "Koristite gumb <strong>Datoteke</strong> za otpremu ili odabir nedavnog PDF-a. Učitat ćemo primjer kako biste vidjeli radni prostor."
|
||||
rightRail = "<strong>Desna traka</strong> sadrži brze radnje za odabir datoteka, promjenu teme ili jezika i preuzimanje rezultata."
|
||||
topBar = "Gornja traka omogućuje prebacivanje između <strong>Preglednika</strong>, <strong>Uređivača stranica</strong> i <strong>Aktivnih datoteka</strong>."
|
||||
pageEditorView = "Prebacite se na Uređivač stranica za promjenu redoslijeda, rotiranje ili brisanje stranica."
|
||||
activeFilesView = "Koristite Aktivne datoteke da vidite sve što je otvoreno i odaberete na čemu raditi."
|
||||
wrapUp = "To je ono što je novo u V2. Otvorite izbornik <strong>Obilasci</strong> bilo kada za reprizu ovoga, obilaska Alata ili Administratorskog obilaska."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Dobrodošli u Stirling PDF!"
|
||||
description = "Želite li brzu 1-minutnu turu kako biste naučili ključne značajke i kako započeti?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Preuzmi →"
|
||||
showMeAround = "Provedi me"
|
||||
skipTheTour = "Preskoči obilazak"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Pregled obilaska"
|
||||
body = "Stirling PDF V2 dolazi s desecima alata i osvježenim izgledom. Uzmite kratki obilazak da vidite što se promijenilo i gdje pronaći potrebne značajke."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Preskoči zasad"
|
||||
seePlans = "Pogledaj planove →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Nadogradi odmah →"
|
||||
freeTitle = "Poslužiteljska licenca"
|
||||
overLimitTitle = "Potrebna poslužiteljska licenca"
|
||||
overLimitBody = "Naše licenciranje dopušta do <strong>{{freeTierLimit}}</strong> korisnika besplatno po poslužitelju. Imate <strong>{{overLimitUserCopy}}</strong> Stirling korisnika. Za nesmetan nastavak, nadogradite na Stirling Server plan - <strong>neograničena mjesta</strong>, uređivanje teksta u PDF-u i puna admin kontrola za $99/server/mo."
|
||||
freeBody = "Naše <strong>Open-Core</strong> licenciranje dopušta do <strong>{{freeTierLimit}}</strong> korisnika besplatno po poslužitelju. Za nesmetano skaliranje i rani pristup našem novom <strong>alatu za uređivanje teksta u PDF-u</strong>, preporučujemo Stirling Server plan - potpuno uređivanje i <strong>neograničena mjesta</strong> za $99/server/mo."
|
||||
freeBody = "Naše licenciranje <strong>Open-Core</strong> omogućuje do <strong>{{freeTierLimit}}</strong> korisnika besplatno po poslužitelju. Za neometano skaliranje preporučujemo Stirling Server plan - <strong>neograničena mjesta</strong> i <strong>podrška za SSO</strong> za $99/poslužitelj/mj."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Preuzimanje"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Kontaktirajte prodaju"
|
||||
contactToUpgrade = "Kontaktirajte nas za nadogradnju ili prilagodbu vašeg plana"
|
||||
maxUsers = "Maks. korisnika"
|
||||
upTo = "Do"
|
||||
getLicense = "Nabavite serversku licencu"
|
||||
upgradeToEnterprise = "Nadogradite na Enterprise"
|
||||
selectPeriod = "Odaberite obračunsko razdoblje"
|
||||
monthlyBilling = "Mjesečno naplaćivanje"
|
||||
yearlyBilling = "Godišnje naplaćivanje"
|
||||
checkoutOpened = "Plaćanje otvoreno"
|
||||
checkoutInstructions = "Dovršite kupnju na Stripe kartici. Nakon plaćanja, vratite se ovamo i osvježite stranicu kako biste aktivirali licencu. Također ćete primiti e-poruku s licenčnim ključem."
|
||||
activateLicense = "Aktivirajte svoju licencu"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Plaćanje otvoreno u novoj kartici"
|
||||
instructions = "Dovršite kupnju na Stripe kartici. Nakon dovršenog plaćanja dobit ćete e-poruku s licenčnim ključem."
|
||||
enterKey = "Unesite svoj licenčni ključ u nastavku kako biste aktivirali plan:"
|
||||
keyDescription = "Zalijepite licenčni ključ iz e-poruke"
|
||||
activate = "Aktiviraj licencu"
|
||||
doLater = "Učinit ću to kasnije"
|
||||
success = "Licenca aktivirana!"
|
||||
successMessage = "Vaša licenca je uspješno aktivirana. Sada možete zatvoriti ovaj prozor."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Potrebna je verifikacija e-pošte"
|
||||
message = "Morat ćete verificirati svoju adresu e-pošte u Stripe portalu za naplatu. Provjerite e-poštu za poveznicu za prijavu."
|
||||
|
||||
[plan.period]
|
||||
month = "mjesec"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sustav revizije nije dostupan"
|
||||
notAvailableMessage = "Sustav revizije nije konfiguriran ili nije dostupan."
|
||||
disabled = "Revizijsko zapisivanje je onemogućeno"
|
||||
disabledMessage = "Omogućite revizijsko zapisivanje u konfiguraciji aplikacije kako biste pratili sustavne događaje."
|
||||
enterpriseRequired = "Potrebna je Enterprise licenca"
|
||||
enterpriseRequiredMessage = "Sustav zapisivanja revizije je Enterprise značajka. Nadogradite na Enterprise licencu za pristup revizijskim zapisima i analitici."
|
||||
|
||||
[audit.error]
|
||||
title = "Pogreška pri učitavanju sustava revizije"
|
||||
@@ -6370,7 +5942,6 @@ description = "Unesite puni URL svog self-hosted Stirling PDF poslužitelja"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Unesite URL poslužitelja"
|
||||
invalidUrl = "Neispravan format URL-a. Unesite valjani URL kao https://your-server.com"
|
||||
unreachable = "Nije moguće povezati se s poslužiteljem"
|
||||
testFailed = "Test veze nije uspio"
|
||||
configFetch = "Neuspjelo dohvaćanje konfiguracije poslužitelja. Provjerite URL i pokušajte ponovno."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Povezivanje na:"
|
||||
submit = "Prijava"
|
||||
signInWith = "Prijavite se pomoću"
|
||||
oauthPending = "Otvaranje preglednika za autentikaciju..."
|
||||
sso = "Jedinstvena prijava"
|
||||
orContinueWith = "Ili nastavite s e-poštom"
|
||||
serverRequirement = "Napomena: Poslužitelj mora imati omogućenu prijavu."
|
||||
showInstructions = "Kako omogućiti?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Stranica s odlomcima"
|
||||
sparse = "Rijedak tekst"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automatski"
|
||||
paragraph = "Odlomak"
|
||||
singleLine = "Jedan redak"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Poništi promjene"
|
||||
downloadJson = "Preuzmi JSON"
|
||||
generatePdf = "Generiraj PDF"
|
||||
saveChanges = "Spremi promjene"
|
||||
applyChanges = "Primijeni promjene"
|
||||
downloadCopy = "Preuzmi kopiju"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automatski skaliraj tekst kako bi stao u okvire"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Savjet: Držite Ctrl (Cmd) ili Shift za višestruki odabir
|
||||
title = "Zaključaj uređeni tekst u jedan PDF element"
|
||||
description = "Kad je omogućeno, uređivač izvozi svaki uređeni tekstualni okvir kao jedan PDF tekstni element kako bi se izbjeglo preklapanje glifova ili miješanje fontova."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Napredne postavke"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Ograničenja pregleda"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus na tekst i slike"
|
||||
text = "Ovaj radni prostor fokusira se na uređivanje teksta i premještanje ugrađenih slika. Složeni crteži stranica, obrazac widgeti i slojevita grafika čuvaju se za izvoz, ali ovdje nisu u potpunosti uređivi."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Varijacije pregleda"
|
||||
text = "Neki vizualni elementi (poput obruba tablica, oblika ili izgleda anotacija) možda se neće prikazati točno u pretpregledu. Izvezeni PDF čuva izvorne naredbe crtanja kad god je moguće."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha preglednik"
|
||||
text = "Ovaj alpha preglednik se još razvija—određeni fontovi, boje, efekti prozirnosti i detalji izgleda mogu se blago promijeniti. Prije dijeljenja provjerite generirani PDF."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Spoji odabrane okvire"
|
||||
merge = "Spoji odabir"
|
||||
@@ -6614,58 +6164,3 @@ title = "Rezultati dodavanja teksta"
|
||||
|
||||
[addText.error]
|
||||
failed = "Došlo je do pogreške pri dodavanju teksta u PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Otpremanje s mobitela"
|
||||
description = "Skenirajte za otpremu fotografija. Slike se automatski pretvaraju u PDF."
|
||||
descriptionNoConvert = "Skenirajte za otpremu fotografija s mobilnog uređaja."
|
||||
error = "Pogreška veze"
|
||||
pollingError = "Pogreška pri provjeri datoteka"
|
||||
sessionId = "ID sesije"
|
||||
sessionCreateError = "Neuspjelo stvaranje sesije"
|
||||
expiryWarning = "Uskoro istječe sesija"
|
||||
expiryWarningMessage = "Ovaj QR kod istječe za {{seconds}} sekundi. Novi kod će se automatski generirati."
|
||||
filesReceived = "Primljeno {{count}} datoteka"
|
||||
connected = "Mobilni uređaj povezan"
|
||||
instructions = "Skenirajte kamerom telefona. Slike se automatski pretvaraju u PDF."
|
||||
instructionsNoConvert = "Skenirajte kamerom telefona za otpremu datoteka."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobilni skener"
|
||||
noSession = "Neispravna sesija"
|
||||
noSessionMessage = "Skenirajte valjan QR kod za pristup ovoj stranici."
|
||||
validating = "Provjera sesije..."
|
||||
sessionInvalid = "Pogreška sesije"
|
||||
sessionExpired = "Ova sesija je istekla. Osvježite i pokušajte ponovno."
|
||||
sessionNotFound = "Sesija nije pronađena. Osvježite i pokušajte ponovno."
|
||||
sessionValidationError = "Nije moguće potvrditi sesiju. Pokušajte ponovno."
|
||||
uploadSuccess = "Otpremanje uspješno!"
|
||||
uploadSuccessMessage = "Vaše slike su prenesene."
|
||||
httpsRequired = "Pristup kameri zahtijeva HTTPS ili localhost. Upotrijebite HTTPS ili pristupite putem localhosta."
|
||||
uploadFailed = "Otpremanje nije uspjelo. Pokušajte ponovno."
|
||||
uploading = "Otpremanje..."
|
||||
connected = "Povezano"
|
||||
connecting = "Povezivanje..."
|
||||
chooseMethod = "Odaberite način otpremanja"
|
||||
chooseMethodDescription = "Odaberite kako želite skenirati i otpremiti dokumente"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Skenirajte dokumente kamerom uređaja s automatskim otkrivanjem rubova"
|
||||
fileUpload = "Otpremanje datoteka"
|
||||
fileDescription = "Otpremite postojeće fotografije ili dokumente s uređaja"
|
||||
cameraAccessDenied = "Pristup kameri je odbijen. Omogućite pristup kameri."
|
||||
back = "Natrag"
|
||||
settings = "Postavke"
|
||||
edgeDetection = "Otkrivanje rubova"
|
||||
flashlight = "Svjetiljka"
|
||||
flash = "Bljeskalica"
|
||||
processing = "Obrada..."
|
||||
capture = "Snimi fotografiju"
|
||||
selectFilesPrompt = "Odaberite datoteke za otpremu"
|
||||
selectImage = "Odaberi sliku"
|
||||
preview = "Pretpregled"
|
||||
retake = "Ponovo snimi"
|
||||
addToBatch = "Dodaj u grupu"
|
||||
upload = "Otpremi"
|
||||
batchImages = "Grupa"
|
||||
clearBatch = "Očisti"
|
||||
uploadAll = "Otpremi sve"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Mentetlen változtatásai vannak a PDF-en."
|
||||
pendingRedactionsTitle = "Nem alkalmazott kitakarások"
|
||||
pendingRedactions = "Vannak nem alkalmazott kitakarásai, amelyek el fognak veszni."
|
||||
areYouSure = "Biztosan elhagyja az oldalt?"
|
||||
unsavedChangesTitle = "Mentetlen változtatások"
|
||||
keepWorking = "Munka folytatása"
|
||||
discardChanges = "Elvetés és kilépés"
|
||||
discardRedactions = "Elvetés és kilépés"
|
||||
applyAndContinue = "Mentés és kilépés"
|
||||
exportAndContinue = "Exportálás és folytatás"
|
||||
cancel = "Mégse"
|
||||
@@ -343,10 +340,6 @@ advance = "Haladó"
|
||||
edit = "Megtekintés és szerkesztés"
|
||||
popular = "Népszerű"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Beállítások"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Speciális"
|
||||
title = "Biztonság és hitelesítés"
|
||||
security = "Biztonság"
|
||||
connections = "Kapcsolatok"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licencelés és analitika"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Jelenlegi verzió"
|
||||
latestVersion = "Legújabb verzió"
|
||||
checkForUpdates = "Frissítések keresése"
|
||||
viewDetails = "Részletek megtekintése"
|
||||
serverNeedsUpdate = "A szervert az adminisztrátornak frissítenie kell"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Verzióinformációk"
|
||||
description = "Asztali és szerververzió adatai"
|
||||
desktop = "Asztali verzió"
|
||||
server = "Szerververzió"
|
||||
|
||||
[settings.security]
|
||||
title = "Biztonság"
|
||||
description = "Frissítse jelszavát fiókja biztonságáért."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Jelszó módosítása. A frissítés után ki lesz jelentkeztetve."
|
||||
required = "Minden mező kitöltése kötelező."
|
||||
mismatch = "Az új jelszavak nem egyeznek."
|
||||
error = "Nem sikerült frissíteni a jelszót. Ellenőrizze jelenlegi jelszavát, és próbálja újra."
|
||||
success = "A jelszó sikeresen frissült. Jelentkezzen be újra."
|
||||
ssoDisabled = "A jelszóváltoztatást az identitásszolgáltató kezeli."
|
||||
current = "Jelenlegi jelszó"
|
||||
currentPlaceholder = "Adja meg jelenlegi jelszavát"
|
||||
new = "Új jelszó"
|
||||
newPlaceholder = "Adjon meg egy új jelszót"
|
||||
confirm = "Új jelszó megerősítése"
|
||||
confirmPlaceholder = "Írja be újra az új jelszót"
|
||||
update = "Jelszó frissítése"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Billentyűparancsok"
|
||||
@@ -522,16 +488,11 @@ low = "Alacsony"
|
||||
title = "Hitelesítési adatok módosítása"
|
||||
header = "Fiókadatok frissítése"
|
||||
changePassword = "Az alapértelmezett bejelentkezési adatokat használja. Kérjük, adjon meg új jelszót"
|
||||
ssoManaged = "Fiókját az identitásszolgáltató kezeli."
|
||||
newUsername = "Új felhasználónév"
|
||||
oldPassword = "Jelenlegi jelszó"
|
||||
newPassword = "Új jelszó"
|
||||
confirmNewPassword = "Új jelszó megerősítése"
|
||||
submit = "Változtatások mentése"
|
||||
credsUpdated = "Fiók frissítve"
|
||||
description = "A módosítások mentve. Kérjük, jelentkezzen be újra."
|
||||
error = "Nem sikerült frissíteni a felhasználónevet. Ellenőrizze a jelszavát, és próbálja újra."
|
||||
changeUsername = "Felhasználónév frissítése. A frissítés után ki lesz jelentkeztetve."
|
||||
|
||||
[account]
|
||||
title = "Fiókbeállítások"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Fiókbeállítások"
|
||||
adminSettings = "Rendszergazdai beállítások - Felhasználók kezelése"
|
||||
userControlSettings = "Felhasználói jogosultságok"
|
||||
changeUsername = "Felhasználónév módosítása"
|
||||
changeUsernameDescription = "Felhasználónév frissítése. A frissítés után ki lesz jelentkeztetve."
|
||||
newUsernamePlaceholder = "Adja meg az új felhasználónevét"
|
||||
newUsername = "Új felhasználónév"
|
||||
password = "Jelszó megerősítése"
|
||||
oldPassword = "Régi jelszó"
|
||||
@@ -749,11 +708,6 @@ tags = "aláírás,szignó"
|
||||
title = "Aláírás"
|
||||
desc = "Aláírás hozzáadása PDF-hez rajzolással, szöveggel vagy képpel"
|
||||
|
||||
[home.annotate]
|
||||
tags = "jegyzetelés,kiemelés,rajzolás"
|
||||
title = "Jegyzetelés"
|
||||
desc = "Kiemelés, rajzolás, jegyzetek és alakzatok hozzáadása a megjelenítőben"
|
||||
|
||||
[home.flatten]
|
||||
tags = "egyszerűsít,eltávolít,interaktív"
|
||||
title = "Lapítás"
|
||||
@@ -965,7 +919,7 @@ title = "PDF-ek egymásra helyezése"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF szövegszerkesztő"
|
||||
desc = "Nézze át és szerkessze a Stirling PDF JSON exportokat csoportosított szövegszerkesztéssel és PDF-újragenerálással"
|
||||
desc = "Meglévő szöveg és képek szerkesztése a PDF-ekben"
|
||||
|
||||
[home.addText]
|
||||
tags = "szöveg, megjegyzés, címke"
|
||||
@@ -976,7 +930,6 @@ desc = "Tetszőleges szöveg hozzáadása bárhová a PDF-ben"
|
||||
addFiles = "Fájlok hozzáadása"
|
||||
uploadFromComputer = "Feltöltés a számítógépről"
|
||||
openFromComputer = "Megnyitás a gépről"
|
||||
mobileUpload = "Feltöltés mobilról"
|
||||
|
||||
[viewPdf]
|
||||
tags = "megtekintés,olvasás,jegyzetelés,szöveg,kép"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ to PDF beállítások"
|
||||
optimizeForEbook = "PDF optimalizálása e-könyv olvasókhoz (Ghostscript használatával)"
|
||||
cbzOutputOptions = "PDF to CBZ beállítások"
|
||||
cbzDpi = "DPI a képrendereléshez"
|
||||
cbrOptions = "CBR beállítások"
|
||||
cbrOutputOptions = "PDF → CBR beállítások"
|
||||
cbrDpi = "DPI a képrendereléshez"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "E-könyv → PDF beállítások"
|
||||
ebookOptionsDesc = "E-könyvek PDF-be konvertálásának beállításai"
|
||||
embedAllFonts = "Összes betűtípus beágyazása"
|
||||
embedAllFontsDesc = "Az e-könyv összes betűtípusának beágyazása a létrehozott PDF-be"
|
||||
includeTableOfContents = "Tartalomjegyzék hozzáadása"
|
||||
includeTableOfContentsDesc = "Létrehozott tartalomjegyzék hozzáadása a kész PDF-hez"
|
||||
includePageNumbers = "Oldalszámok hozzáadása"
|
||||
includePageNumbersDesc = "Oldalszámok hozzáadása a létrehozott PDF-hez"
|
||||
optimizeForEbookPdf = "Optimalizálás e-könyv olvasókhoz"
|
||||
optimizeForEbookPdfDesc = "A PDF optimalizálása e-könyv olvasáshoz (kisebb fájlméret, jobb megjelenítés e-ink eszközökön)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF → e-könyv beállítások"
|
||||
epubOptionsDesc = "Beállítások PDF EPUB/AZW3 formátumba konvertálásához"
|
||||
detectChapters = "Fejezetek felismerése"
|
||||
detectChaptersDesc = "A fejezeteknek tűnő címsorok felismerése és EPUB oldaltörések beszúrása"
|
||||
targetDevice = "Cél eszköz"
|
||||
targetDeviceDesc = "A felhasználói eszközhöz optimalizált kimeneti profil kiválasztása"
|
||||
outputFormat = "Kimeneti formátum"
|
||||
outputFormatDesc = "Válassza ki az e-könyv kimeneti formátumát"
|
||||
tabletPhone = "Tablet/Telefon (képekkel)"
|
||||
kindleEink = "Kindle e-Ink (szöveghez optimalizált)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konverzió,kép,jpg,fotó,fénykép"
|
||||
@@ -1435,11 +1361,6 @@ header = "Mellékletek hozzáadása"
|
||||
add = "Melléklet hozzáadása"
|
||||
remove = "Melléklet eltávolítása"
|
||||
embed = "Melléklet beágyazása"
|
||||
convertToPdfA3b = "Átalakítás PDF/A-3b formátumba"
|
||||
convertToPdfA3bDescription = "Beágyazott mellékleteket tartalmazó archiválási PDF-et hoz létre"
|
||||
convertToPdfA3bTooltip = "A PDF/A-3b egy archiválási formátum, amely biztosítja a hosszú távú megőrzést. Lehetővé teszi tetszőleges fájlformátumok mellékletként történő beágyazását. Az átalakításhoz Ghostscript szükséges, és nagy fájloknál hosszabb ideig tarthat."
|
||||
convertToPdfA3bTooltipHeader = "A PDF/A-3b átalakításról"
|
||||
convertToPdfA3bTooltipTitle = "Mit csinál"
|
||||
submit = "Csatolmányok hozzáadása a PDF-hez"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Mentett"
|
||||
label = "Aláíráskép feltöltése"
|
||||
placeholder = "Képfájl kiválasztása"
|
||||
hint = "Töltse fel az aláírását tartalmazó PNG vagy JPG képet"
|
||||
removeBackground = "Fehér háttér eltávolítása (átlátszóvá tétel)"
|
||||
processing = "Kép feldolgozása..."
|
||||
backgroundRemovalFailedTitle = "A háttér eltávolítása nem sikerült"
|
||||
backgroundRemovalFailedMessage = "Nem sikerült eltávolítani a háttért a képről. Az eredeti képet használjuk helyette."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Hogyan adjon hozzá aláírást"
|
||||
@@ -2434,11 +2351,6 @@ note = "A lapítás eltávolítja az interaktív elemeket a PDF-ből, így azok
|
||||
label = "Csak űrlapok lapítása"
|
||||
desc = "Csak az űrlapmezők lapítása, a többi interaktív elem változatlanul marad"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Renderelési DPI (nem kötelező, ajánlott 150 DPI)"
|
||||
help = "Hagyja üresen a rendszer alapértékének használatához. A magasabb DPI élesebb kimenetet ad, de növeli a feldolgozási időt és a fájlméretet."
|
||||
placeholder = "pl. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Lapítás eredménye"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "PDF vágása"
|
||||
submit = "Küldés"
|
||||
noFileSelected = "Válasszon egy PDF-fájlt a vágás megkezdéséhez"
|
||||
reset = "Visszaállítás teljes PDF-re"
|
||||
autoCrop = "Üres terület automatikus levágása"
|
||||
|
||||
[crop.preview]
|
||||
title = "Vágási terület kiválasztása"
|
||||
@@ -3244,7 +3155,6 @@ title = "Kitakarási mód"
|
||||
mode = "Mód"
|
||||
automatic = "Automatikus"
|
||||
automaticDesc = "Szöveg kitakarása keresési feltételek alapján"
|
||||
automaticDisabledTooltip = "Válasszon fájlokat a fájlkezelőben több fájl egyidejű kitakarásához"
|
||||
manual = "Kézi"
|
||||
manualDesc = "Kattintson és húzza a kitakarni kívánt terület kijelöléséhez"
|
||||
manualComingSoon = "A kézi kitakarás hamarosan elérhető"
|
||||
@@ -3315,35 +3225,8 @@ text = "Csak a teljes szavakat illeszti, nem részleges egyezéseket. Engedélye
|
||||
title = "Konvertálás PDF-Image formátumra"
|
||||
text = "A kitakarás után a PDF-et képalapú PDF-fé alakítja. Ez biztosítja, hogy a kitakaró dobozok mögötti szöveg teljesen eltávolításra kerüljön és ne legyen visszaállítható."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Kézi kitakarás vezérlők"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Szöveg megjelölő eszköz"
|
||||
text = "Jelöljön meg közvetlenül szöveget a PDF-en kitakarásra. Kattintson és húzza a kívánt szöveg kiemeléséhez, amelyet ki szeretne takarni."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Terület megjelölő eszköz"
|
||||
text = "Rajzoljon téglalap alakú területeket a PDF-re a kitakarandó régiók megjelöléséhez. Hasznos képek, aláírások vagy szabálytalan alakzatok kitakarásához."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Kitakarások alkalmazása"
|
||||
text = "A tartalom megjelölése után kattintson az 'Alkalmazás' gombra az összes megjelölt terület végleges kitakarásához. A függőben lévő szám jelzi, hány kitakarás vár alkalmazásra."
|
||||
bullet1 = "Alkalmazás előtt annyi területet jelölhet meg, amennyit szükséges"
|
||||
bullet2 = "Minden függőben lévő kitakarás egyszerre kerül alkalmazásra"
|
||||
bullet3 = "A kitakarások alkalmazás után nem vonhatók vissza"
|
||||
|
||||
[redact.manual]
|
||||
title = "Kitakaró eszközök"
|
||||
instructions = "Jelöljön meg szöveget vagy rajzoljon területeket a PDF-en a kitakarandó tartalom megjelöléséhez."
|
||||
markText = "Szöveg megjelölése"
|
||||
markArea = "Terület megjelölése"
|
||||
pendingLabel = "Függőben:"
|
||||
applyWarning = "⚠️ Végleges alkalmazás, nem vonható vissza, és az alatta lévő adatok törlődnek"
|
||||
apply = "Alkalmazás"
|
||||
noMarks = "Nincsenek kitakarási jelölések. Használja a fenti eszközöket a tartalom kitakarásra jelöléséhez."
|
||||
header = "Kézi kitakarás"
|
||||
controlsTitle = "Kézi kitakarás vezérlők"
|
||||
textBasedRedaction = "Szöveg alapú kitakarás"
|
||||
pageBasedRedaction = "Oldal alapú kitakarás"
|
||||
convertPDFToImageLabel = "PDF konvertálása PDF-Image formátumra (a doboz mögötti szöveg eltávolításához)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Adja meg a vízszintes felosztások számát"
|
||||
label = "Függőleges felosztások"
|
||||
placeholder = "Adja meg a függőleges felosztások számát"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Felosztási mód"
|
||||
description = "Válassza ki, hogyan ossza fel az oldalakat"
|
||||
splitAll = "Összes oldal felosztása"
|
||||
splitAllExceptFirst = "Összes oldal felosztása az első kivételével"
|
||||
splitAllExceptLast = "Összes oldal felosztása az utolsó kivételével"
|
||||
splitAllExceptFirstAndLast = "Összes oldal felosztása az első és az utolsó kivételével"
|
||||
custom = "Egyéni oldalak"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Egyéni oldalszámok"
|
||||
placeholder = "pl. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Pecsét,Kép hozzáadása,középre igazítás,Vízjel,PDF,Beágyazás,Testreszabás"
|
||||
header = "PDF pecsételése"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Fájlméret"
|
||||
[compress.grayscale]
|
||||
label = "Szürkeárnyalatok alkalmazása tömörítéshez"
|
||||
|
||||
[compress.linearize]
|
||||
label = "PDF linearizálása a gyors webes megjelenítéshez"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Képek átalakítása vonalrajzzá"
|
||||
description = "ImageMagick használata az oldalak nagy kontrasztú fekete-fehérré alakításához a maximális méretcsökkentés érdekében."
|
||||
unavailable = "Az ImageMagick nincs telepítve vagy engedélyezve ezen a szerveren"
|
||||
detailLevel = "Részletesség"
|
||||
edgeEmphasis = "Élkiemelés"
|
||||
edgeLow = "Enyhe"
|
||||
edgeMedium = "Kiegyensúlyozott"
|
||||
edgeHigh = "Erős"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Tömörítési beállítások áttekintése"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Magasabb értékek csökkentik a fájlméretet"
|
||||
title = "Szürkeárnyalatos"
|
||||
text = "Válassza ezt az opciót az összes kép fekete-fehérre konvertálásához, ami jelentősen csökkentheti a fájlméretet, különösen beszkennelt PDF-eknél vagy képekkel teli dokumentumoknál."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Vonalrajz"
|
||||
text = "Az oldalak átalakítása nagy kontrasztú fekete-fehérré az ImageMagick segítségével. A Részletességgel szabályozhatja, mennyi tartalom váljon feketévé, az Élkiemeléssel pedig, mennyire agresszíven történjen az élek felismerése."
|
||||
|
||||
[compress.error]
|
||||
failed = "Hiba történt a PDF tömörítése közben."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Hiba történt a PDF tömörítése közben."
|
||||
_value = "Tömörítési beállítások"
|
||||
1 = "1-3 PDF tömörítés,</br> 4-6 enyhe kép tömörítés,</br> 7-9 intenzív kép tömörítés Jelentősen csökkenti a kép minőségét"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Az alacsonyabb értékek megőrzik a minőséget, de nagyobb fájlméretet eredményeznek"
|
||||
range4to6 = "Közepes tömörítés mérsékelt minőségromlással"
|
||||
range7to9 = "A magasabb értékek jelentősen csökkentik a fájlméretet, de csökkenthetik a képélességet"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Ez a fájl jelszóval védett. Kérjük, adja meg a jelszót:"
|
||||
cancelled = "Művelet megszakítva a PDF-nél: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Kijelölt oldalak törlése"
|
||||
closePdf = "PDF bezárása"
|
||||
exportAll = "PDF exportálása"
|
||||
downloadSelected = "Kijelölt fájlok letöltése"
|
||||
annotations = "Jegyzetek"
|
||||
exportSelected = "Kijelölt oldalak exportálása"
|
||||
saveChanges = "Változtatások mentése"
|
||||
downloadAll = "Összes letöltése"
|
||||
saveAll = "Összes mentése"
|
||||
toggleTheme = "Téma váltása"
|
||||
toggleBookmarks = "Könyvjelzők megjelenítése/elrejtése"
|
||||
language = "Nyelv"
|
||||
toggleAnnotations = "Jegyzetek láthatóságának váltása"
|
||||
search = "PDF keresése"
|
||||
panMode = "Pásztázó mód"
|
||||
applyRedactionsFirst = "Előbb alkalmazza a kitakarásokat"
|
||||
rotateLeft = "Forgatás balra"
|
||||
rotateRight = "Forgatás jobbra"
|
||||
toggleSidebar = "Oldalsáv ki/be"
|
||||
toggleBookmarks = "Könyvjelzők megjelenítése/elrejtése"
|
||||
exportSelected = "Kijelölt oldalak exportálása"
|
||||
toggleAnnotations = "Jegyzetek láthatóságának váltása"
|
||||
annotationMode = "Jegyzetelési mód váltása"
|
||||
print = "PDF nyomtatása"
|
||||
draw = "Rajzolás"
|
||||
redact = "Kitakarás"
|
||||
exitRedaction = "Kilépés a kitakarás módból"
|
||||
save = "Mentés"
|
||||
downloadAll = "Összes letöltése"
|
||||
saveAll = "Összes mentése"
|
||||
|
||||
[textAlign]
|
||||
left = "Balra"
|
||||
center = "Középre"
|
||||
right = "Jobbra"
|
||||
|
||||
[annotation]
|
||||
title = "Jegyzetelés"
|
||||
desc = "Használjon kiemelést, tollat, szöveget és jegyzeteket. A változások élők maradnak — nincs szükség lapításra."
|
||||
highlight = "Kiemelés"
|
||||
pen = "Toll"
|
||||
text = "Szövegdoboz"
|
||||
note = "Jegyzet"
|
||||
rectangle = "Téglalap"
|
||||
ellipse = "Ellipszis"
|
||||
select = "Kijelölés"
|
||||
exit = "Kilépés a jegyzetelésből"
|
||||
strokeWidth = "Vonalvastagság"
|
||||
opacity = "Átlátszóság"
|
||||
strokeOpacity = "Körvonal átlátszósága"
|
||||
fillOpacity = "Kitöltés átlátszósága"
|
||||
fontSize = "Betűméret"
|
||||
chooseColor = "Szín kiválasztása"
|
||||
color = "Szín"
|
||||
strokeColor = "Körvonal színe"
|
||||
fillColor = "Kitöltés színe"
|
||||
underline = "Aláhúzás"
|
||||
strikeout = "Áthúzás"
|
||||
squiggly = "Hullámos aláhúzás"
|
||||
inkHighlighter = "Szabadkézi kiemelő"
|
||||
freehandHighlighter = "Szabadkézi kiemelő"
|
||||
square = "Négyzet"
|
||||
circle = "Kör"
|
||||
polygon = "Sokszög"
|
||||
line = "Vonal"
|
||||
stamp = "Kép hozzáadása"
|
||||
textMarkup = "Szövegkiemelés"
|
||||
drawing = "Rajz"
|
||||
shapes = "Alakzatok"
|
||||
notesStamps = "Jegyzetek és bélyegek"
|
||||
settings = "Beállítások"
|
||||
borderOn = "Szegély: be"
|
||||
borderOff = "Szegély: ki"
|
||||
editInk = "Toll szerkesztése"
|
||||
editLine = "Vonal szerkesztése"
|
||||
editNote = "Jegyzet szerkesztése"
|
||||
editText = "Szövegdoboz szerkesztése"
|
||||
editTextMarkup = "Szövegkiemelés szerkesztése"
|
||||
editSelected = "Jegyzet szerkesztése"
|
||||
editSquare = "Négyzet szerkesztése"
|
||||
editCircle = "Kör szerkesztése"
|
||||
editPolygon = "Sokszög szerkesztése"
|
||||
unsupportedType = "Ennek a jegyzettípusnak a szerkesztése nem teljes körűen támogatott."
|
||||
textAlignment = "Szöveg igazítása"
|
||||
noteIcon = "Jegyzet ikonja"
|
||||
imagePreview = "Előnézet"
|
||||
contents = "Szöveg"
|
||||
backgroundColor = "Háttérszín"
|
||||
clearBackground = "Háttér eltávolítása"
|
||||
noBackground = "Nincs háttér"
|
||||
stampSettings = "Bélyeg beállításai"
|
||||
savingCopy = "Letöltés előkészítése..."
|
||||
saveFailed = "Nem sikerült a másolat mentése"
|
||||
saveReady = "Letöltés kész"
|
||||
selectAndMove = "Kijelölés és szerkesztés"
|
||||
editSelectDescription = "Kattintson egy meglévő jegyzetre a szín, átlátszóság, szöveg vagy méret szerkesztéséhez."
|
||||
editStampHint = "A kép módosításához törölje ezt a bélyeget, és adjon hozzá újat."
|
||||
editSwitchToSelect = "Váltson Kijelölés és szerkesztés módra ennek a jegyzetnek a szerkesztéséhez."
|
||||
undo = "Visszavonás"
|
||||
redo = "Újra"
|
||||
applyChanges = "Változtatások alkalmazása"
|
||||
saveChanges = "Változtatások mentése"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Beáll."
|
||||
adminSettings = "Admin beáll."
|
||||
allTools = "All Tools"
|
||||
reader = "Olvasó"
|
||||
tours = "Bemutatók"
|
||||
showMeAround = "Vezessen körbe"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Itt nézhet bemutatókat: Eszköztúra, új V2 elrendezés túra és Admin túra."
|
||||
user = "Itt nézhet bemutatókat: Eszköztúra és az új V2 elrendezés túra."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Eszköztúra"
|
||||
toolsTourDesc = "Ismerje meg, mire képesek az eszközök"
|
||||
adminTour = "Admin túra"
|
||||
adminTourDesc = "Fedezze fel az admin beállításokat és funkciókat"
|
||||
whatsNewTour = "Nézze meg, mi új a V2-ben"
|
||||
whatsNewTourDesc = "A frissített elrendezés bejárása"
|
||||
|
||||
[admin]
|
||||
error = "Hiba"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "A beállítások betöltése sikertelen"
|
||||
saveError = "A beállítások mentése sikertelen"
|
||||
saved = "A beállítások sikeresen mentve"
|
||||
saveSuccess = "A beállítások sikeresen mentve"
|
||||
success = "A beállítások sikeresen mentve"
|
||||
error = "Nem sikerült menteni a beállításokat"
|
||||
save = "Változtatások mentése"
|
||||
discard = "Elvetés"
|
||||
restartRequired = "Újraindítás szükséges"
|
||||
@@ -4422,13 +4185,6 @@ description = "A WeasyPrint futtatható állomány elérési útja HTML–PDF á
|
||||
label = "Unoconvert futtatható állomány"
|
||||
description = "Elérési út a LibreOffice unoconverthez dokumentumkonverziókhoz (hagyja üresen az alapértelmezettért: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "A frontend alap URL-je (pl. https://pdf.example.com). E-mail meghívó linkekhez és mobil QR-kódos feltöltésekhez használjuk. Hagyja üresen a backend URL használatához."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Kattintson a csomag részleteihez"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Biztonság"
|
||||
description = "Hitelesítés, bejelentkezési viselkedés és biztonsági házirendek beállítása."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Csatlakozás"
|
||||
disconnect = "Leválasztás"
|
||||
disconnected = "A szolgáltató sikeresen leválasztva"
|
||||
disconnectError = "A szolgáltató leválasztása nem sikerült"
|
||||
mobileScannerConvertToPdf = "Képek átalakítása PDF-be"
|
||||
mobileScannerConvertToPdfDesc = "A feltöltött képek automatikus PDF-formátumba konvertálása. Kikapcsolva a képek változatlanok maradnak."
|
||||
mobileScannerImageResolution = "Képfelbontás"
|
||||
mobileScannerImageResolutionDesc = "A feltöltött képek felbontása. A „Csökkentett” legfeljebb 1200 px-re méretezi a képeket a fájlméret csökkentése érdekében."
|
||||
imageResolutionFull = "Teljes (eredeti méret)"
|
||||
imageResolutionReduced = "Csökkentett (max. 1200 px)"
|
||||
mobileScannerPageFormat = "Oldalformátum"
|
||||
mobileScannerPageFormatDesc = "A konvertált képek PDF-oldalmérete. A „Megtartás” az eredeti képméreteket használja."
|
||||
pageFormatKeep = "Megtartás (eredeti méretek)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 hüvelyk)"
|
||||
mobileScannerStretchToFit = "Kitöltésre nyújtás"
|
||||
mobileScannerStretchToFitDesc = "A képek nyújtása az egész oldal kitöltéséhez. Kikapcsolva a képek középre igazítva, megtartott képaránnyal jelennek meg."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO automatikus bejelentkezés"
|
||||
@@ -4646,122 +4389,6 @@ description = "Felhasználói fiókok automatikus létrehozása az első SAML2 b
|
||||
label = "Regisztráció letiltása"
|
||||
description = "Új felhasználói regisztráció megakadályozása SAML2-n keresztül"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Mobiltelefonos feltöltés"
|
||||
enable = "QR-kódos feltöltés engedélyezése"
|
||||
description = "Engedélyezze, hogy a felhasználók QR-kód beolvasásával mobil eszközről töltsenek fel fájlokat"
|
||||
note = "Megjegyzés: A Frontend URL beállítása szükséges. "
|
||||
link = "Beállítás a rendszerbeállításokban"
|
||||
mobileScannerConvertToPdf = "Képek átalakítása PDF-be"
|
||||
mobileScannerConvertToPdfDesc = "A feltöltött képek automatikus PDF-formátumba konvertálása. Kikapcsolva a képek változatlanok maradnak."
|
||||
mobileScannerImageResolution = "Képfelbontás"
|
||||
mobileScannerImageResolutionDesc = "A feltöltött képek felbontása. A „Csökkentett” legfeljebb 1200 px-re méretezi a képeket a fájlméret csökkentése érdekében."
|
||||
imageResolutionFull = "Teljes (eredeti méret)"
|
||||
imageResolutionReduced = "Csökkentett (max. 1200 px)"
|
||||
mobileScannerPageFormat = "Oldalformátum"
|
||||
mobileScannerPageFormatDesc = "A konvertált képek PDF-oldalmérete. A „Megtartás” az eredeti képméreteket használja."
|
||||
pageFormatKeep = "Megtartás (eredeti méretek)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 hüvelyk)"
|
||||
mobileScannerStretchToFit = "Kitöltésre nyújtás"
|
||||
mobileScannerStretchToFitDesc = "A képek nyújtása az egész oldal kitöltéséhez. Kikapcsolva a képek középre igazítva, megtartott képaránnyal jelennek meg."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram bot"
|
||||
description = "A Telegram bot csatlakozásának, hozzáférésének és visszajelzési viselkedésének konfigurálása."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram bot engedélyezése"
|
||||
description = "Lehetővé teszi a felhasználóknak a Stirling PDF használatát a beállított Telegram botján keresztül."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot felhasználónév"
|
||||
description = "A Telegram bot nyilvános felhasználóneve."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot token"
|
||||
description = "A BotFather által biztosított API token a Telegram bothoz."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Bejövő mappa"
|
||||
description = "A pipeline könyvtár alatti mappa, ahová a beérkező Telegram fájlok kerülnek."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Egyedi mappautótag használata"
|
||||
description = "A csevegés azonosítójának hozzáfűzése a bejövő fájlmappákhoz, hogy csevegésenként elkülönüljenek a feltöltések."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Hozzáférés-szabályozás"
|
||||
description = "Korlátozza, mely felhasználók vagy csatornák léphetnek kapcsolatba a bottal."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Csak megadott felhasználóazonosítók engedélyezése"
|
||||
description = "Bekapcsolva csak a listában szereplő felhasználóazonosítók használhatják a botot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Engedélyezett felhasználóazonosítók"
|
||||
description = "Adja meg a Telegram felhasználóazonosítókat, akik használhatják a botot."
|
||||
placeholder = "Adjon hozzá azonosítót és nyomja meg az entert"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Csak megadott csatornaazonosítók engedélyezése"
|
||||
description = "Bekapcsolva csak a listában szereplő csatornaazonosítók használhatják a botot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Engedélyezett csatornaazonosítók"
|
||||
description = "Adja meg a Telegram csatornaazonosítókat, amelyek használhatják a botot."
|
||||
placeholder = "Adjon hozzá csatornaazonosítót és nyomja meg az entert"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Feldolgozás"
|
||||
description = "A lekérdezési időközök és időkorlátok szabályozása a Telegram feltöltésekhez."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Feldolgozási időkorlát (másodperc)"
|
||||
description = "Maximális várakozási idő egy feldolgozási feladatra hiba jelentése előtt."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Lekérdezési időköz (ms)"
|
||||
description = "Az új Telegram frissítések ellenőrzései közti időköz."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Visszajelzések"
|
||||
description = "Válassza ki, mikor küldjön a bot visszajelzést a felhasználóknak és csatornáknak."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Visszajelzések engedélyezése"
|
||||
description = "Szabályozza, küld-e a bot egyáltalán visszajelzéseket."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Csatorna visszajelzési szabályok"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "„Nincs érvényes dokumentum” megjelenítése (csatorna)"
|
||||
description = "A „nincs érvényes dokumentum” válasz elnyomása csatorna feltöltéseknél."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Feldolgozási hibák megjelenítése (csatorna)"
|
||||
description = "Feldolgozási hibaüzenetek küldése csatornáknak."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Hibaüzenetek megjelenítése (csatorna)"
|
||||
description = "Részletes hibaüzenetek megjelenítése csatornák számára."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Felhasználói visszajelzési szabályok"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "„Nincs érvényes dokumentum” megjelenítése (felhasználó)"
|
||||
description = "A „nincs érvényes dokumentum” válasz elnyomása felhasználói feltöltéseknél."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Feldolgozási hibák megjelenítése (felhasználó)"
|
||||
description = "Feldolgozási hibaüzenetek küldése felhasználóknak."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Hibaüzenetek megjelenítése (felhasználó)"
|
||||
description = "Részletes hibaüzenetek megjelenítése felhasználók számára."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Adatbázis"
|
||||
description = "Egyéni adatbázis-kapcsolati beállítások konfigurálása vállalati telepítésekhez."
|
||||
@@ -4943,10 +4570,6 @@ description = "Az adminok e-mailben hívhatnak meg felhasználókat automatikusa
|
||||
label = "Frontend URL"
|
||||
description = "Alap URL a frontendhez (pl. https://pdf.example.com). E-mailekben a meghívó linkek generálásához használatos. Hagyja üresen a backend URL használatához."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Megjegyzés: A Frontend URL beállítása szükséges. "
|
||||
link = "Beállítás a rendszerbeállításokban"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Jogi dokumentumok"
|
||||
description = "Hivatkozások beállítása jogi dokumentumokra és szabályzatokra."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Saját fájlok"
|
||||
noRecentFiles = "Nem találhatók legutóbbi fájlok"
|
||||
googleDriveNotAvailable = "Google Drive integráció nem érhető el"
|
||||
mobileUpload = "Mobil feltöltés"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "A mobil feltöltés nincs engedélyezve"
|
||||
downloadSelected = "Kiválasztott letöltése"
|
||||
saveSelected = "Kijelöltek mentése"
|
||||
openFiles = "Fájlok megnyitása"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Betöltés..."
|
||||
back = "Vissza"
|
||||
continue = "Folytatás"
|
||||
error = "Hiba"
|
||||
save = "Mentés"
|
||||
|
||||
[config.overview]
|
||||
title = "Alkalmazás konfigurációja"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Minden olyan alkalmazás vagy szolgáltatás, amely jelenleg ezeket a
|
||||
confirmPrompt = "Biztosan folytatja?"
|
||||
confirmCta = "Kulcsok frissítése"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API‑kulcs hiba"
|
||||
failedToCreateApiKey = "Nem sikerült létrehozni az API‑kulcsot."
|
||||
failedToRetrieveApiKey = "Nem sikerült lekérni az API‑kulcsot a válaszból."
|
||||
failedToFetchApiKey = "Nem sikerült lekérni az API‑kulcsot."
|
||||
apiKeyRefreshed = "API‑kulcs frissítve"
|
||||
apiKeyRefreshedBody = "Az API‑kulcsát sikeresen frissítettük."
|
||||
failedToRefreshApiKey = "Nem sikerült frissíteni az API‑kulcsot."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Mellékletek kiválasztása"
|
||||
info = "Válassza ki azokat a fájlokat, amelyeket a PDF-hez szeretne csatolni. Ezek a fájlok beágyazásra kerülnek, és a PDF mellékletpaneljén keresztül lesznek elérhetők."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Befejezés"
|
||||
startTour = "Túra indítása"
|
||||
startTourDescription = "Vezetett túra a Stirling PDF fő funkcióiról"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Kezdje a <strong>Gyors elérés</strong> sávval, hogy a Megjelenítő, az Automatizálás, a fájlok és az összes bemutató között váltson."
|
||||
leftPanel = "A bal oldali <strong>Eszközök</strong> panelen minden elérhető funkciót megtalál. Böngésszen kategóriák szerint vagy keressen gyors eszközválasztáshoz."
|
||||
fileUpload = "A <strong>Fájlok</strong> gombbal töltsön fel vagy válasszon egy nemrég megnyitott PDF-et. Betöltünk egy mintát, hogy lássa a munkaterületet."
|
||||
rightRail = "A <strong>jobb oldali sáv</strong> gyors műveleteket tartalmaz a fájlválasztáshoz, a téma vagy nyelv módosításához és az eredmények letöltéséhez."
|
||||
topBar = "A felső sávban válthat a <strong>Megjelenítő</strong>, az <strong>Oldalszerkesztő</strong> és az <strong>Aktív fájlok</strong> között."
|
||||
pageEditorView = "Váltson az Oldalszerkesztőre az oldalak átrendezéséhez, forgatásához vagy törléséhez."
|
||||
activeFilesView = "Az Aktív fájlokban láthat mindent, ami meg van nyitva, és kiválaszthatja, min dolgozik."
|
||||
wrapUp = "Ez az, ami újdonság a V2-ben. Nyissa meg bármikor a <strong>Bemutatók</strong> menüt ennek, az Eszköztúrának vagy az Admin túrának az újra lejátszásához."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Üdvözli a Stirling PDF!"
|
||||
description = "Szeretne egy gyors, 1 perces túrát, hogy megismerje a fő funkciókat és a kezdést?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Letöltés →"
|
||||
showMeAround = "Körbevezetés"
|
||||
skipTheTour = "Körbevezetés kihagyása"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Bemutató áttekintése"
|
||||
body = "A Stirling PDF V2 tucatnyi eszközzel és megújult elrendezéssel érkezik. Tegyen egy gyors túrát, hogy lássa, mi változott és hol találja a szükséges funkciókat."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Kihagyás most"
|
||||
seePlans = "Csomagok megtekintése →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Frissítés most →"
|
||||
freeTitle = "Szerverlicenc"
|
||||
overLimitTitle = "Szerverlicenc szükséges"
|
||||
overLimitBody = "Licencelésünk szerverenként legfeljebb <strong>{{freeTierLimit}}</strong> felhasználót enged ingyen. Önnek <strong>{{overLimitUserCopy}}</strong> Stirling felhasználója van. A zavartalan használathoz váltson a Stirling Server csomagra – <strong>korlátlan hely</strong>, PDF szövegszerkesztés és teljes adminisztrátori vezérlés $99/szerver/hó áron."
|
||||
freeBody = "Az <strong>Open-Core</strong> licencelésünk szerverenként legfeljebb <strong>{{freeTierLimit}}</strong> felhasználót enged ingyen. A zavartalan bővüléshez és az új <strong>PDF szövegszerkesztő eszköz</strong> korai eléréséhez a Stirling Server csomagot ajánljuk – teljes szerkesztés és <strong>korlátlan hely</strong> $99/szerver/hó áron."
|
||||
freeBody = "A <strong>Open-Core</strong> licencünk szerverenként legfeljebb <strong>{{freeTierLimit}}</strong> felhasználót engedélyez ingyenesen. A zökkenőmentes skálázáshoz a Stirling Server csomagot ajánljuk - <strong>korlátlan felhasználó</strong> és <strong>SSO támogatás</strong> $99/szerver/hó."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Letöltés"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Kapcsolat az értékesítéssel"
|
||||
contactToUpgrade = "Lépjen kapcsolatba velünk a csomag frissítéséhez vagy testreszabásához"
|
||||
maxUsers = "Max. felhasználók"
|
||||
upTo = "Legfeljebb"
|
||||
getLicense = "Szerverlicenc beszerzése"
|
||||
upgradeToEnterprise = "Frissítés Enterprise-ra"
|
||||
selectPeriod = "Számlázási időszak kiválasztása"
|
||||
monthlyBilling = "Havi számlázás"
|
||||
yearlyBilling = "Éves számlázás"
|
||||
checkoutOpened = "Pénztár megnyitva"
|
||||
checkoutInstructions = "Fejezze be a vásárlást a Stripe fülön. A fizetés után térjen vissza ide, és frissítse az oldalt a licenc aktiválásához. E-mailben is megkapja a licenckulcsot."
|
||||
activateLicense = "Licenc aktiválása"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Pénztár új lapon megnyitva"
|
||||
instructions = "Fejezze be a vásárlást a Stripe fülön. A fizetés befejezése után e-mailben megkapja a licenckulcsot."
|
||||
enterKey = "Adja meg lent a licenckulcsot a csomag aktiválásához:"
|
||||
keyDescription = "Illessze be az e-mailben kapott licenckulcsot"
|
||||
activate = "Licenc aktiválása"
|
||||
doLater = "Majd később"
|
||||
success = "A licenc aktiválva!"
|
||||
successMessage = "A licenc sikeresen aktiválva. Most bezárhatja ezt az ablakot."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "E-mail ellenőrzés szükséges"
|
||||
message = "A Stripe számlázási portálon ellenőriznie kell az e-mail-címét. Ellenőrizze az e-mailjeit a bejelentkezési linkért."
|
||||
|
||||
[plan.period]
|
||||
month = "hónap"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Audit rendszer nem érhető el"
|
||||
notAvailableMessage = "Az audit rendszer nincs konfigurálva vagy nem elérhető."
|
||||
disabled = "Az audit naplózás le van tiltva"
|
||||
disabledMessage = "Engedélyezze az audit naplózást az alkalmazás konfigurációjában a rendszeresemények követéséhez."
|
||||
enterpriseRequired = "Vállalati licenc szükséges"
|
||||
enterpriseRequiredMessage = "A naplózási rendszer vállalati funkció. Kérjük, váltson vállalati licencre a naplók és analitikák eléréséhez."
|
||||
|
||||
[audit.error]
|
||||
title = "Hiba az audit rendszer betöltésekor"
|
||||
@@ -6370,7 +5942,6 @@ description = "Adja meg az önhostolt Stirling PDF szerver teljes URL-jét"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Adjon meg egy szerver URL-t"
|
||||
invalidUrl = "Érvénytelen URL-formátum. Adjon meg egy érvényes URL-t, például https://your-server.com"
|
||||
unreachable = "Nem sikerült kapcsolódni a szerverhez"
|
||||
testFailed = "A kapcsolat tesztje sikertelen"
|
||||
configFetch = "Nem sikerült letölteni a szerver konfigurációját. Ellenőrizze az URL-t, és próbálja meg újra."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Kapcsolódás ehhez:"
|
||||
submit = "Bejelentkezés"
|
||||
signInWith = "Bejelentkezés ezzel"
|
||||
oauthPending = "Böngésző megnyitása hitelesítéshez..."
|
||||
sso = "Egyszeri bejelentkezés"
|
||||
orContinueWith = "Vagy folytassa e-maillel"
|
||||
serverRequirement = "Megjegyzés: A szerveren engedélyezni kell a bejelentkezést."
|
||||
showInstructions = "Hogyan engedélyezhető?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Módosítások visszaállítása"
|
||||
downloadJson = "JSON letöltése"
|
||||
generatePdf = "PDF generálása"
|
||||
saveChanges = "Változtatások mentése"
|
||||
applyChanges = "Változtatások alkalmazása"
|
||||
downloadCopy = "Másolat letöltése"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Szöveg automatikus méretezése a dobozokhoz"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tipp: Tartsa lenyomva a Ctrl (Cmd) vagy a Shift billentyűt
|
||||
title = "Szerkesztett szöveg rögzítése egyetlen PDF-elemhez"
|
||||
description = "Bekapcsolva a szerkesztő minden szerkesztett szövegdobozt egy PDF szövegelemként exportál, elkerülve az átfedő glifákat vagy kevert betűtípusokat."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Speciális beállítások"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Előnézeti korlátozások"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Szöveg és képek fókusza"
|
||||
text = "Ez a munkaterület a szöveg szerkesztésére és a beágyazott képek áthelyezésére fókuszál. Az összetett oldalgrafika, űrlapelemek és rétegelt grafikák exportáláskor megmaradnak, de itt nem minden szerkeszthető teljes körűen."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Előnézet eltérései"
|
||||
text = "Egyes vizuális elemek (például táblaszegélyek, alakzatok vagy jegyzetek megjelenése) nem biztos, hogy pontosan jelennek meg az előnézetben. Az exportált PDF lehetőség szerint megőrzi az eredeti rajzolási utasításokat."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alfa megjelenítő"
|
||||
text = "Ez az alfa megjelenítő még fejlődik — bizonyos betűtípusok, színek, áttetszőségi hatások és elrendezési részletek kissé eltérhetnek. Kérjük, megosztás előtt ellenőrizze a létrehozott PDF-et."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Kijelölt dobozok egyesítése"
|
||||
merge = "Kijelölés egyesítése"
|
||||
@@ -6614,58 +6164,3 @@ title = "Szöveg hozzáadásának eredménye"
|
||||
|
||||
[addText.error]
|
||||
failed = "Hiba történt szöveg hozzáadásakor a PDF-hez."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Feltöltés mobilról"
|
||||
description = "Szkenneljen a fotók feltöltéséhez. A képek automatikusan PDF-be konvertálódnak."
|
||||
descriptionNoConvert = "Szkenneljen a fotók feltöltéséhez a mobileszközéről."
|
||||
error = "Kapcsolódási hiba"
|
||||
pollingError = "Hiba a fájlok ellenőrzésekor"
|
||||
sessionId = "Munkamenet-azonosító"
|
||||
sessionCreateError = "Nem sikerült létrehozni a munkamenetet"
|
||||
expiryWarning = "A munkamenet hamarosan lejár"
|
||||
expiryWarningMessage = "Ez a QR-kód {{seconds}} másodperc múlva lejár. Új kód automatikusan generálódik."
|
||||
filesReceived = "{{count}} fájl érkezett"
|
||||
connected = "Mobil eszköz csatlakoztatva"
|
||||
instructions = "Olvassa be a telefon kamerájával. A képek automatikusan PDF-be konvertálódnak."
|
||||
instructionsNoConvert = "Olvassa be a telefon kamerájával a fájlok feltöltéséhez."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobil szkenner"
|
||||
noSession = "Érvénytelen munkamenet"
|
||||
noSessionMessage = "Kérjük, érvényes QR-kód beolvasásával érje el ezt az oldalt."
|
||||
validating = "Munkamenet ellenőrzése..."
|
||||
sessionInvalid = "Munkamenet hiba"
|
||||
sessionExpired = "A munkamenet lejárt. Frissítsen, és próbálja újra."
|
||||
sessionNotFound = "A munkamenet nem található. Frissítsen, és próbálja újra."
|
||||
sessionValidationError = "Nem sikerült ellenőrizni a munkamenetet. Próbálja újra."
|
||||
uploadSuccess = "Sikeres feltöltés!"
|
||||
uploadSuccessMessage = "A képei átkerültek."
|
||||
httpsRequired = "A kameraeléréshez HTTPS vagy localhost szükséges. Használjon HTTPS-t, vagy érje el localhoston keresztül."
|
||||
uploadFailed = "A feltöltés nem sikerült. Próbálja újra."
|
||||
uploading = "Feltöltés..."
|
||||
connected = "Csatlakoztatva"
|
||||
connecting = "Csatlakozás..."
|
||||
chooseMethod = "Feltöltési mód választása"
|
||||
chooseMethodDescription = "Válassza ki, hogyan kíván dokumentumokat szkennelni és feltölteni"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Dokumentumok szkennelése az eszköz kamerájával, automatikus szegélyfelismeréssel"
|
||||
fileUpload = "Fájlfeltöltés"
|
||||
fileDescription = "Létező fotók vagy dokumentumok feltöltése az eszközről"
|
||||
cameraAccessDenied = "Kamera-hozzáférés megtagadva. Engedélyezze a kamerához való hozzáférést."
|
||||
back = "Vissza"
|
||||
settings = "Beállítások"
|
||||
edgeDetection = "Szegélyfelismerés"
|
||||
flashlight = "Zseblámpa"
|
||||
flash = "Vaku"
|
||||
processing = "Feldolgozás..."
|
||||
capture = "Fénykép készítése"
|
||||
selectFilesPrompt = "Válassza ki a feltöltendő fájlokat"
|
||||
selectImage = "Kép kiválasztása"
|
||||
preview = "Előnézet"
|
||||
retake = "Újrafotózás"
|
||||
addToBatch = "Hozzáadás a köteghez"
|
||||
upload = "Feltöltés"
|
||||
batchImages = "Köteg"
|
||||
clearBatch = "Törlés"
|
||||
uploadAll = "Összes feltöltése"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Anda memiliki perubahan yang belum disimpan pada PDF Anda."
|
||||
pendingRedactionsTitle = "Redaksi Belum Diterapkan"
|
||||
pendingRedactions = "Anda memiliki redaksi yang belum diterapkan yang akan hilang."
|
||||
areYouSure = "Apakah Anda yakin ingin keluar?"
|
||||
unsavedChangesTitle = "Perubahan Belum Disimpan"
|
||||
keepWorking = "Lanjutkan"
|
||||
discardChanges = "Buang & Keluar"
|
||||
discardRedactions = "Buang & Keluar"
|
||||
applyAndContinue = "Simpan & Keluar"
|
||||
exportAndContinue = "Ekspor & Lanjutkan"
|
||||
cancel = "Batal"
|
||||
@@ -198,7 +195,7 @@ title = "Pengaturan Dibuka"
|
||||
message = "Silakan pilih Stirling PDF di pengaturan sistem Anda"
|
||||
|
||||
[defaultApp.error]
|
||||
title = "Error"
|
||||
title = "Kesalahan"
|
||||
message = "Gagal menyetel penangan PDF default"
|
||||
|
||||
[language]
|
||||
@@ -343,10 +340,6 @@ advance = "Langkah Lanjut"
|
||||
edit = "Melihat & Mengedit"
|
||||
popular = "Populer"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferensi"
|
||||
|
||||
@@ -360,14 +353,13 @@ title = "Konfigurasi"
|
||||
systemSettings = "Pengaturan Sistem"
|
||||
features = "Fitur"
|
||||
endpoints = "Endpoint"
|
||||
database = "Database"
|
||||
database = "Basis Data"
|
||||
advanced = "Lanjutan"
|
||||
|
||||
[settings.securityAuth]
|
||||
title = "Keamanan & Autentikasi"
|
||||
security = "Keamanan"
|
||||
connections = "Koneksi"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Lisensi & Analitik"
|
||||
@@ -396,7 +388,7 @@ logout = "Keluar"
|
||||
|
||||
[settings.connection.mode]
|
||||
saas = "Stirling Cloud"
|
||||
selfhosted = "Self-Hosted"
|
||||
selfhosted = "Dihost Sendiri"
|
||||
|
||||
[settings.general]
|
||||
title = "Umum"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versi Saat Ini"
|
||||
latestVersion = "Versi Terbaru"
|
||||
checkForUpdates = "Periksa Pembaruan"
|
||||
viewDetails = "Lihat Detail"
|
||||
serverNeedsUpdate = "Server perlu diperbarui oleh administrator"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informasi Versi"
|
||||
description = "Detail versi Desktop dan Server"
|
||||
desktop = "Versi Desktop"
|
||||
server = "Versi Server"
|
||||
|
||||
[settings.security]
|
||||
title = "Keamanan"
|
||||
description = "Perbarui kata sandi Anda untuk menjaga keamanan akun."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Ubah kata sandi Anda. Anda akan keluar setelah memperbarui."
|
||||
required = "Semua bidang wajib diisi."
|
||||
mismatch = "Kata sandi baru tidak cocok."
|
||||
error = "Tidak dapat memperbarui kata sandi. Harap verifikasi kata sandi saat ini dan coba lagi."
|
||||
success = "Kata sandi berhasil diperbarui. Silakan masuk kembali."
|
||||
ssoDisabled = "Perubahan kata sandi dikelola oleh penyedia identitas Anda."
|
||||
current = "Kata sandi saat ini"
|
||||
currentPlaceholder = "Masukkan kata sandi saat ini"
|
||||
new = "Kata sandi baru"
|
||||
newPlaceholder = "Masukkan kata sandi baru"
|
||||
confirm = "Konfirmasi kata sandi baru"
|
||||
confirmPlaceholder = "Masukkan ulang kata sandi baru"
|
||||
update = "Perbarui kata sandi"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Pintasan Keyboard"
|
||||
@@ -522,16 +488,11 @@ low = "Rendah"
|
||||
title = "Ubah Kredensial"
|
||||
header = "Perbarui Detail Akun Anda"
|
||||
changePassword = "Anda menggunakan kredensial login default. Silakan masukkan kata sandi baru"
|
||||
ssoManaged = "Akun Anda dikelola oleh penyedia identitas Anda."
|
||||
newUsername = "Nama Pengguna Baru"
|
||||
oldPassword = "Kata Sandi Saat Ini"
|
||||
newPassword = "Kata Sandi Baru"
|
||||
confirmNewPassword = "Konfirmasi Kata Sandi Baru"
|
||||
submit = "Kirim Perubahan"
|
||||
credsUpdated = "Akun diperbarui"
|
||||
description = "Perubahan disimpan. Silakan masuk kembali."
|
||||
error = "Tidak dapat memperbarui nama pengguna. Harap verifikasi kata sandi Anda dan coba lagi."
|
||||
changeUsername = "Perbarui nama pengguna Anda. Anda akan keluar setelah memperbarui."
|
||||
|
||||
[account]
|
||||
title = "Pengaturan Akun"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Pengaturan Akun"
|
||||
adminSettings = "Pengaturan Admin - Melihat dan Menambahkan Pengguna"
|
||||
userControlSettings = "Pengaturan Kontrol Pengguna"
|
||||
changeUsername = "Ubah Nama Pengguna"
|
||||
changeUsernameDescription = "Perbarui nama pengguna Anda. Anda akan keluar setelah memperbarui."
|
||||
newUsernamePlaceholder = "Masukkan nama pengguna baru"
|
||||
newUsername = "Nama pengguna baru"
|
||||
password = "Konfirmasi Kata sandi"
|
||||
oldPassword = "Kata sandi lama"
|
||||
@@ -590,8 +549,8 @@ usage = "Lihat Penggunaan"
|
||||
[endpointStatistics]
|
||||
title = "Statistik Endpoint"
|
||||
header = "Statistik Endpoint"
|
||||
top10 = "Top 10"
|
||||
top20 = "Top 20"
|
||||
top10 = "10 Teratas"
|
||||
top20 = "20 Teratas"
|
||||
all = "Semua"
|
||||
refresh = "Muat Ulang"
|
||||
dataTypeLabel = "Tipe Data:"
|
||||
@@ -749,11 +708,6 @@ tags = "tanda tangan,autograf"
|
||||
title = "Tanda Tangan"
|
||||
desc = "Menambahkan tanda tangan ke PDF dengan gambar, teks, atau gambar"
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotasi,sorot,gambar"
|
||||
title = "Anotasi"
|
||||
desc = "Sorot, gambar, tambahkan catatan dan bentuk di penampil"
|
||||
|
||||
[home.flatten]
|
||||
tags = "sederhanakan,hapus,interaktif"
|
||||
title = "Meratakan"
|
||||
@@ -965,7 +919,7 @@ title = "Tumpuk PDF"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor Teks PDF"
|
||||
desc = "Tinjau dan edit ekspor Stirling PDF JSON dengan pengeditan teks terkelompok dan pembuatan ulang PDF"
|
||||
desc = "Edit teks dan gambar yang ada di dalam PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "teks,anotasi,label"
|
||||
@@ -976,7 +930,6 @@ desc = "Tambahkan teks kustom di mana saja di PDF Anda"
|
||||
addFiles = "Tambahkan File"
|
||||
uploadFromComputer = "Unggah dari komputer"
|
||||
openFromComputer = "Buka dari komputer"
|
||||
mobileUpload = "Unggah dari Ponsel"
|
||||
|
||||
[viewPdf]
|
||||
tags = "melihat,membaca,membuat anotasi,teks,gambar"
|
||||
@@ -1228,7 +1181,7 @@ selectFilesPlaceholder = "Pilih file di tampilan utama untuk memulai"
|
||||
settings = "Pengaturan"
|
||||
conversionCompleted = "Konversi selesai"
|
||||
results = "Hasil"
|
||||
defaultFilename = "converted_file"
|
||||
defaultFilename = "file_terkonversi"
|
||||
conversionResults = "Hasil Konversi"
|
||||
convertFrom = "Konversi dari"
|
||||
convertTo = "Konversi ke"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opsi CBZ ke PDF"
|
||||
optimizeForEbook = "Optimalkan PDF untuk pembaca ebook (menggunakan Ghostscript)"
|
||||
cbzOutputOptions = "Opsi PDF ke CBZ"
|
||||
cbzDpi = "DPI untuk perenderan gambar"
|
||||
cbrOptions = "Opsi CBR"
|
||||
cbrOutputOptions = "Opsi PDF ke CBR"
|
||||
cbrDpi = "DPI untuk perenderan gambar"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opsi eBook ke PDF"
|
||||
ebookOptionsDesc = "Opsi untuk mengonversi eBook ke PDF"
|
||||
embedAllFonts = "Sematkan semua font"
|
||||
embedAllFontsDesc = "Sematkan semua font dari eBook ke PDF yang dihasilkan"
|
||||
includeTableOfContents = "Sertakan daftar isi"
|
||||
includeTableOfContentsDesc = "Tambahkan daftar isi yang dihasilkan ke PDF hasil"
|
||||
includePageNumbers = "Sertakan nomor halaman"
|
||||
includePageNumbersDesc = "Tambahkan nomor halaman ke PDF yang dihasilkan"
|
||||
optimizeForEbookPdf = "Optimalkan untuk pembaca eBook"
|
||||
optimizeForEbookPdfDesc = "Optimalkan PDF untuk membaca eBook (ukuran file lebih kecil, perenderan lebih baik pada perangkat eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opsi PDF ke eBook"
|
||||
epubOptionsDesc = "Opsi untuk mengonversi PDF ke EPUB/AZW3"
|
||||
detectChapters = "Deteksi bab"
|
||||
detectChaptersDesc = "Deteksi judul yang tampak seperti bab dan sisipkan jeda halaman EPUB"
|
||||
targetDevice = "Perangkat target"
|
||||
targetDeviceDesc = "Pilih profil keluaran yang dioptimalkan untuk perangkat pembaca"
|
||||
outputFormat = "Format keluaran"
|
||||
outputFormatDesc = "Pilih format keluaran untuk eBook"
|
||||
tabletPhone = "Tablet/Ponsel (dengan gambar)"
|
||||
kindleEink = "Kindle e-Ink (teks dioptimalkan)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konversi,img,jpg,gambar,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Tambahkan Lampiran"
|
||||
remove = "Hapus Lampiran"
|
||||
embed = "Sematkan Lampiran"
|
||||
convertToPdfA3b = "Konversi ke PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Membuat PDF arsip dengan lampiran tersemat"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b adalah format arsip yang memastikan pelestarian jangka panjang. Format ini memungkinkan penyematan format file apa pun sebagai lampiran. Konversi memerlukan Ghostscript dan mungkin memakan waktu lebih lama untuk file besar."
|
||||
convertToPdfA3bTooltipHeader = "Tentang Konversi PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Apa fungsinya"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1447,7 +1368,7 @@ title = "Tambahkan Watermark"
|
||||
desc = "Tambahkan tanda air teks atau gambar ke file PDF"
|
||||
completed = "Tanda air ditambahkan"
|
||||
submit = "Tambahkan Watermark"
|
||||
filenamePrefix = "watermarked"
|
||||
filenamePrefix = "bertanda_air"
|
||||
|
||||
[watermark.error]
|
||||
failed = "Terjadi kesalahan saat menambahkan tanda air ke PDF."
|
||||
@@ -2385,10 +2306,6 @@ saved = "Tersimpan"
|
||||
label = "Unggah gambar tanda tangan"
|
||||
placeholder = "Pilih berkas gambar"
|
||||
hint = "Unggah gambar PNG atau JPG dari tanda tangan Anda"
|
||||
removeBackground = "Hapus latar belakang putih (buat transparan)"
|
||||
processing = "Memproses gambar..."
|
||||
backgroundRemovalFailedTitle = "Penghapusan latar belakang gagal"
|
||||
backgroundRemovalFailedMessage = "Tidak dapat menghapus latar belakang dari gambar. Menggunakan gambar asli sebagai gantinya."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Cara menambahkan tanda tangan"
|
||||
@@ -2434,11 +2351,6 @@ note = "Perataan menghapus elemen interaktif dari PDF, membuatnya tidak dapat di
|
||||
label = "Ratakan hanya formulir"
|
||||
desc = "Hanya meratakan bidang formulir, membiarkan elemen interaktif lainnya tetap utuh"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI Perenderan (opsional, disarankan 150 DPI)"
|
||||
help = "Biarkan kosong untuk menggunakan bawaan sistem. DPI lebih tinggi mempertajam keluaran tetapi meningkatkan waktu pemrosesan dan ukuran file."
|
||||
placeholder = "mis. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Hasil Perataan"
|
||||
|
||||
@@ -2805,7 +2717,7 @@ header = "Hapus sertifikat digital dari PDF"
|
||||
selectPDF = "Pilih file PDF:"
|
||||
submit = "Hapus Tanda Tangan"
|
||||
description = "Alat ini akan menghapus tanda tangan sertifikat digital dari dokumen PDF Anda."
|
||||
filenamePrefix = "unsigned"
|
||||
filenamePrefix = "tanpa_tanda_tangan"
|
||||
|
||||
[removeCertSign.files]
|
||||
placeholder = "Pilih file PDF di tampilan utama untuk memulai"
|
||||
@@ -3013,7 +2925,6 @@ header = "Pangkas PDF"
|
||||
submit = "Kirim"
|
||||
noFileSelected = "Pilih file PDF untuk mulai memotong"
|
||||
reset = "Atur ulang ke PDF penuh"
|
||||
autoCrop = "Pangkas otomatis ruang kosong"
|
||||
|
||||
[crop.preview]
|
||||
title = "Pilihan Area Pangkas"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metode Penyensoran"
|
||||
mode = "Mode"
|
||||
automatic = "Otomatis"
|
||||
automaticDesc = "Sensor teks berdasarkan istilah pencarian"
|
||||
automaticDisabledTooltip = "Pilih file di pengelola file untuk meredaksi beberapa file sekaligus"
|
||||
manual = "Manual"
|
||||
manualDesc = "Klik dan seret untuk menyensor area tertentu"
|
||||
manualComingSoon = "Penyensoran manual segera hadir"
|
||||
@@ -3315,35 +3225,8 @@ text = "Hanya cocokkan kata lengkap, bukan kecocokan parsial. 'John' tidak cocok
|
||||
title = "Konversi ke PDF-Image"
|
||||
text = "Mengonversi PDF menjadi PDF berbasis gambar setelah penyensoran. Ini memastikan teks di belakang kotak sensor benar-benar dihapus dan tidak dapat dipulihkan."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Kontrol Redaksi Manual"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Alat Tandai Teks"
|
||||
text = "Pilih teks langsung pada PDF untuk menandainya untuk redaksi. Klik dan seret untuk menyorot teks tertentu yang ingin Anda redaksi."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Alat Tandai Area"
|
||||
text = "Gambar area persegi panjang pada PDF untuk menandai wilayah untuk redaksi. Berguna untuk meredaksi gambar, tanda tangan, atau bentuk tidak beraturan."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Terapkan Redaksi"
|
||||
text = "Setelah menandai konten, klik 'Terapkan' untuk meredaksi secara permanen semua area yang ditandai. Jumlah tertunda menunjukkan berapa banyak redaksi yang siap diterapkan."
|
||||
bullet1 = "Tandai sebanyak mungkin area sebelum menerapkan"
|
||||
bullet2 = "Semua redaksi tertunda diterapkan sekaligus"
|
||||
bullet3 = "Redaksi tidak dapat dibatalkan setelah diterapkan"
|
||||
|
||||
[redact.manual]
|
||||
title = "Alat Redaksi"
|
||||
instructions = "Pilih teks atau gambar area pada PDF untuk menandai konten untuk redaksi."
|
||||
markText = "Tandai Teks"
|
||||
markArea = "Tandai Area"
|
||||
pendingLabel = "Tertunda:"
|
||||
applyWarning = "⚠️ Penerapan permanen, tidak dapat dibatalkan dan data di bawahnya akan dihapus"
|
||||
apply = "Terapkan"
|
||||
noMarks = "Tidak ada tanda redaksi. Gunakan alat di atas untuk menandai konten untuk redaksi."
|
||||
header = "Penyensoran Manual"
|
||||
controlsTitle = "Kontrol Redaksi Manual"
|
||||
textBasedRedaction = "Penyensoran Berbasis Teks"
|
||||
pageBasedRedaction = "Penyensoran Berbasis Halaman"
|
||||
convertPDFToImageLabel = "Konversi PDF ke PDF-Image (Digunakan untuk menghapus teks di belakang kotak)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Input angka untuk pembagian horizontal"
|
||||
label = "Pembagian Vertikal"
|
||||
placeholder = "Input angka untuk pembagian vertikal"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Mode Pemisahan"
|
||||
description = "Pilih cara memisahkan halaman"
|
||||
splitAll = "Pisahkan semua halaman"
|
||||
splitAllExceptFirst = "Pisahkan semua kecuali pertama"
|
||||
splitAllExceptLast = "Pisahkan semua kecuali terakhir"
|
||||
splitAllExceptFirstAndLast = "Pisahkan semua kecuali pertama dan terakhir"
|
||||
custom = "Halaman kustom"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Nomor Halaman Kustom"
|
||||
placeholder = "mis. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Tanda tangan, tambahkan gambar, posisikan gambar di tengah, air tinta, PDF, embedding, customisasi"
|
||||
header = "Stampel PDF"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDF Ke Halaman Tunggal"
|
||||
header = "PDF Ke Halaman Tunggal"
|
||||
submit = "Konversi ke Halaman Tunggal"
|
||||
description = "Alat ini akan menggabungkan semua halaman PDF Anda menjadi satu halaman besar. Lebarnya akan tetap sama dengan halaman asli, tetapi tingginya merupakan penjumlahan dari semua tinggi halaman."
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "halaman_tunggal"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Pilih file PDF di tampilan utama untuk memulai"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Ukuran Berkas"
|
||||
[compress.grayscale]
|
||||
label = "Terapkan Skala Abu-Abu untuk Kompresi"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Lineariskan PDF untuk penayangan web cepat"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Konversi gambar ke line art"
|
||||
description = "Menggunakan ImageMagick untuk mengubah halaman menjadi hitam-putih kontras tinggi untuk pengurangan ukuran maksimal."
|
||||
unavailable = "ImageMagick tidak terpasang atau tidak diaktifkan pada server ini"
|
||||
detailLevel = "Tingkat detail"
|
||||
edgeEmphasis = "Penekanan tepi"
|
||||
edgeLow = "Lembut"
|
||||
edgeMedium = "Seimbang"
|
||||
edgeHigh = "Kuat"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Ringkasan Pengaturan Kompresi"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Nilai lebih tinggi mengurangi ukuran file"
|
||||
title = "Skala abu-abu"
|
||||
text = "Pilih opsi ini untuk mengonversi semua gambar menjadi hitam putih, yang dapat secara signifikan mengurangi ukuran file terutama untuk PDF hasil pemindaian atau dokumen yang banyak gambar."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "Konversi halaman ke hitam-putih kontras tinggi menggunakan ImageMagick. Gunakan tingkat detail untuk mengontrol seberapa banyak konten menjadi hitam, dan penekanan tepi untuk mengontrol seberapa agresif tepi terdeteksi."
|
||||
|
||||
[compress.error]
|
||||
failed = "Terjadi kesalahan saat mengompresi PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Terjadi kesalahan saat mengompresi PDF."
|
||||
_value = "Pengaturan Kompresi"
|
||||
1 = "1-3 kompresi PDF,</br> 4-6 kompresi gambar ringan,</br> 7-9 kompresi gambar intens akan sangat mengurangi kualitas gambar"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Nilai lebih rendah mempertahankan kualitas tetapi menghasilkan file lebih besar"
|
||||
range4to6 = "Kompresi sedang dengan pengurangan kualitas moderat"
|
||||
range7to9 = "Nilai lebih tinggi mengurangi ukuran file secara signifikan tetapi dapat mengurangi kejernihan gambar"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "File ini dilindungi kata sandi. Silakan masukkan kata sandi:"
|
||||
cancelled = "Operasi dibatalkan untuk PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Hapus Halaman Terpilih"
|
||||
closePdf = "Tutup PDF"
|
||||
exportAll = "Ekspor PDF"
|
||||
downloadSelected = "Unduh File Terpilih"
|
||||
annotations = "Anotasi"
|
||||
exportSelected = "Ekspor Halaman Terpilih"
|
||||
saveChanges = "Simpan Perubahan"
|
||||
downloadAll = "Unduh Semua"
|
||||
saveAll = "Simpan Semua"
|
||||
toggleTheme = "Alihkan Tema"
|
||||
toggleBookmarks = "Tampilkan/Sembunyikan Bookmark"
|
||||
language = "Bahasa"
|
||||
toggleAnnotations = "Alihkan Visibilitas Anotasi"
|
||||
search = "Cari PDF"
|
||||
panMode = "Mode Geser"
|
||||
applyRedactionsFirst = "Terapkan redaksi terlebih dahulu"
|
||||
rotateLeft = "Putar Kiri"
|
||||
rotateRight = "Putar Kanan"
|
||||
toggleSidebar = "Alihkan Sidebar"
|
||||
toggleBookmarks = "Tampilkan/Sembunyikan Bookmark"
|
||||
exportSelected = "Ekspor Halaman Terpilih"
|
||||
toggleAnnotations = "Alihkan Visibilitas Anotasi"
|
||||
annotationMode = "Alihkan Mode Anotasi"
|
||||
print = "Cetak PDF"
|
||||
draw = "Gambar"
|
||||
redact = "Redaksi"
|
||||
exitRedaction = "Keluar dari Mode Redaksi"
|
||||
save = "Simpan"
|
||||
downloadAll = "Unduh Semua"
|
||||
saveAll = "Simpan Semua"
|
||||
|
||||
[textAlign]
|
||||
left = "Kiri"
|
||||
center = "Tengah"
|
||||
right = "Kanan"
|
||||
|
||||
[annotation]
|
||||
title = "Anotasi"
|
||||
desc = "Gunakan sorotan, pena, teks, dan catatan. Perubahan tetap aktif—tidak perlu flattening."
|
||||
highlight = "Sorot"
|
||||
pen = "Pena"
|
||||
text = "Kotak teks"
|
||||
note = "Catatan"
|
||||
rectangle = "Persegi panjang"
|
||||
ellipse = "Elips"
|
||||
select = "Pilih"
|
||||
exit = "Keluar dari mode anotasi"
|
||||
strokeWidth = "Lebar"
|
||||
opacity = "Opasitas"
|
||||
strokeOpacity = "Opasitas Garis"
|
||||
fillOpacity = "Opasitas Isian"
|
||||
fontSize = "Ukuran font"
|
||||
chooseColor = "Pilih warna"
|
||||
color = "Warna"
|
||||
strokeColor = "Warna Garis"
|
||||
fillColor = "Warna Isian"
|
||||
underline = "Garis bawah"
|
||||
strikeout = "Coret"
|
||||
squiggly = "Berombak"
|
||||
inkHighlighter = "Penyorot Bebas"
|
||||
freehandHighlighter = "Penyorot Bebas"
|
||||
square = "Persegi"
|
||||
circle = "Lingkaran"
|
||||
polygon = "Poligon"
|
||||
line = "Garis"
|
||||
stamp = "Tambahkan Gambar"
|
||||
textMarkup = "Penandaan Teks"
|
||||
drawing = "Gambar"
|
||||
shapes = "Bentuk"
|
||||
notesStamps = "Catatan & Stempel"
|
||||
settings = "Pengaturan"
|
||||
borderOn = "Bingkai: Aktif"
|
||||
borderOff = "Bingkai: Nonaktif"
|
||||
editInk = "Edit Pena"
|
||||
editLine = "Edit Garis"
|
||||
editNote = "Edit Catatan"
|
||||
editText = "Edit Kotak Teks"
|
||||
editTextMarkup = "Edit Penandaan Teks"
|
||||
editSelected = "Edit Anotasi"
|
||||
editSquare = "Edit Persegi"
|
||||
editCircle = "Edit Lingkaran"
|
||||
editPolygon = "Edit Poligon"
|
||||
unsupportedType = "Jenis anotasi ini belum sepenuhnya didukung untuk pengeditan."
|
||||
textAlignment = "Perataan Teks"
|
||||
noteIcon = "Ikon Catatan"
|
||||
imagePreview = "Pratinjau"
|
||||
contents = "Teks"
|
||||
backgroundColor = "Warna latar"
|
||||
clearBackground = "Hapus latar belakang"
|
||||
noBackground = "Tanpa latar belakang"
|
||||
stampSettings = "Pengaturan Stempel"
|
||||
savingCopy = "Menyiapkan unduhan..."
|
||||
saveFailed = "Tidak dapat menyimpan salinan"
|
||||
saveReady = "Siap diunduh"
|
||||
selectAndMove = "Pilih dan Edit"
|
||||
editSelectDescription = "Klik anotasi yang ada untuk mengedit warna, opasitas, teks, atau ukurannya."
|
||||
editStampHint = "Untuk mengubah gambar, hapus stempel ini dan tambahkan yang baru."
|
||||
editSwitchToSelect = "Beralih ke Pilih & Edit untuk mengedit anotasi ini."
|
||||
undo = "Urungkan"
|
||||
redo = "Ulangi"
|
||||
applyChanges = "Terapkan Perubahan"
|
||||
saveChanges = "Simpan Perubahan"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Setelan"
|
||||
adminSettings = "Setelan Admin"
|
||||
allTools = "All Tools"
|
||||
reader = "Pembaca"
|
||||
tours = "Tur"
|
||||
showMeAround = "Ajak saya berkeliling"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Tonton panduan di sini: tur Alat, tur tata letak V2 baru, dan tur Admin."
|
||||
user = "Tonton panduan di sini: tur Alat dan tur tata letak V2 baru."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tur Alat"
|
||||
toolsTourDesc = "Pelajari apa yang bisa dilakukan alat"
|
||||
adminTour = "Tur Admin"
|
||||
adminTourDesc = "Jelajahi pengaturan & fitur admin"
|
||||
whatsNewTour = "Lihat yang baru di V2"
|
||||
whatsNewTourDesc = "Jelajahi tata letak yang diperbarui"
|
||||
|
||||
[admin]
|
||||
error = "Kesalahan"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Gagal memuat pengaturan"
|
||||
saveError = "Gagal menyimpan pengaturan"
|
||||
saved = "Pengaturan berhasil disimpan"
|
||||
saveSuccess = "Pengaturan berhasil disimpan"
|
||||
success = "Pengaturan berhasil disimpan"
|
||||
error = "Gagal menyimpan pengaturan"
|
||||
save = "Simpan Perubahan"
|
||||
discard = "Buang"
|
||||
restartRequired = "Perlu Mulai Ulang"
|
||||
@@ -4422,13 +4185,6 @@ description = "Path ke eksekutabel WeasyPrint untuk konversi HTML ke PDF (biarka
|
||||
label = "Eksekutabel Unoconvert"
|
||||
description = "Path ke LibreOffice unoconvert untuk konversi dokumen (biarkan kosong untuk default: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "URL dasar untuk frontend (mis., https://pdf.example.com). Digunakan untuk tautan undangan email dan unggah Kode QR seluler. Biarkan kosong untuk menggunakan backend URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Klik untuk melihat detail paket"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Keamanan"
|
||||
description = "Konfigurasikan autentikasi, perilaku login, dan kebijakan keamanan."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Hubungkan"
|
||||
disconnect = "Putuskan"
|
||||
disconnected = "Penyedia berhasil diputuskan"
|
||||
disconnectError = "Gagal memutuskan penyedia"
|
||||
mobileScannerConvertToPdf = "Konversi Gambar ke PDF"
|
||||
mobileScannerConvertToPdfDesc = "Secara otomatis mengonversi gambar yang diunggah ke format PDF. Jika dinonaktifkan, gambar akan dibiarkan apa adanya."
|
||||
mobileScannerImageResolution = "Resolusi Gambar"
|
||||
mobileScannerImageResolutionDesc = "Resolusi gambar yang diunggah. \"Reduced\" menskalakan gambar hingga maksimum 1200px untuk mengurangi ukuran file."
|
||||
imageResolutionFull = "Penuh (Ukuran Asli)"
|
||||
imageResolutionReduced = "Dikurangi (Maks 1200px)"
|
||||
mobileScannerPageFormat = "Format Halaman"
|
||||
mobileScannerPageFormatDesc = "Ukuran halaman PDF untuk gambar yang dikonversi. \"Keep\" menggunakan dimensi gambar asli."
|
||||
pageFormatKeep = "Keep (Dimensi Asli)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Rentangkan agar Pas"
|
||||
mobileScannerStretchToFitDesc = "Rentangkan gambar agar memenuhi seluruh halaman. Jika dinonaktifkan, gambar dipusatkan dengan mempertahankan rasio aspek."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Login Otomatis SSO"
|
||||
@@ -4646,124 +4389,8 @@ description = "Buat akun pengguna secara otomatis pada login SAML2 pertama"
|
||||
label = "Blokir Pendaftaran"
|
||||
description = "Cegah pendaftaran pengguna baru melalui SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Unggah dari Ponsel"
|
||||
enable = "Aktifkan Unggah Kode QR"
|
||||
description = "Izinkan pengguna mengunggah file dari perangkat seluler dengan memindai Kode QR"
|
||||
note = "Catatan: Memerlukan Frontend URL dikonfigurasi. "
|
||||
link = "Konfigurasikan di Pengaturan Sistem"
|
||||
mobileScannerConvertToPdf = "Konversi Gambar ke PDF"
|
||||
mobileScannerConvertToPdfDesc = "Secara otomatis mengonversi gambar yang diunggah ke format PDF. Jika dinonaktifkan, gambar akan dibiarkan apa adanya."
|
||||
mobileScannerImageResolution = "Resolusi Gambar"
|
||||
mobileScannerImageResolutionDesc = "Resolusi gambar yang diunggah. \"Reduced\" menskalakan gambar hingga maksimum 1200px untuk mengurangi ukuran file."
|
||||
imageResolutionFull = "Penuh (Ukuran Asli)"
|
||||
imageResolutionReduced = "Dikurangi (Maks 1200px)"
|
||||
mobileScannerPageFormat = "Format Halaman"
|
||||
mobileScannerPageFormatDesc = "Ukuran halaman PDF untuk gambar yang dikonversi. \"Keep\" menggunakan dimensi gambar asli."
|
||||
pageFormatKeep = "Keep (Dimensi Asli)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Rentangkan agar Pas"
|
||||
mobileScannerStretchToFitDesc = "Rentangkan gambar agar memenuhi seluruh halaman. Jika dinonaktifkan, gambar dipusatkan dengan mempertahankan rasio aspek."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot Telegram"
|
||||
description = "Konfigurasikan konektivitas bot Telegram, kontrol akses, dan perilaku umpan balik."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Aktifkan Bot Telegram"
|
||||
description = "Izinkan pengguna berinteraksi dengan Stirling PDF melalui bot Telegram yang Anda konfigurasi."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nama Pengguna Bot"
|
||||
description = "Nama pengguna publik bot Telegram Anda."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "Token API yang diberikan oleh BotFather untuk bot Telegram Anda."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Folder Inbox"
|
||||
description = "Folder di bawah direktori pipeline tempat file Telegram masuk disimpan."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Gunakan Akhiran Folder Kustom"
|
||||
description = "Tambahkan ID obrolan ke folder file masuk untuk memisahkan unggahan per obrolan."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Kontrol Akses"
|
||||
description = "Batasi pengguna atau channel mana yang dapat berinteraksi dengan bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Izinkan ID Pengguna Tertentu"
|
||||
description = "Saat diaktifkan, hanya ID pengguna yang terdaftar yang dapat menggunakan bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID Pengguna yang Diizinkan"
|
||||
description = "Masukkan ID pengguna Telegram yang diizinkan berinteraksi dengan bot."
|
||||
placeholder = "Tambahkan ID pengguna lalu tekan Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Izinkan ID Channel Tertentu"
|
||||
description = "Saat diaktifkan, hanya ID channel yang terdaftar yang dapat menggunakan bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID Channel yang Diizinkan"
|
||||
description = "Masukkan ID channel Telegram yang diizinkan berinteraksi dengan bot."
|
||||
placeholder = "Tambahkan ID channel lalu tekan Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Pemrosesan"
|
||||
description = "Kendalikan interval polling dan batas waktu pemrosesan untuk unggahan Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Batas Waktu Pemrosesan (detik)"
|
||||
description = "Waktu maksimum menunggu pekerjaan pemrosesan sebelum melaporkan kesalahan."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interval Polling (ms)"
|
||||
description = "Interval antara pemeriksaan pembaruan Telegram baru."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Pesan Umpan Balik"
|
||||
description = "Pilih kapan bot harus mengirim umpan balik ke pengguna dan channel."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Aktifkan Umpan Balik"
|
||||
description = "Kendalikan apakah bot mengirim pesan umpan balik sama sekali."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Aturan Umpan Balik Channel"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Tampilkan \"Tidak ada dokumen yang valid\" (Channel)"
|
||||
description = "Sembunyikan respons tidak ada dokumen yang valid untuk unggahan channel."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Tampilkan kesalahan pemrosesan (Channel)"
|
||||
description = "Kirim pesan kesalahan pemrosesan ke channel."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Tampilkan pesan kesalahan (Channel)"
|
||||
description = "Tampilkan pesan kesalahan terperinci untuk channel."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Aturan Umpan Balik Pengguna"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Tampilkan \"Tidak ada dokumen yang valid\" (Pengguna)"
|
||||
description = "Sembunyikan respons tidak ada dokumen yang valid untuk unggahan pengguna."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Tampilkan kesalahan pemrosesan (Pengguna)"
|
||||
description = "Kirim pesan kesalahan pemrosesan ke pengguna."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Tampilkan pesan kesalahan (Pengguna)"
|
||||
description = "Tampilkan pesan kesalahan terperinci untuk pengguna."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
title = "Basis Data"
|
||||
description = "Konfigurasikan pengaturan koneksi database kustom untuk penerapan enterprise."
|
||||
configuration = "Konfigurasi Database"
|
||||
|
||||
@@ -4943,10 +4570,6 @@ description = "Izinkan admin mengundang pengguna via email dengan kata sandi yan
|
||||
label = "URL Frontend"
|
||||
description = "URL dasar untuk frontend (mis. https://pdf.example.com). Digunakan untuk membuat tautan undangan di email. Biarkan kosong untuk menggunakan URL backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Catatan: Memerlukan Frontend URL dikonfigurasi. "
|
||||
link = "Konfigurasikan di Pengaturan Sistem"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Dokumen Legal"
|
||||
description = "Konfigurasikan tautan ke dokumen dan kebijakan legal."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "File Saya"
|
||||
noRecentFiles = "Tidak ada file terbaru"
|
||||
googleDriveNotAvailable = "Integrasi Google Drive tidak tersedia"
|
||||
mobileUpload = "Unggah dari Ponsel"
|
||||
mobileShort = "Ponsel"
|
||||
mobileUploadNotAvailable = "Unggah dari ponsel tidak diaktifkan"
|
||||
downloadSelected = "Unduh yang Dipilih"
|
||||
saveSelected = "Simpan Terpilih"
|
||||
openFiles = "Buka File"
|
||||
@@ -5448,14 +5068,13 @@ done = "Selesai"
|
||||
loading = "Memuat..."
|
||||
back = "Kembali"
|
||||
continue = "Lanjut"
|
||||
error = "Error"
|
||||
save = "Simpan"
|
||||
error = "Kesalahan"
|
||||
|
||||
[config.overview]
|
||||
title = "Konfigurasi Aplikasi"
|
||||
description = "Pengaturan dan detail konfigurasi aplikasi saat ini."
|
||||
loading = "Memuat konfigurasi..."
|
||||
error = "Error"
|
||||
error = "Kesalahan"
|
||||
warning = "Peringatan Konfigurasi"
|
||||
|
||||
[config.overview.sections]
|
||||
@@ -5512,15 +5131,6 @@ impact = "Aplikasi atau layanan yang saat ini menggunakan kunci ini akan berhent
|
||||
confirmPrompt = "Apakah Anda yakin ingin melanjutkan?"
|
||||
confirmCta = "Segarkan Kunci"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Kesalahan Kunci API"
|
||||
failedToCreateApiKey = "Gagal membuat kunci API."
|
||||
failedToRetrieveApiKey = "Gagal mengambil kunci API dari respons."
|
||||
failedToFetchApiKey = "Gagal mengambil kunci API."
|
||||
apiKeyRefreshed = "Kunci API Diperbarui"
|
||||
apiKeyRefreshedBody = "Kunci API Anda berhasil diperbarui."
|
||||
failedToRefreshApiKey = "Gagal memperbarui kunci API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Pilih Lampiran"
|
||||
info = "Pilih file untuk dilampirkan ke PDF Anda. File akan disematkan dan dapat diakses melalui panel lampiran PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Selesai"
|
||||
startTour = "Mulai Tur"
|
||||
startTourDescription = "Ikuti tur terpandu tentang fitur utama Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Mulai dari panel <strong>Akses Cepat</strong> untuk beralih antara Penampil, Automate, file Anda, dan semua tur."
|
||||
leftPanel = "Panel <strong>Alat</strong> di kiri menampilkan semua yang bisa Anda lakukan. Jelajahi kategori atau cari untuk menemukan alat dengan cepat."
|
||||
fileUpload = "Gunakan tombol <strong>Files</strong> untuk mengunggah atau memilih PDF terbaru. Kami akan memuat sampel agar Anda dapat melihat ruang kerja."
|
||||
rightRail = "<strong>Panel Kanan</strong> berisi tindakan cepat untuk memilih file, mengubah tema atau bahasa, dan mengunduh hasil."
|
||||
topBar = "Bilah atas memungkinkan Anda beralih antara <strong>Penampil</strong>, <strong>Editor Halaman</strong>, dan <strong>File Aktif</strong>."
|
||||
pageEditorView = "Beralih ke Editor Halaman untuk mengurutkan ulang, memutar, atau menghapus halaman."
|
||||
activeFilesView = "Gunakan File Aktif untuk melihat semua yang Anda buka dan memilih yang akan dikerjakan."
|
||||
wrapUp = "Itulah yang baru di V2. Buka menu <strong>Tur</strong> kapan saja untuk memutar ulang ini, tur Alat, atau tur Admin."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Selamat datang di Stirling PDF!"
|
||||
description = "Ingin mengikuti tur singkat 1 menit untuk mempelajari fitur utama dan cara memulai?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Unduh →"
|
||||
showMeAround = "Tunjukkan saya"
|
||||
skipTheTour = "Lewati tur"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Ringkasan Tur"
|
||||
body = "Stirling PDF V2 hadir dengan puluhan alat dan tata letak yang diperbarui. Ikuti tur singkat untuk melihat apa yang berubah dan di mana menemukan fitur yang Anda butuhkan."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Lewati dulu"
|
||||
seePlans = "Lihat Paket →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Upgrade sekarang →"
|
||||
freeTitle = "Lisensi Server"
|
||||
overLimitTitle = "Perlu Lisensi Server"
|
||||
overLimitBody = "Lisensi kami mengizinkan hingga <strong>{{freeTierLimit}}</strong> pengguna gratis per server. Anda memiliki <strong>{{overLimitUserCopy}}</strong> pengguna Stirling. Untuk terus berjalan tanpa gangguan, upgrade ke paket Stirling Server - <strong>kursi tanpa batas</strong>, pengeditan teks PDF, dan kontrol admin penuh seharga $99/server/bulan."
|
||||
freeBody = "Lisensi <strong>Open-Core</strong> kami mengizinkan hingga <strong>{{freeTierLimit}}</strong> pengguna gratis per server. Untuk skala tanpa hambatan dan mendapatkan akses awal ke <strong>alat pengeditan teks PDF</strong> baru kami, kami sarankan paket Stirling Server - pengeditan penuh dan <strong>kursi tanpa batas</strong> seharga $99/server/bulan."
|
||||
freeBody = "Lisensi <strong>Open-Core</strong> kami mengizinkan hingga <strong>{{freeTierLimit}}</strong> pengguna gratis per server. Untuk meningkatkan skala tanpa gangguan, kami merekomendasikan paket Stirling Server - <strong>pengguna tanpa batas</strong> dan <strong>dukungan SSO</strong> seharga $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Unduh"
|
||||
@@ -5947,7 +5543,7 @@ hideComparison = "Sembunyikan Perbandingan Fitur"
|
||||
featureComparison = "Perbandingan Fitur"
|
||||
from = "Mulai"
|
||||
perMonth = "/bulan"
|
||||
perSeat = "/seat"
|
||||
perSeat = "/pengguna"
|
||||
withServer = "+ Paket Server"
|
||||
licensedSeats = "Berlisensi: {{count}} seat"
|
||||
includedInCurrent = "Termasuk dalam Paket Anda"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Hubungi Penjualan"
|
||||
contactToUpgrade = "Hubungi kami untuk meningkatkan atau menyesuaikan paket Anda"
|
||||
maxUsers = "Pengguna Maks"
|
||||
upTo = "Hingga"
|
||||
getLicense = "Dapatkan Lisensi Server"
|
||||
upgradeToEnterprise = "Tingkatkan ke Enterprise"
|
||||
selectPeriod = "Pilih Periode Penagihan"
|
||||
monthlyBilling = "Penagihan Bulanan"
|
||||
yearlyBilling = "Penagihan Tahunan"
|
||||
checkoutOpened = "Checkout Dibuka"
|
||||
checkoutInstructions = "Selesaikan pembelian Anda di tab Stripe. Setelah pembayaran, kembali ke sini dan segarkan halaman untuk mengaktifkan lisensi Anda. Anda juga akan menerima email berisi kunci lisensi."
|
||||
activateLicense = "Aktifkan Lisensi Anda"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout Dibuka di Tab Baru"
|
||||
instructions = "Selesaikan pembelian Anda di tab Stripe. Setelah pembayaran selesai, Anda akan menerima email berisi kunci lisensi."
|
||||
enterKey = "Masukkan kunci lisensi Anda di bawah untuk mengaktifkan paket Anda:"
|
||||
keyDescription = "Tempel kunci lisensi dari email Anda"
|
||||
activate = "Aktifkan Lisensi"
|
||||
doLater = "Saya akan lakukan ini nanti"
|
||||
success = "Lisensi Diaktifkan!"
|
||||
successMessage = "Lisensi Anda berhasil diaktifkan. Anda sekarang dapat menutup jendela ini."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Verifikasi Email Diperlukan"
|
||||
message = "Anda perlu memverifikasi alamat email di portal penagihan Stripe. Periksa email Anda untuk tautan masuk."
|
||||
|
||||
[plan.period]
|
||||
month = "bulan"
|
||||
@@ -6130,7 +5704,7 @@ modalTitle = "Mulai - {{planName}}"
|
||||
title = "Pilih Periode Penagihan"
|
||||
savingsNote = "Hemat {{percent}}% dengan penagihan tahunan"
|
||||
basePrice = "Harga Dasar"
|
||||
seatPrice = "Per Seat"
|
||||
seatPrice = "Per Pengguna"
|
||||
totalForSeats = "Total ({{count}} seat)"
|
||||
selectMonthly = "Pilih Bulanan"
|
||||
selectYearly = "Pilih Tahunan"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistem audit tidak tersedia"
|
||||
notAvailableMessage = "Sistem audit belum dikonfigurasi atau tidak tersedia."
|
||||
disabled = "Pencatatan audit dinonaktifkan"
|
||||
disabledMessage = "Aktifkan pencatatan audit di konfigurasi aplikasi Anda untuk melacak peristiwa sistem."
|
||||
enterpriseRequired = "Diperlukan Lisensi Enterprise"
|
||||
enterpriseRequiredMessage = "Sistem pencatatan audit adalah fitur enterprise. Harap tingkatkan ke lisensi enterprise untuk mengakses log audit dan analitik."
|
||||
|
||||
[audit.error]
|
||||
title = "Kesalahan saat memuat sistem audit"
|
||||
@@ -6335,7 +5907,7 @@ label = "Pilih Server"
|
||||
description = "Server self-hosted"
|
||||
|
||||
[setup.step3]
|
||||
label = "Login"
|
||||
label = "Masuk"
|
||||
description = "Masukkan kredensial"
|
||||
|
||||
[setup.mode.saas]
|
||||
@@ -6370,7 +5942,6 @@ description = "Masukkan URL lengkap server Stirling PDF self-hosted Anda"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Masukkan URL server"
|
||||
invalidUrl = "Format URL tidak valid. Harap masukkan URL yang valid seperti https://your-server.com"
|
||||
unreachable = "Tidak dapat terhubung ke server"
|
||||
testFailed = "Tes koneksi gagal"
|
||||
configFetch = "Gagal mengambil konfigurasi server. Periksa URL dan coba lagi."
|
||||
@@ -6386,10 +5957,9 @@ step3 = "Mulai ulang server"
|
||||
title = "Masuk"
|
||||
subtitle = "Masukkan kredensial Anda untuk melanjutkan"
|
||||
connectingTo = "Menghubungkan ke:"
|
||||
submit = "Login"
|
||||
submit = "Masuk"
|
||||
signInWith = "Masuk dengan"
|
||||
oauthPending = "Membuka browser untuk autentikasi..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Atau lanjut dengan email"
|
||||
serverRequirement = "Catatan: Server harus mengaktifkan login."
|
||||
showInstructions = "Bagaimana cara mengaktifkannya?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Reset Perubahan"
|
||||
downloadJson = "Unduh JSON"
|
||||
generatePdf = "Buat PDF"
|
||||
saveChanges = "Simpan Perubahan"
|
||||
applyChanges = "Terapkan Perubahan"
|
||||
downloadCopy = "Unduh Salinan"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Sesuaikan teks otomatis ke kotak"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tips: Tahan Ctrl (Cmd) atau Shift untuk memilih beberapa ko
|
||||
title = "Kunci teks yang diedit ke satu elemen PDF"
|
||||
description = "Saat diaktifkan, editor mengekspor setiap kotak teks yang diedit sebagai satu elemen teks PDF untuk menghindari glif yang saling tumpang tindih atau font campuran."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Pengaturan Lanjutan"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Batasan Pratinjau"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus Teks dan Gambar"
|
||||
text = "Ruang kerja ini berfokus pada pengeditan teks dan memosisikan ulang gambar tersemat. Karya seni halaman yang kompleks, widget formulir, dan grafik berlapis dipertahankan untuk ekspor tetapi tidak sepenuhnya dapat diedit di sini."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Perbedaan Pratinjau"
|
||||
text = "Beberapa visual (seperti batas tabel, bentuk, atau tampilan anotasi) mungkin tidak ditampilkan persis dalam pratinjau. PDF yang diekspor mempertahankan perintah gambar asli jika memungkinkan."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Penampil Alpha"
|
||||
text = "Penampil alpha ini masih berkembang—beberapa font, warna, efek transparansi, dan detail tata letak mungkin sedikit bergeser. Harap periksa kembali PDF yang dihasilkan sebelum dibagikan."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Gabungkan kotak yang dipilih"
|
||||
merge = "Gabungkan pilihan"
|
||||
@@ -6614,58 +6164,3 @@ title = "Hasil Tambah Teks"
|
||||
|
||||
[addText.error]
|
||||
failed = "Terjadi kesalahan saat menambahkan teks ke PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Unggah dari Ponsel"
|
||||
description = "Pindai untuk mengunggah foto. Gambar otomatis dikonversi ke PDF."
|
||||
descriptionNoConvert = "Pindai untuk mengunggah foto dari perangkat seluler Anda."
|
||||
error = "Kesalahan Koneksi"
|
||||
pollingError = "Kesalahan saat memeriksa file"
|
||||
sessionId = "ID Sesi"
|
||||
sessionCreateError = "Gagal membuat sesi"
|
||||
expiryWarning = "Sesi Akan Segera Berakhir"
|
||||
expiryWarningMessage = "Kode QR ini akan kedaluwarsa dalam {{seconds}} detik. Kode baru akan dibuat secara otomatis."
|
||||
filesReceived = "Menerima {{count}} file"
|
||||
connected = "Perangkat seluler terhubung"
|
||||
instructions = "Pindai dengan kamera ponsel Anda. Gambar otomatis dikonversi ke PDF."
|
||||
instructionsNoConvert = "Pindai dengan kamera ponsel Anda untuk mengunggah file."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Pemindai Ponsel"
|
||||
noSession = "Sesi Tidak Valid"
|
||||
noSessionMessage = "Harap pindai Kode QR yang valid untuk mengakses halaman ini."
|
||||
validating = "Memvalidasi sesi..."
|
||||
sessionInvalid = "Kesalahan Sesi"
|
||||
sessionExpired = "Sesi ini telah kedaluwarsa. Harap segarkan dan coba lagi."
|
||||
sessionNotFound = "Sesi tidak ditemukan. Harap segarkan dan coba lagi."
|
||||
sessionValidationError = "Tidak dapat memverifikasi sesi. Silakan coba lagi."
|
||||
uploadSuccess = "Unggah Berhasil!"
|
||||
uploadSuccessMessage = "Gambar Anda telah ditransfer."
|
||||
httpsRequired = "Akses kamera memerlukan HTTPS atau localhost. Harap gunakan HTTPS atau akses melalui localhost."
|
||||
uploadFailed = "Unggah gagal. Silakan coba lagi."
|
||||
uploading = "Mengunggah..."
|
||||
connected = "Terhubung"
|
||||
connecting = "Menyambungkan..."
|
||||
chooseMethod = "Pilih Metode Unggah"
|
||||
chooseMethodDescription = "Pilih cara Anda ingin memindai dan mengunggah dokumen"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Pindai dokumen menggunakan kamera perangkat Anda dengan deteksi tepi otomatis"
|
||||
fileUpload = "Unggah File"
|
||||
fileDescription = "Unggah foto atau dokumen yang sudah ada dari perangkat Anda"
|
||||
cameraAccessDenied = "Akses kamera ditolak. Harap aktifkan akses kamera."
|
||||
back = "Kembali"
|
||||
settings = "Pengaturan"
|
||||
edgeDetection = "Deteksi Tepi"
|
||||
flashlight = "Senter"
|
||||
flash = "Flash"
|
||||
processing = "Memproses..."
|
||||
capture = "Ambil Foto"
|
||||
selectFilesPrompt = "Pilih file untuk diunggah"
|
||||
selectImage = "Pilih Gambar"
|
||||
preview = "Pratinjau"
|
||||
retake = "Ambil Ulang"
|
||||
addToBatch = "Tambahkan ke Batch"
|
||||
upload = "Unggah"
|
||||
batchImages = "Batch"
|
||||
clearBatch = "Bersihkan"
|
||||
uploadAll = "Unggah Semua"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?"
|
||||
pendingRedactionsTitle = "Oscuramenti non applicati"
|
||||
pendingRedactions = "Hai oscuramenti non applicati che andranno persi."
|
||||
areYouSure = "Sei sicuro di voler uscire?"
|
||||
unsavedChangesTitle = "Modifiche non salvate"
|
||||
keepWorking = "Continua a lavorare"
|
||||
discardChanges = "Scarta modifiche"
|
||||
discardRedactions = "Scarta e esci"
|
||||
applyAndContinue = "Applica e continua"
|
||||
exportAndContinue = "Esporta e continua"
|
||||
cancel = "Annulla"
|
||||
@@ -343,10 +340,6 @@ advance = "Avanzate"
|
||||
edit = "Visualizza & Modifica"
|
||||
popular = "Popolare"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferenze"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avanzate"
|
||||
title = "Sicurezza e autenticazione"
|
||||
security = "Sicurezza"
|
||||
connections = "Connessioni"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licenze e Analytics"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versione attuale"
|
||||
latestVersion = "Ultima versione"
|
||||
checkForUpdates = "Controlla aggiornamenti"
|
||||
viewDetails = "Vedi dettagli"
|
||||
serverNeedsUpdate = "Il server deve essere aggiornato dall'amministratore"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informazioni sulla versione"
|
||||
description = "Dettagli versione desktop e server"
|
||||
desktop = "Versione Desktop"
|
||||
server = "Versione Server"
|
||||
|
||||
[settings.security]
|
||||
title = "Sicurezza"
|
||||
description = "Aggiorna la password per mantenere sicuro il tuo account."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Cambia la password. Verrai disconnesso dopo l'aggiornamento."
|
||||
required = "Tutti i campi sono obbligatori."
|
||||
mismatch = "Le nuove password non corrispondono."
|
||||
error = "Impossibile aggiornare la password. Verifica la password attuale e riprova."
|
||||
success = "Password aggiornata correttamente. Accedi di nuovo."
|
||||
ssoDisabled = "Le modifiche alla password sono gestite dal tuo provider di identità."
|
||||
current = "Password attuale"
|
||||
currentPlaceholder = "Inserisci la tua password attuale"
|
||||
new = "Nuova password"
|
||||
newPlaceholder = "Inserisci una nuova password"
|
||||
confirm = "Conferma nuova password"
|
||||
confirmPlaceholder = "Reinserisci la nuova password"
|
||||
update = "Aggiorna password"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Scorciatoie da tastiera"
|
||||
@@ -522,16 +488,11 @@ low = "Bassa"
|
||||
title = "Cambia credenziali"
|
||||
header = "Aggiorna i dettagli del tuo account"
|
||||
changePassword = "Stai utilizzando le credenziali di accesso predefinite. Inserisci una nuova password"
|
||||
ssoManaged = "Il tuo account è gestito dal tuo provider di identità."
|
||||
newUsername = "Nuovo nome utente"
|
||||
oldPassword = "Password attuale"
|
||||
newPassword = "Nuova Password"
|
||||
confirmNewPassword = "Conferma nuova Password"
|
||||
submit = "Invia modifiche"
|
||||
credsUpdated = "Account aggiornato"
|
||||
description = "Modifiche salvate. Accedi di nuovo."
|
||||
error = "Impossibile aggiornare il nome utente. Verifica la password e riprova."
|
||||
changeUsername = "Aggiorna il nome utente. Verrai disconnesso dopo l'aggiornamento."
|
||||
|
||||
[account]
|
||||
title = "Impostazioni Account"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Impostazioni Account"
|
||||
adminSettings = "Impostazioni Admin - Aggiungi e Vedi Utenti"
|
||||
userControlSettings = "Impostazioni Utente"
|
||||
changeUsername = "Cambia nome utente"
|
||||
changeUsernameDescription = "Aggiorna il nome utente. Verrai disconnesso dopo l'aggiornamento."
|
||||
newUsernamePlaceholder = "Inserisci il nuovo nome utente"
|
||||
newUsername = "Nuovo nome utente"
|
||||
password = "Conferma Password"
|
||||
oldPassword = "Vecchia Password"
|
||||
@@ -749,11 +708,6 @@ tags = "firma,autografo"
|
||||
title = "Firma"
|
||||
desc = "Aggiungi una firma al PDF da disegno, testo o immagine."
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotare,evidenziare,disegnare"
|
||||
title = "Annota"
|
||||
desc = "Evidenzia, disegna, aggiungi note e forme nel visualizzatore"
|
||||
|
||||
[home.flatten]
|
||||
tags = "semplifica,rimuovi,interattivo"
|
||||
title = "Appiattisci"
|
||||
@@ -976,7 +930,6 @@ desc = "Aggiungi testo personalizzato ovunque nel tuo PDF"
|
||||
addFiles = "Aggiungi file"
|
||||
uploadFromComputer = "Carica dal computer"
|
||||
openFromComputer = "Apri dal computer"
|
||||
mobileUpload = "Carica da dispositivo mobile"
|
||||
|
||||
[viewPdf]
|
||||
tags = "visualizzare,leggere,annotare,testo,immagine"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opzioni CBZ in PDF"
|
||||
optimizeForEbook = "Ottimizza il PDF per i lettori ebook (usa Ghostscript)"
|
||||
cbzOutputOptions = "Opzioni PDF in CBZ"
|
||||
cbzDpi = "DPI per il rendering delle immagini"
|
||||
cbrOptions = "Opzioni CBR"
|
||||
cbrOutputOptions = "Opzioni da PDF a CBR"
|
||||
cbrDpi = "DPI per il rendering delle immagini"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opzioni da eBook a PDF"
|
||||
ebookOptionsDesc = "Opzioni per convertire eBook in PDF"
|
||||
embedAllFonts = "Incorpora tutti i font"
|
||||
embedAllFontsDesc = "Incorpora tutti i font dell'eBook nel PDF generato"
|
||||
includeTableOfContents = "Includi indice"
|
||||
includeTableOfContentsDesc = "Aggiungi un indice generato al PDF risultante"
|
||||
includePageNumbers = "Includi numeri di pagina"
|
||||
includePageNumbersDesc = "Aggiungi i numeri di pagina al PDF generato"
|
||||
optimizeForEbookPdf = "Ottimizza per lettori eBook"
|
||||
optimizeForEbookPdfDesc = "Ottimizza il PDF per la lettura su eBook (dimensione file ridotta, migliore resa su dispositivi e-Ink)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opzioni da PDF a eBook"
|
||||
epubOptionsDesc = "Opzioni per convertire PDF in EPUB/AZW3"
|
||||
detectChapters = "Rileva capitoli"
|
||||
detectChaptersDesc = "Rileva intestazioni simili a capitoli e inserisci interruzioni di pagina EPUB"
|
||||
targetDevice = "Dispositivo di destinazione"
|
||||
targetDeviceDesc = "Scegli un profilo di output ottimizzato per il dispositivo di lettura"
|
||||
outputFormat = "Formato di output"
|
||||
outputFormatDesc = "Scegli il formato di output per l'eBook"
|
||||
tabletPhone = "Tablet/Telefono (con immagini)"
|
||||
kindleEink = "Kindle e-Ink (ottimizzato per testo)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversione,img,jpg,immagine,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Aggiungi allegati"
|
||||
add = "Aggiungi allegato"
|
||||
remove = "Rimuovi allegato"
|
||||
embed = "Incorpora allegato"
|
||||
convertToPdfA3b = "Converti in PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Crea un PDF per archiviazione con allegati incorporati"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b è un formato di archiviazione che garantisce la conservazione a lungo termine. Consente di incorporare formati di file arbitrari come allegati. La conversione richiede Ghostscript e può richiedere più tempo per file di grandi dimensioni."
|
||||
convertToPdfA3bTooltipHeader = "Informazioni sulla conversione in PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Cosa fa"
|
||||
submit = "Aggiungi allegati"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Salvate"
|
||||
label = "Carica immagine firma"
|
||||
placeholder = "Seleziona file immagine"
|
||||
hint = "Carica un'immagine PNG o JPG della tua firma"
|
||||
removeBackground = "Rimuovi sfondo bianco (rendi trasparente)"
|
||||
processing = "Elaborazione immagine..."
|
||||
backgroundRemovalFailedTitle = "Rimozione dello sfondo non riuscita"
|
||||
backgroundRemovalFailedMessage = "Impossibile rimuovere lo sfondo dall'immagine. Verrà utilizzata l'immagine originale."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Come aggiungere la firma"
|
||||
@@ -2434,11 +2351,6 @@ note = "L'appiattimento rimuove gli elementi interattivi dal PDF, rendendoli non
|
||||
label = "Appiattisci solo i moduli"
|
||||
desc = "Appiattisci solo i campi modulo, lasciando intatti gli altri elementi interattivi"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI di rendering (opzionale, consigliato 150 DPI)"
|
||||
help = "Lascia vuoto per usare il valore predefinito di sistema. Un DPI più alto aumenta la nitidezza ma incrementa il tempo di elaborazione e la dimensione del file."
|
||||
placeholder = "es. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Risultati di appiattimento"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Ritaglia PDF"
|
||||
submit = "Invia"
|
||||
noFileSelected = "Seleziona un file PDF per iniziare il ritaglio"
|
||||
reset = "Reimposta all’intero PDF"
|
||||
autoCrop = "Ritaglio automatico spazi bianchi"
|
||||
|
||||
[crop.preview]
|
||||
title = "Selezione area di ritaglio"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metodo di redazione"
|
||||
mode = "Modalità"
|
||||
automatic = "Automatica"
|
||||
automaticDesc = "Redigi testo in base ai termini di ricerca"
|
||||
automaticDisabledTooltip = "Seleziona i file nel gestore file per oscurare più file contemporaneamente"
|
||||
manual = "Manuale"
|
||||
manualDesc = "Clicca e trascina per redigere aree specifiche"
|
||||
manualComingSoon = "Redazione manuale in arrivo"
|
||||
@@ -3315,35 +3225,8 @@ text = "Abbina solo parole complete, non corrispondenze parziali. 'Mario' non co
|
||||
title = "Converti in PDF‑immagine"
|
||||
text = "Converte il PDF in un PDF basato su immagini dopo la redazione. Garantisce che il testo dietro i riquadri sia completamente rimosso e non recuperabile."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controlli di oscuramento manuale"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Strumento Contrassegna testo"
|
||||
text = "Seleziona direttamente il testo sul PDF per contrassegnarlo per l'oscuramento. Clicca e trascina per evidenziare il testo specifico che vuoi oscurare."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Strumento Contrassegna area"
|
||||
text = "Disegna aree rettangolari sul PDF per contrassegnare regioni da oscurare. Utile per oscurare immagini, firme o forme irregolari."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Applica oscuramenti"
|
||||
text = "Dopo aver contrassegnato i contenuti, fai clic su 'Applica' per oscurare in modo permanente tutte le aree contrassegnate. Il conteggio in sospeso mostra quante oscuramenti sono pronti per essere applicati."
|
||||
bullet1 = "Contrassegna quante aree necessarie prima di applicare"
|
||||
bullet2 = "Tutti gli oscuramenti in sospeso vengono applicati in una volta sola"
|
||||
bullet3 = "Gli oscuramenti non possono essere annullati dopo l'applicazione"
|
||||
|
||||
[redact.manual]
|
||||
title = "Strumenti di oscuramento"
|
||||
instructions = "Seleziona testo o disegna aree sul PDF per contrassegnare contenuti da oscurare."
|
||||
markText = "Contrassegna testo"
|
||||
markArea = "Contrassegna area"
|
||||
pendingLabel = "In sospeso:"
|
||||
applyWarning = "⚠️ Applicazione permanente, non può essere annullata e i dati sottostanti verranno eliminati"
|
||||
apply = "Applica"
|
||||
noMarks = "Nessun contrassegno di oscuramento. Usa gli strumenti sopra per contrassegnare contenuti da oscurare."
|
||||
header = "Redazione manuale"
|
||||
controlsTitle = "Controlli di oscuramento manuale"
|
||||
textBasedRedaction = "Redazione basata su testo"
|
||||
pageBasedRedaction = "Redazione per pagina"
|
||||
convertPDFToImageLabel = "Converti PDF in PDF‑immagine (usato per rimuovere testo dietro il riquadro)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Inserire il numero di divisioni orizzontali"
|
||||
label = "Divisioni verticali"
|
||||
placeholder = "Inserire il numero di divisioni verticali"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Modalità di suddivisione"
|
||||
description = "Scegli come suddividere le pagine"
|
||||
splitAll = "Dividi tutte le pagine"
|
||||
splitAllExceptFirst = "Dividi tutte tranne la prima"
|
||||
splitAllExceptLast = "Dividi tutte tranne l'ultima"
|
||||
splitAllExceptFirstAndLast = "Dividi tutte tranne la prima e l'ultima"
|
||||
custom = "Pagine personalizzate"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Numeri di pagina personalizzati"
|
||||
placeholder = "es. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Timbro,Aggiungi immagine,Centra immagine,Filigrana,PDF,Incorpora,Personalizza"
|
||||
header = "Timbro PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Dimensione"
|
||||
[compress.grayscale]
|
||||
label = "Applica scala di grigio per la compressione"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearizza PDF per visualizzazione web rapida"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Converti le immagini in disegno al tratto"
|
||||
description = "Usa ImageMagick per ridurre le pagine a bianco e nero ad alto contrasto per la massima riduzione delle dimensioni."
|
||||
unavailable = "ImageMagick non è installato o abilitato su questo server"
|
||||
detailLevel = "Livello di dettaglio"
|
||||
edgeEmphasis = "Enfasi dei bordi"
|
||||
edgeLow = "Leggera"
|
||||
edgeMedium = "Bilanciata"
|
||||
edgeHigh = "Forte"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Panoramica impostazioni di compressione"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Valori più alti riducono la dimensione del file"
|
||||
title = "Scala di grigi"
|
||||
text = "Seleziona questa opzione per convertire tutte le immagini in bianco e nero, il che può ridurre significativamente la dimensione, specialmente per PDF scansionati o ricchi di immagini."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Disegno al tratto"
|
||||
text = "Converti le pagine in bianco e nero ad alto contrasto usando ImageMagick. Usa il livello di dettaglio per controllare quanto contenuto diventa nero e l'enfasi dei bordi per controllare l'aggressività del rilevamento dei bordi."
|
||||
|
||||
[compress.error]
|
||||
failed = "Si è verificato un errore durante la compressione del PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Si è verificato un errore durante la compressione del PDF."
|
||||
_value = "Impostazioni di compressione"
|
||||
1 = "1-3 Compressione PDF,</br> 4-6 Compressione immagine leggera,</br> 7-9 Compressione immagine intensa Ridurrà drasticamente la qualità dell'immagine"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valori più bassi preservano la qualità ma producono file più grandi"
|
||||
range4to6 = "Compressione media con riduzione moderata della qualità"
|
||||
range7to9 = "Valori più alti riducono significativamente la dimensione del file ma possono ridurre la chiarezza delle immagini"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Questo file è protetto da password. Inserisci la password:"
|
||||
cancelled = "Operazione annullata per il PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Elimina pagine selezionate"
|
||||
closePdf = "Chiudi PDF"
|
||||
exportAll = "Esporta PDF"
|
||||
downloadSelected = "Scarica file selezionati"
|
||||
annotations = "Annotazioni"
|
||||
exportSelected = "Esporta pagine selezionate"
|
||||
saveChanges = "Salva modifiche"
|
||||
downloadAll = "Scarica tutto"
|
||||
saveAll = "Salva tutto"
|
||||
toggleTheme = "Cambia tema"
|
||||
toggleBookmarks = "Mostra/Nascondi segnalibri"
|
||||
language = "Lingua"
|
||||
toggleAnnotations = "Attiva/disattiva visibilità annotazioni"
|
||||
search = "Cerca nel PDF"
|
||||
panMode = "Modalità mano"
|
||||
applyRedactionsFirst = "Applica prima gli oscuramenti"
|
||||
rotateLeft = "Ruota a sinistra"
|
||||
rotateRight = "Ruota a destra"
|
||||
toggleSidebar = "Mostra/Nascondi barra laterale"
|
||||
toggleBookmarks = "Mostra/Nascondi segnalibri"
|
||||
exportSelected = "Esporta pagine selezionate"
|
||||
toggleAnnotations = "Attiva/disattiva visibilità annotazioni"
|
||||
annotationMode = "Attiva/disattiva modalità annotazione"
|
||||
print = "Stampa PDF"
|
||||
draw = "Disegna"
|
||||
redact = "Oscura"
|
||||
exitRedaction = "Esci dalla modalità di oscuramento"
|
||||
save = "Salva"
|
||||
downloadAll = "Scarica tutto"
|
||||
saveAll = "Salva tutto"
|
||||
|
||||
[textAlign]
|
||||
left = "Sinistra"
|
||||
center = "Centro"
|
||||
right = "Destra"
|
||||
|
||||
[annotation]
|
||||
title = "Annota"
|
||||
desc = "Usa evidenziatore, penna, testo e note. Le modifiche restano attive—nessun appiattimento richiesto."
|
||||
highlight = "Evidenziatore"
|
||||
pen = "Penna"
|
||||
text = "Casella di testo"
|
||||
note = "Nota"
|
||||
rectangle = "Rettangolo"
|
||||
ellipse = "Ellisse"
|
||||
select = "Seleziona"
|
||||
exit = "Esci dalla modalità annotazione"
|
||||
strokeWidth = "Spessore"
|
||||
opacity = "Opacità"
|
||||
strokeOpacity = "Opacità tratto"
|
||||
fillOpacity = "Opacità riempimento"
|
||||
fontSize = "Dimensione carattere"
|
||||
chooseColor = "Scegli colore"
|
||||
color = "Colore"
|
||||
strokeColor = "Colore del tratto"
|
||||
fillColor = "Colore di riempimento"
|
||||
underline = "Sottolinea"
|
||||
strikeout = "Barrato"
|
||||
squiggly = "Ondulato"
|
||||
inkHighlighter = "Evidenziatore a mano libera"
|
||||
freehandHighlighter = "Evidenziatore a mano libera"
|
||||
square = "Quadrato"
|
||||
circle = "Cerchio"
|
||||
polygon = "Poligono"
|
||||
line = "Linea"
|
||||
stamp = "Aggiungi immagine"
|
||||
textMarkup = "Markup del testo"
|
||||
drawing = "Disegno"
|
||||
shapes = "Forme"
|
||||
notesStamps = "Note e timbri"
|
||||
settings = "Impostazioni"
|
||||
borderOn = "Bordo: attivo"
|
||||
borderOff = "Bordo: disattivato"
|
||||
editInk = "Modifica penna"
|
||||
editLine = "Modifica linea"
|
||||
editNote = "Modifica nota"
|
||||
editText = "Modifica casella di testo"
|
||||
editTextMarkup = "Modifica markup testo"
|
||||
editSelected = "Modifica annotazione"
|
||||
editSquare = "Modifica quadrato"
|
||||
editCircle = "Modifica cerchio"
|
||||
editPolygon = "Modifica poligono"
|
||||
unsupportedType = "Questo tipo di annotazione non è completamente supportato per la modifica."
|
||||
textAlignment = "Allineamento testo"
|
||||
noteIcon = "Icona nota"
|
||||
imagePreview = "Anteprima"
|
||||
contents = "Testo"
|
||||
backgroundColor = "Colore di sfondo"
|
||||
clearBackground = "Rimuovi sfondo"
|
||||
noBackground = "Nessuno sfondo"
|
||||
stampSettings = "Impostazioni timbro"
|
||||
savingCopy = "Preparazione del download..."
|
||||
saveFailed = "Impossibile salvare la copia"
|
||||
saveReady = "Download pronto"
|
||||
selectAndMove = "Seleziona e modifica"
|
||||
editSelectDescription = "Fai clic su un'annotazione esistente per modificarne colore, opacità, testo o dimensione."
|
||||
editStampHint = "Per cambiare l'immagine, elimina questo timbro e aggiungine uno nuovo."
|
||||
editSwitchToSelect = "Passa a Seleziona e modifica per modificare questa annotazione."
|
||||
undo = "Annulla"
|
||||
redo = "Ripristina"
|
||||
applyChanges = "Applica modifiche"
|
||||
saveChanges = "Salva modifiche"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Opzioni"
|
||||
adminSettings = "Opzioni Admin"
|
||||
allTools = "Funzioni"
|
||||
reader = "Lettore"
|
||||
tours = "Tour"
|
||||
showMeAround = "Fammi fare un giro"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Guarda qui le guide: Tour strumenti, Tour del nuovo layout V2 e Tour amministratore."
|
||||
user = "Guarda qui le guide: Tour strumenti e Tour del nuovo layout V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tour strumenti"
|
||||
toolsTourDesc = "Scopri cosa possono fare gli strumenti"
|
||||
adminTour = "Tour amministratore"
|
||||
adminTourDesc = "Esplora impostazioni e funzionalità di amministrazione"
|
||||
whatsNewTour = "Vedi le novità in V2"
|
||||
whatsNewTourDesc = "Visita il layout aggiornato"
|
||||
|
||||
[admin]
|
||||
error = "Errore"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Impossibile caricare le impostazioni"
|
||||
saveError = "Impossibile salvare le impostazioni"
|
||||
saved = "Impostazioni salvate con successo"
|
||||
saveSuccess = "Impostazioni salvate con successo"
|
||||
success = "Impostazioni salvate correttamente"
|
||||
error = "Salvataggio impostazioni non riuscito"
|
||||
save = "Salva modifiche"
|
||||
discard = "Scarta"
|
||||
restartRequired = "Riavvio richiesto"
|
||||
@@ -4422,13 +4185,6 @@ description = "Percorso dell'eseguibile WeasyPrint per conversione da HTML a PDF
|
||||
label = "Eseguibile Unoconvert"
|
||||
description = "Percorso di LibreOffice unoconvert per conversioni di documenti (lascia vuoto per predefinito: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "URL frontend"
|
||||
description = "URL di base per il frontend (es., https://pdf.example.com). Usato per link di invito via email e caricamenti tramite QR code da mobile. Lascia vuoto per usare l'URL del backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Fai clic per vedere i dettagli del piano"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sicurezza"
|
||||
description = "Configura autenticazione, comportamento di accesso e politiche di sicurezza."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Connetti"
|
||||
disconnect = "Disconnetti"
|
||||
disconnected = "Provider disconnesso con successo"
|
||||
disconnectError = "Impossibile disconnettere il provider"
|
||||
mobileScannerConvertToPdf = "Converti immagini in PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converte automaticamente le immagini caricate in formato PDF. Se disabilitato, le immagini verranno mantenute così come sono."
|
||||
mobileScannerImageResolution = "Risoluzione immagine"
|
||||
mobileScannerImageResolutionDesc = "Risoluzione delle immagini caricate. \"Ridotta\" ridimensiona le immagini a max 1200px per ridurre la dimensione del file."
|
||||
imageResolutionFull = "Piena (dimensione originale)"
|
||||
imageResolutionReduced = "Ridotta (max 1200px)"
|
||||
mobileScannerPageFormat = "Formato pagina"
|
||||
mobileScannerPageFormatDesc = "Dimensione pagina PDF per le immagini convertite. \"Mantieni\" usa le dimensioni originali dell'immagine."
|
||||
pageFormatKeep = "Mantieni (dimensioni originali)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Adatta alla pagina"
|
||||
mobileScannerStretchToFitDesc = "Allunga le immagini per riempire l'intera pagina. Se disabilitato, le immagini sono centrate mantenendo le proporzioni."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Accesso automatico SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Crea automaticamente account utente al primo login SAML2"
|
||||
label = "Blocca registrazione"
|
||||
description = "Impedisci la registrazione di nuovi utenti tramite SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Caricamento da cellulare"
|
||||
enable = "Abilita caricamento via QR code"
|
||||
description = "Consenti agli utenti di caricare file da dispositivi mobili scansionando un QR code"
|
||||
note = "Nota: richiede la configurazione dell'URL frontend. "
|
||||
link = "Configura nelle Impostazioni di sistema"
|
||||
mobileScannerConvertToPdf = "Converti immagini in PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converte automaticamente le immagini caricate in formato PDF. Se disabilitato, le immagini verranno mantenute così come sono."
|
||||
mobileScannerImageResolution = "Risoluzione immagine"
|
||||
mobileScannerImageResolutionDesc = "Risoluzione delle immagini caricate. \"Ridotta\" ridimensiona le immagini a max 1200px per ridurre la dimensione del file."
|
||||
imageResolutionFull = "Piena (dimensione originale)"
|
||||
imageResolutionReduced = "Ridotta (max 1200px)"
|
||||
mobileScannerPageFormat = "Formato pagina"
|
||||
mobileScannerPageFormatDesc = "Dimensione pagina PDF per le immagini convertite. \"Mantieni\" usa le dimensioni originali dell'immagine."
|
||||
pageFormatKeep = "Mantieni (dimensioni originali)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Adatta alla pagina"
|
||||
mobileScannerStretchToFitDesc = "Allunga le immagini per riempire l'intera pagina. Se disabilitato, le immagini sono centrate mantenendo le proporzioni."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot Telegram"
|
||||
description = "Configura la connettività del bot Telegram, i controlli di accesso e il comportamento dei messaggi di feedback."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Abilita bot Telegram"
|
||||
description = "Consenti agli utenti di interagire con Stirling PDF tramite il tuo bot Telegram configurato."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nome utente bot"
|
||||
description = "Il nome utente pubblico del tuo bot Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot Token"
|
||||
description = "Token API fornito da BotFather per il tuo bot Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Cartella Inbox"
|
||||
description = "Cartella sotto la directory pipeline in cui vengono archiviati i file Telegram in arrivo."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Usa suffisso cartella personalizzato"
|
||||
description = "Aggiungi l'ID chat alle cartelle dei file in arrivo per isolare i caricamenti per chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Controllo accessi"
|
||||
description = "Limita quali utenti o canali possono interagire con il bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Consenti ID utente specifici"
|
||||
description = "Se abilitato, solo gli ID utente elencati possono usare il bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID utente consentiti"
|
||||
description = "Inserisci gli ID utente Telegram autorizzati a interagire con il bot."
|
||||
placeholder = "Aggiungi ID utente e premi invio"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Consenti ID canale specifici"
|
||||
description = "Se abilitato, solo gli ID canale elencati possono usare il bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID canale consentiti"
|
||||
description = "Inserisci gli ID canale Telegram autorizzati a interagire con il bot."
|
||||
placeholder = "Aggiungi ID canale e premi invio"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Elaborazione"
|
||||
description = "Controlla intervalli di polling e timeout di elaborazione per i caricamenti Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Timeout elaborazione (secondi)"
|
||||
description = "Tempo massimo di attesa per un processo prima di segnalare un errore."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Intervallo di polling (ms)"
|
||||
description = "Intervallo tra i controlli per nuovi aggiornamenti Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Messaggi di feedback"
|
||||
description = "Scegli quando il bot deve inviare feedback a utenti e canali."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Abilita feedback"
|
||||
description = "Controlla se il bot invia messaggi di feedback."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regole di feedback per canali"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Mostra \"Nessun documento valido\" (Canali)"
|
||||
description = "Sopprimi la risposta \"nessun documento valido\" per i caricamenti nei canali."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Mostra errori di elaborazione (Canali)"
|
||||
description = "Invia messaggi di errore di elaborazione ai canali."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Mostra messaggi di errore (Canali)"
|
||||
description = "Mostra messaggi di errore dettagliati per i canali."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regole di feedback per utenti"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Mostra \"Nessun documento valido\" (Utenti)"
|
||||
description = "Sopprimi la risposta \"nessun documento valido\" per i caricamenti degli utenti."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Mostra errori di elaborazione (Utenti)"
|
||||
description = "Invia messaggi di errore di elaborazione agli utenti."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Mostra messaggi di errore (Utenti)"
|
||||
description = "Mostra messaggi di errore dettagliati per gli utenti."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
description = "Configura impostazioni personalizzate di connessione al database per distribuzioni enterprise."
|
||||
@@ -4943,10 +4570,6 @@ description = "Consenti agli admin di invitare utenti via email con password gen
|
||||
label = "URL frontend"
|
||||
description = "URL di base del frontend (es. https://pdf.example.com). Usato per generare i link di invito nelle email. Lascia vuoto per usare l'URL del backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Nota: richiede la configurazione dell'URL frontend. "
|
||||
link = "Configura nelle Impostazioni di sistema"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documenti legali"
|
||||
description = "Configura i link a documenti e policy legali."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "I miei file"
|
||||
noRecentFiles = "Nessun file recente trovato"
|
||||
googleDriveNotAvailable = "Integrazione Google Drive non disponibile"
|
||||
mobileUpload = "Caricamento da mobile"
|
||||
mobileShort = "Mobile"
|
||||
mobileUploadNotAvailable = "Caricamento da mobile non abilitato"
|
||||
downloadSelected = "Scarica selezionati"
|
||||
saveSelected = "Salva selezionati"
|
||||
openFiles = "Apri file"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Caricamento..."
|
||||
back = "Indietro"
|
||||
continue = "Continua"
|
||||
error = "Errore"
|
||||
save = "Salva"
|
||||
|
||||
[config.overview]
|
||||
title = "Configurazione applicazione"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Qualsiasi applicazione o servizio che usa attualmente queste chiavi sm
|
||||
confirmPrompt = "Sei sicuro di voler continuare?"
|
||||
confirmCta = "Aggiorna chiavi"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Errore API Key"
|
||||
failedToCreateApiKey = "Creazione della API key non riuscita."
|
||||
failedToRetrieveApiKey = "Impossibile recuperare la API key dalla risposta."
|
||||
failedToFetchApiKey = "Impossibile recuperare la API key."
|
||||
apiKeyRefreshed = "API Key aggiornata"
|
||||
apiKeyRefreshedBody = "La tua API key è stata aggiornata correttamente."
|
||||
failedToRefreshApiKey = "Aggiornamento della API key non riuscito."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Seleziona allegati"
|
||||
info = "Seleziona i file da allegare al tuo PDF. Questi file saranno incorporati e accessibili tramite il pannello allegati del PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Fine"
|
||||
startTour = "Avvia tour"
|
||||
startTourDescription = "Fai un tour guidato delle funzioni chiave di Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Inizia dalla barra <strong>Accesso rapido</strong> per passare tra Reader, Automate, i tuoi file e tutti i tour."
|
||||
leftPanel = "Il pannello <strong>Strumenti</strong> a sinistra elenca tutto ciò che puoi fare. Sfoglia le categorie o cerca per trovare rapidamente uno strumento."
|
||||
fileUpload = "Usa il pulsante <strong>File</strong> per caricare o scegliere un PDF recente. Caricheremo un esempio per mostrarti l'area di lavoro."
|
||||
rightRail = "La <strong>barra destra</strong> contiene azioni rapide per selezionare i file, cambiare tema o lingua e scaricare i risultati."
|
||||
topBar = "La barra superiore consente di passare tra <strong>Visualizzatore</strong>, <strong>Editor pagine</strong> e <strong>File attivi</strong>."
|
||||
pageEditorView = "Passa all'Editor pagine per riordinare, ruotare o eliminare pagine."
|
||||
activeFilesView = "Usa File attivi per vedere tutto ciò che hai aperto e scegliere su cosa lavorare."
|
||||
wrapUp = "Queste sono le novità della V2. Apri il menu <strong>Tour</strong> in qualsiasi momento per rivedere questo, il Tour strumenti o il Tour amministratore."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Benvenuto in Stirling PDF!"
|
||||
description = "Vuoi fare un tour rapido di 1 minuto per imparare le funzioni chiave e come iniziare?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Scarica →"
|
||||
showMeAround = "Fammi fare un tour"
|
||||
skipTheTour = "Salta il tour"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Panoramica del tour"
|
||||
body = "Stirling PDF V2 include dozzine di strumenti e un layout rinnovato. Fai un breve tour per vedere cosa è cambiato e dove trovare le funzionalità che ti servono."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Salta per ora"
|
||||
seePlans = "Vedi piani →"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contatta il reparto vendite"
|
||||
contactToUpgrade = "Contattaci per aggiornare o personalizzare il tuo piano"
|
||||
maxUsers = "Utenti massimi"
|
||||
upTo = "Fino a"
|
||||
getLicense = "Ottieni licenza server"
|
||||
upgradeToEnterprise = "Esegui l'upgrade a Enterprise"
|
||||
selectPeriod = "Seleziona periodo di fatturazione"
|
||||
monthlyBilling = "Fatturazione mensile"
|
||||
yearlyBilling = "Fatturazione annuale"
|
||||
checkoutOpened = "Checkout aperto"
|
||||
checkoutInstructions = "Completa l'acquisto nella scheda Stripe. Dopo il pagamento, torna qui e aggiorna la pagina per attivare la licenza. Riceverai anche un'email con la tua chiave di licenza."
|
||||
activateLicense = "Attiva la tua licenza"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout aperto in nuova scheda"
|
||||
instructions = "Completa l'acquisto nella scheda Stripe. Una volta completato il pagamento, riceverai un'email con la tua chiave di licenza."
|
||||
enterKey = "Inserisci di seguito la chiave di licenza per attivare il piano:"
|
||||
keyDescription = "Incolla la chiave di licenza dall'email"
|
||||
activate = "Attiva licenza"
|
||||
doLater = "Lo farò più tardi"
|
||||
success = "Licenza attivata!"
|
||||
successMessage = "La licenza è stata attivata correttamente. Ora puoi chiudere questa finestra."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Verifica email necessaria"
|
||||
message = "Dovrai verificare il tuo indirizzo email nel portale di fatturazione Stripe. Controlla la tua email per un link di accesso."
|
||||
|
||||
[plan.period]
|
||||
month = "mese"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistema di audit non disponibile"
|
||||
notAvailableMessage = "Il sistema di audit non è configurato o non è disponibile."
|
||||
disabled = "La registrazione dell'audit è disattivata"
|
||||
disabledMessage = "Abilita la registrazione dell'audit nella configurazione dell'applicazione per tracciare gli eventi di sistema."
|
||||
enterpriseRequired = "Richiesta licenza Enterprise"
|
||||
enterpriseRequiredMessage = "Il sistema di audit logging è una funzionalità Enterprise. Esegui l'upgrade a una licenza Enterprise per accedere ai log di audit e alle analitiche."
|
||||
|
||||
[audit.error]
|
||||
title = "Errore nel caricamento del sistema di audit"
|
||||
@@ -6370,7 +5942,6 @@ description = "Inserisci l'URL completo del tuo server Stirling PDF self-hosted"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Inserisci un URL del server"
|
||||
invalidUrl = "Formato URL non valido. Inserisci un URL valido come https://your-server.com"
|
||||
unreachable = "Impossibile connettersi al server"
|
||||
testFailed = "Test di connessione non riuscito"
|
||||
configFetch = "Impossibile recuperare la configurazione del server. Controlla l'URL e riprova."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Connessione a:"
|
||||
submit = "Accedi"
|
||||
signInWith = "Accedi con"
|
||||
oauthPending = "Apertura del browser per l'autenticazione..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Oppure continua con email"
|
||||
serverRequirement = "Nota: il server deve avere il login abilitato."
|
||||
showInstructions = "Come abilitarlo?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Reimposta modifiche"
|
||||
downloadJson = "Scarica JSON"
|
||||
generatePdf = "Genera PDF"
|
||||
saveChanges = "Salva modifiche"
|
||||
applyChanges = "Applica modifiche"
|
||||
downloadCopy = "Scarica copia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Ridimensiona automaticamente il testo alle caselle"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Suggerimento: Tieni premuto Ctrl (Cmd) o Shift per selezion
|
||||
title = "Blocca il testo modificato in un singolo elemento PDF"
|
||||
description = "Se attivato, l'editor esporta ogni casella di testo modificata come un unico elemento di testo PDF per evitare glifi sovrapposti o font misti."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Impostazioni avanzate"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitazioni anteprima"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Focus su testo e immagine"
|
||||
text = "Questo spazio di lavoro è incentrato sulla modifica del testo e sul riposizionamento delle immagini incorporate. Elementi grafici di pagina complessi, widget dei moduli e grafica stratificata sono preservati per l'esportazione ma non sono completamente modificabili qui."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variazioni in anteprima"
|
||||
text = "Alcuni elementi visivi (come bordi di tabelle, forme o aspetto delle annotazioni) potrebbero non essere visualizzati esattamente in anteprima. Il PDF esportato mantiene i comandi di disegno originali quando possibile."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visualizzatore alpha"
|
||||
text = "Questo visualizzatore alpha è ancora in evoluzione—alcuni font, colori, effetti di trasparenza e dettagli di layout possono variare leggermente. Controlla il PDF generato prima di condividerlo."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Unisci caselle selezionate"
|
||||
merge = "Unisci selezione"
|
||||
@@ -6614,58 +6164,3 @@ title = "Risultati aggiunta testo"
|
||||
|
||||
[addText.error]
|
||||
failed = "Si è verificato un errore durante l'aggiunta del testo al PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Carica da dispositivo mobile"
|
||||
description = "Scansiona per caricare foto. Le immagini vengono convertite automaticamente in PDF."
|
||||
descriptionNoConvert = "Scansiona per caricare foto dal tuo dispositivo mobile."
|
||||
error = "Errore di connessione"
|
||||
pollingError = "Errore nel controllo dei file"
|
||||
sessionId = "ID sessione"
|
||||
sessionCreateError = "Impossibile creare la sessione"
|
||||
expiryWarning = "Sessione in scadenza"
|
||||
expiryWarningMessage = "Questo QR code scadrà tra {{seconds}} secondi. Un nuovo codice verrà generato automaticamente."
|
||||
filesReceived = "{{count}} file ricevuti"
|
||||
connected = "Dispositivo mobile connesso"
|
||||
instructions = "Scansiona con la fotocamera del telefono. Le immagini vengono convertite automaticamente in PDF."
|
||||
instructionsNoConvert = "Scansiona con la fotocamera del telefono per caricare i file."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Scanner mobile"
|
||||
noSession = "Sessione non valida"
|
||||
noSessionMessage = "Scansiona un QR code valido per accedere a questa pagina."
|
||||
validating = "Validazione della sessione..."
|
||||
sessionInvalid = "Errore di sessione"
|
||||
sessionExpired = "Questa sessione è scaduta. Aggiorna e riprova."
|
||||
sessionNotFound = "Sessione non trovata. Aggiorna e riprova."
|
||||
sessionValidationError = "Impossibile verificare la sessione. Riprova."
|
||||
uploadSuccess = "Caricamento riuscito!"
|
||||
uploadSuccessMessage = "Le tue immagini sono state trasferite."
|
||||
httpsRequired = "L'accesso alla fotocamera richiede HTTPS o localhost. Usa HTTPS o accedi tramite localhost."
|
||||
uploadFailed = "Caricamento non riuscito. Riprova."
|
||||
uploading = "Caricamento..."
|
||||
connected = "Connesso"
|
||||
connecting = "Connessione..."
|
||||
chooseMethod = "Scegli metodo di caricamento"
|
||||
chooseMethodDescription = "Seleziona come vuoi scansionare e caricare documenti"
|
||||
camera = "Fotocamera"
|
||||
cameraDescription = "Scansiona documenti usando la fotocamera del dispositivo con rilevamento automatico dei bordi"
|
||||
fileUpload = "Caricamento file"
|
||||
fileDescription = "Carica foto o documenti esistenti dal tuo dispositivo"
|
||||
cameraAccessDenied = "Accesso alla fotocamera negato. Abilita l'accesso alla fotocamera."
|
||||
back = "Indietro"
|
||||
settings = "Impostazioni"
|
||||
edgeDetection = "Rilevamento bordi"
|
||||
flashlight = "Torcia"
|
||||
flash = "Flash"
|
||||
processing = "Elaborazione..."
|
||||
capture = "Scatta foto"
|
||||
selectFilesPrompt = "Seleziona i file da caricare"
|
||||
selectImage = "Seleziona immagine"
|
||||
preview = "Anteprima"
|
||||
retake = "Ripeti scatto"
|
||||
addToBatch = "Aggiungi al batch"
|
||||
upload = "Carica"
|
||||
batchImages = "Batch"
|
||||
clearBatch = "Svuota"
|
||||
uploadAll = "Carica tutto"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "PDF に未保存の変更があります。"
|
||||
pendingRedactionsTitle = "未適用の墨消し"
|
||||
pendingRedactions = "未適用の墨消しがあります。失われます。"
|
||||
areYouSure = "本当に離れますか?"
|
||||
unsavedChangesTitle = "未保存の変更"
|
||||
keepWorking = "作業を続ける"
|
||||
discardChanges = "変更を破棄"
|
||||
discardRedactions = "破棄して離脱"
|
||||
applyAndContinue = "適用して続行"
|
||||
exportAndContinue = "エクスポートして続行"
|
||||
cancel = "キャンセル"
|
||||
@@ -343,10 +340,6 @@ advance = "アドバンスド"
|
||||
edit = "閲覧と編集"
|
||||
popular = "人気"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "環境設定"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "詳細設定"
|
||||
title = "セキュリティと認証"
|
||||
security = "セキュリティ"
|
||||
connections = "接続"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "ライセンスと分析"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "現在のバージョン"
|
||||
latestVersion = "最新バージョン"
|
||||
checkForUpdates = "更新を確認"
|
||||
viewDetails = "詳細を表示"
|
||||
serverNeedsUpdate = "サーバーは管理者による更新が必要です"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "バージョン情報"
|
||||
description = "デスクトップ版とサーバー版の詳細"
|
||||
desktop = "デスクトップ版"
|
||||
server = "サーバー版"
|
||||
|
||||
[settings.security]
|
||||
title = "セキュリティ"
|
||||
description = "アカウントを安全に保つため、パスワードを更新してください。"
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "パスワードを変更します。更新後はログアウトされます。"
|
||||
required = "すべての項目は必須です。"
|
||||
mismatch = "新しいパスワードが一致しません。"
|
||||
error = "パスワードを更新できません。現在のパスワードを確認して再試行してください。"
|
||||
success = "パスワードを更新しました。再度サインインしてください。"
|
||||
ssoDisabled = "パスワードの変更はアイデンティティプロバイダーにより管理されています。"
|
||||
current = "現在のパスワード"
|
||||
currentPlaceholder = "現在のパスワードを入力"
|
||||
new = "新しいパスワード"
|
||||
newPlaceholder = "新しいパスワードを入力"
|
||||
confirm = "新しいパスワードの確認"
|
||||
confirmPlaceholder = "新しいパスワードを再入力"
|
||||
update = "パスワードを更新"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "キーボードショートカット"
|
||||
@@ -522,16 +488,11 @@ low = "低"
|
||||
title = "資格情報の変更"
|
||||
header = "アカウントの詳細を更新する"
|
||||
changePassword = "デフォルトのログイン認証情報を使用しています。新しいパスワードを入力してください"
|
||||
ssoManaged = "あなたのアカウントはアイデンティティプロバイダーにより管理されています。"
|
||||
newUsername = "新しいユーザー名"
|
||||
oldPassword = "現在のパスワード"
|
||||
newPassword = "新しいパスワード"
|
||||
confirmNewPassword = "新しいパスワードの確認"
|
||||
submit = "変更を送信"
|
||||
credsUpdated = "アカウントを更新しました"
|
||||
description = "変更を保存しました。再度ログインしてください。"
|
||||
error = "ユーザー名を更新できません。パスワードを確認して再試行してください。"
|
||||
changeUsername = "ユーザー名を更新します。更新後はログアウトされます。"
|
||||
|
||||
[account]
|
||||
title = "アカウント設定"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "アカウント設定"
|
||||
adminSettings = "管理者設定 - ユーザーの表示と追加"
|
||||
userControlSettings = "ユーザー制御設定"
|
||||
changeUsername = "ユーザー名を変更"
|
||||
changeUsernameDescription = "ユーザー名を更新します。更新後はログアウトされます。"
|
||||
newUsernamePlaceholder = "新しいユーザー名を入力"
|
||||
newUsername = "新しいユーザーネーム"
|
||||
password = "確認用パスワード"
|
||||
oldPassword = "旧パスワード"
|
||||
@@ -749,11 +708,6 @@ tags = "署名,サイン"
|
||||
title = "署名"
|
||||
desc = "手書き、テキストまたは画像によってPDFに署名を追加します。"
|
||||
|
||||
[home.annotate]
|
||||
tags = "注釈,ハイライト,描画"
|
||||
title = "注釈"
|
||||
desc = "ビューワーでハイライト、描画、ノートや図形の追加"
|
||||
|
||||
[home.flatten]
|
||||
tags = "平坦化,削除,インタラクティブ除去"
|
||||
title = "平坦化"
|
||||
@@ -964,8 +918,8 @@ desc = "1つのPDFを別のPDFの上に重ねます"
|
||||
title = "PDFを重ね合わせ"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDFテキストエディター"
|
||||
desc = "グループ化されたテキスト編集とPDF再生成で、Stirling PDF の JSON エクスポートをレビュー・編集します。"
|
||||
title = "PDFテキストエディタ"
|
||||
desc = "PDF内の既存のテキストと画像を編集"
|
||||
|
||||
[home.addText]
|
||||
tags = "テキスト,注釈,ラベル"
|
||||
@@ -976,7 +930,6 @@ desc = "PDFの任意の場所にテキストを追加"
|
||||
addFiles = "ファイルを追加"
|
||||
uploadFromComputer = "コンピュータからアップロード"
|
||||
openFromComputer = "コンピューターから開く"
|
||||
mobileUpload = "モバイルからアップロード"
|
||||
|
||||
[viewPdf]
|
||||
tags = "view,read,annotate,text,image"
|
||||
@@ -1228,7 +1181,7 @@ selectFilesPlaceholder = "開始するにはメインビューでファイルを
|
||||
settings = "設定"
|
||||
conversionCompleted = "変換が完了しました"
|
||||
results = "結果"
|
||||
defaultFilename = "converted_file"
|
||||
defaultFilename = "変換済みファイル"
|
||||
conversionResults = "変換結果"
|
||||
convertFrom = "変換元"
|
||||
convertTo = "変換先"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ から PDF へのオプション"
|
||||
optimizeForEbook = "PDF を eBook リーダー向けに最適化(Ghostscript 使用)"
|
||||
cbzOutputOptions = "PDF から CBZ へのオプション"
|
||||
cbzDpi = "画像レンダリングの DPI"
|
||||
cbrOptions = "CBR オプション"
|
||||
cbrOutputOptions = "PDF から CBR へのオプション"
|
||||
cbrDpi = "画像レンダリング用 DPI"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook から PDF へのオプション"
|
||||
ebookOptionsDesc = "eBook を PDF に変換するためのオプション"
|
||||
embedAllFonts = "すべてのフォントを埋め込む"
|
||||
embedAllFontsDesc = "eBook のすべてのフォントを生成される PDF に埋め込みます"
|
||||
includeTableOfContents = "目次を含める"
|
||||
includeTableOfContentsDesc = "生成した目次を結果の PDF に追加"
|
||||
includePageNumbers = "ページ番号を含める"
|
||||
includePageNumbersDesc = "生成される PDF にページ番号を追加"
|
||||
optimizeForEbookPdf = "電子書籍リーダー向けに最適化"
|
||||
optimizeForEbookPdfDesc = "PDF を eBook 読書向けに最適化します(ファイルサイズ縮小、eInk デバイスでの表示改善)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF から eBook へのオプション"
|
||||
epubOptionsDesc = "PDF を EPUB/AZW3 に変換するためのオプション"
|
||||
detectChapters = "章を検出"
|
||||
detectChaptersDesc = "章のように見える見出しを検出し、EPUB の改ページを挿入します"
|
||||
targetDevice = "対象デバイス"
|
||||
targetDeviceDesc = "リーダーデバイス向けに最適化された出力プロファイルを選択"
|
||||
outputFormat = "出力形式"
|
||||
outputFormatDesc = "電子書籍の出力形式を選択"
|
||||
tabletPhone = "タブレット/スマートフォン(画像あり)"
|
||||
kindleEink = "Kindle e-Ink(テキスト最適化)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversion,img,jpg,picture,photo,psd,photoshop"
|
||||
@@ -1435,11 +1361,6 @@ header = "添付ファイルの追加"
|
||||
add = "添付を追加"
|
||||
remove = "添付を削除"
|
||||
embed = "添付を埋め込む"
|
||||
convertToPdfA3b = "PDF/A-3b に変換"
|
||||
convertToPdfA3bDescription = "添付ファイルを埋め込んだアーカイブ用 PDF を作成します"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b は長期保存を保証するアーカイブ形式です。任意のファイル形式を添付として埋め込めます。変換には Ghostscript が必要で、大きなファイルでは時間がかかる場合があります。"
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b 変換について"
|
||||
convertToPdfA3bTooltipTitle = "機能"
|
||||
submit = "添付ファイルの追加"
|
||||
|
||||
[watermark]
|
||||
@@ -1447,7 +1368,7 @@ title = "透かしの追加"
|
||||
desc = "PDF ファイルにテキストまたは画像の透かしを追加"
|
||||
completed = "透かしを追加しました"
|
||||
submit = "透かしを追加"
|
||||
filenamePrefix = "watermarked"
|
||||
filenamePrefix = "透かし入り"
|
||||
|
||||
[watermark.error]
|
||||
failed = "PDF への透かし追加中にエラーが発生しました。"
|
||||
@@ -1722,7 +1643,7 @@ subtitle = "処理済みファイルをダウンロードするか、下で操
|
||||
[removePages]
|
||||
tags = "ページを削除,ページ削除"
|
||||
title = "削除"
|
||||
filenamePrefix = "pages_removed"
|
||||
filenamePrefix = "ページ削除済み"
|
||||
submit = "削除"
|
||||
|
||||
[removePages.pageNumbers]
|
||||
@@ -1924,7 +1845,7 @@ title = "フォームフィールドから読み取り専用を削除"
|
||||
header = "PDFフォームのロックを解除"
|
||||
submit = "Remove"
|
||||
description = "このツールは PDF フォームフィールドの読み取り専用制限を解除し、編集・入力可能にします。"
|
||||
filenamePrefix = "unlocked_forms"
|
||||
filenamePrefix = "フォームのロック解除済み"
|
||||
|
||||
[unlockPDFForms.files]
|
||||
placeholder = "メインビューで PDF ファイルを選択して開始してください"
|
||||
@@ -1938,7 +1859,7 @@ title = "フォームのロック解除結果"
|
||||
[changeMetadata]
|
||||
header = "メタデータの変更"
|
||||
submit = "変更"
|
||||
filenamePrefix = "metadata"
|
||||
filenamePrefix = "メタデータ"
|
||||
|
||||
[changeMetadata.settings]
|
||||
title = "メタデータ設定"
|
||||
@@ -2385,10 +2306,6 @@ saved = "保存済み"
|
||||
label = "署名画像をアップロード"
|
||||
placeholder = "画像ファイルを選択"
|
||||
hint = "署名の PNG または JPG 画像をアップロードしてください"
|
||||
removeBackground = "白背景を削除(透過化)"
|
||||
processing = "画像を処理中..."
|
||||
backgroundRemovalFailedTitle = "背景の削除に失敗"
|
||||
backgroundRemovalFailedMessage = "画像の背景を削除できませんでした。代わりに元の画像を使用します。"
|
||||
|
||||
[sign.instructions]
|
||||
title = "署名の追加方法"
|
||||
@@ -2417,7 +2334,7 @@ title = "平坦化"
|
||||
header = "PDFを平坦化する"
|
||||
flattenOnlyForms = "フォームのみを平坦にする"
|
||||
submit = "平坦化"
|
||||
filenamePrefix = "flattened"
|
||||
filenamePrefix = "フラット化済み"
|
||||
|
||||
[flatten.files]
|
||||
placeholder = "開始するにはメインビューで PDF ファイルを選択してください"
|
||||
@@ -2434,11 +2351,6 @@ note = "フラット化すると PDF からインタラクティブ要素が削
|
||||
label = "フォームのみフラット化"
|
||||
desc = "フォームフィールドのみをフラット化し、その他のインタラクティブ要素は維持します"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "レンダリング DPI(任意、150 DPI 推奨)"
|
||||
help = "空欄の場合はシステムのデフォルトを使用します。DPI を上げると出力はシャープになりますが、処理時間とファイルサイズが増加します。"
|
||||
placeholder = "例: 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "フラット化の結果"
|
||||
|
||||
@@ -2470,7 +2382,7 @@ title = "修復"
|
||||
header = "PDFを修復"
|
||||
submit = "修復"
|
||||
description = "このツールは破損または損傷した PDF ファイルの修復を試みます。追加の設定は不要です。"
|
||||
filenamePrefix = "repaired"
|
||||
filenamePrefix = "修復済み"
|
||||
|
||||
[repair.files]
|
||||
placeholder = "開始するにはメイン画面で PDF ファイルを選択してください"
|
||||
@@ -2671,7 +2583,7 @@ stopButton = "比較を停止"
|
||||
[certSign]
|
||||
tags = "authenticate,PEM,P12,official,encrypt"
|
||||
title = "証明書による署名"
|
||||
filenamePrefix = "signed"
|
||||
filenamePrefix = "署名済み"
|
||||
chooseCertificate = "証明書ファイルを選択"
|
||||
chooseJksFile = "JKS ファイルを選択"
|
||||
chooseP12File = "PKCS12 ファイルを選択"
|
||||
@@ -2805,7 +2717,7 @@ header = "PDFから電子証明書を削除する"
|
||||
selectPDF = "PDFファイルの選択:"
|
||||
submit = "署名の削除"
|
||||
description = "このツールは PDF 文書からデジタル証明書署名を削除します。"
|
||||
filenamePrefix = "unsigned"
|
||||
filenamePrefix = "署名なし"
|
||||
|
||||
[removeCertSign.files]
|
||||
placeholder = "開始するにはメイン画面で PDF ファイルを選択してください"
|
||||
@@ -3013,7 +2925,6 @@ header = "PDFのトリミング"
|
||||
submit = "送信"
|
||||
noFileSelected = "トリミングを開始する PDF ファイルを選択してください"
|
||||
reset = "PDF 全体にリセット"
|
||||
autoCrop = "余白を自動トリミング"
|
||||
|
||||
[crop.preview]
|
||||
title = "切り抜き範囲の選択"
|
||||
@@ -3244,7 +3155,6 @@ title = "墨消し方法"
|
||||
mode = "モード"
|
||||
automatic = "自動"
|
||||
automaticDesc = "検索語に基づいてテキストを墨消し"
|
||||
automaticDisabledTooltip = "複数ファイルを一度に墨消しするには、ファイルマネージャーでファイルを選択してください"
|
||||
manual = "手動"
|
||||
manualDesc = "クリック&ドラッグで特定領域を墨消し"
|
||||
manualComingSoon = "手動墨消しは近日対応"
|
||||
@@ -3315,35 +3225,8 @@ text = "単語全体のみを一致させ、部分一致を除外します。有
|
||||
title = "PDF-Image に変換"
|
||||
text = "墨消し後に PDF を画像ベースの PDF に変換します。これにより、墨消しボックスの背後にあるテキストが完全に除去され、復元不能になります。"
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "手動墨消しコントロール"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "テキストマーキングツール"
|
||||
text = "PDF 上のテキストを直接選択して墨消し対象にマークします。クリックしてドラッグすることで、墨消ししたい特定のテキストをハイライトできます。"
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "領域マーキングツール"
|
||||
text = "PDF 上に長方形の領域を描画して墨消し対象にマークします。画像、署名、不規則な形状の墨消しに便利です。"
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "墨消しを適用"
|
||||
text = "内容をマークしたら、「適用」をクリックしてすべてのマーク済み領域を永久に墨消しします。保留カウントは、適用待ちの墨消し数を示します。"
|
||||
bullet1 = "適用前に必要なだけ領域をマークできます"
|
||||
bullet2 = "保留中の墨消しは一括で適用されます"
|
||||
bullet3 = "適用後の墨消しは元に戻せません"
|
||||
|
||||
[redact.manual]
|
||||
title = "墨消しツール"
|
||||
instructions = "PDF 上のテキストを選択するか領域を描画して、墨消し対象をマークします。"
|
||||
markText = "テキストをマーキング"
|
||||
markArea = "領域をマーキング"
|
||||
pendingLabel = "保留中:"
|
||||
applyWarning = "⚠️ 永久適用で元に戻せず、下のデータは削除されます"
|
||||
apply = "適用"
|
||||
noMarks = "墨消しマークがありません。上のツールで墨消しする内容をマーキングしてください。"
|
||||
header = "手動墨消し"
|
||||
controlsTitle = "手動墨消しコントロール"
|
||||
textBasedRedaction = "テキストベースの墨消し"
|
||||
pageBasedRedaction = "ページ単位の墨消し"
|
||||
convertPDFToImageLabel = "PDF を PDF-Image に変換(ボックス背後のテキスト除去用)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "水平方向の分割数を選択"
|
||||
label = "垂直方向"
|
||||
placeholder = "垂直方向の分割数を選択"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "分割モード"
|
||||
description = "ページの分割方法を選択"
|
||||
splitAll = "全ページを分割"
|
||||
splitAllExceptFirst = "先頭以外を分割"
|
||||
splitAllExceptLast = "末尾以外を分割"
|
||||
splitAllExceptFirstAndLast = "先頭と末尾以外を分割"
|
||||
custom = "カスタムページ"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "カスタムページ番号"
|
||||
placeholder = "例: 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "スタンプ, 画像を追加, 画像を中央に配置, 透かし, PDF, 埋め込み, カスタマイズ"
|
||||
header = "PDFにスタンプを押す"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDFを単一ページに変換"
|
||||
header = "PDFを単一ページに変換"
|
||||
submit = "単一ページに変換"
|
||||
description = "このツールは PDF の全ページを 1 つの大きな単一ページに結合します。幅は元のページと同じで、高さは全ページの高さの合計になります。"
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "単一ページ"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "開始するにはメイン画面で PDF ファイルを選択してください"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "ファイルサイズ"
|
||||
[compress.grayscale]
|
||||
label = "圧縮にグレースケールを適用する"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Web 表示を高速化するために PDF をリニアライズ"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "画像を線画に変換"
|
||||
description = "ImageMagick を使用し、ページを高コントラストの白黒にして最大限のサイズ削減を行います。"
|
||||
unavailable = "このサーバーに ImageMagick がインストールまたは有効化されていません"
|
||||
detailLevel = "詳細レベル"
|
||||
edgeEmphasis = "エッジ強調"
|
||||
edgeLow = "弱め"
|
||||
edgeMedium = "バランス"
|
||||
edgeHigh = "強め"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "圧縮設定の概要"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "値が大きいほどファイルサイズを削減"
|
||||
title = "グレースケール"
|
||||
text = "このオプションを選ぶと、すべての画像を白黒に変換します。特にスキャン PDF や画像の多い文書で大幅なサイズ削減が見込めます。"
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "線画"
|
||||
text = "ImageMagick を使ってページを高コントラストの白黒に変換します。詳細レベルで黒になる範囲を、エッジ強調でエッジ検出の強さを調整できます。"
|
||||
|
||||
[compress.error]
|
||||
failed = "PDF の圧縮中にエラーが発生しました。"
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "PDF の圧縮中にエラーが発生しました。"
|
||||
_value = "圧縮設定"
|
||||
1 = "1-3 PDF圧縮、</br> 4-6 弱い画像圧縮、</br> 7-9 強い画像圧縮により画質が大幅に低下します"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "値が低いほど品質は保たれますが、ファイルサイズは大きくなります"
|
||||
range4to6 = "中程度の圧縮で、品質低下はほどほどです"
|
||||
range7to9 = "値が高いほどファイルサイズは大きく削減されますが、画像の鮮明さが低下する場合があります"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "このファイルはパスワードで保護されています。パスワードを入力してください:"
|
||||
cancelled = "PDFの操作がキャンセルされました: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "選択したページを削除"
|
||||
closePdf = "PDF を閉じる"
|
||||
exportAll = "PDF を書き出し"
|
||||
downloadSelected = "選択したファイルをダウンロード"
|
||||
annotations = "注釈"
|
||||
exportSelected = "選択したページを書き出し"
|
||||
saveChanges = "変更を保存"
|
||||
downloadAll = "すべてをダウンロード"
|
||||
saveAll = "すべて保存"
|
||||
toggleTheme = "テーマを切り替え"
|
||||
toggleBookmarks = "ブックマークを切り替え"
|
||||
language = "言語"
|
||||
toggleAnnotations = "注釈の表示を切り替え"
|
||||
search = "PDF を検索"
|
||||
panMode = "パンモード"
|
||||
applyRedactionsFirst = "先に墨消しを適用"
|
||||
rotateLeft = "左に回転"
|
||||
rotateRight = "右に回転"
|
||||
toggleSidebar = "サイドバーを切り替え"
|
||||
toggleBookmarks = "ブックマークを切り替え"
|
||||
exportSelected = "選択したページを書き出し"
|
||||
toggleAnnotations = "注釈の表示を切り替え"
|
||||
annotationMode = "注釈モードを切り替え"
|
||||
print = "PDFを印刷"
|
||||
draw = "描画"
|
||||
redact = "墨消し"
|
||||
exitRedaction = "墨消しモードを終了"
|
||||
save = "保存"
|
||||
downloadAll = "すべてをダウンロード"
|
||||
saveAll = "すべて保存"
|
||||
|
||||
[textAlign]
|
||||
left = "左揃え"
|
||||
center = "中央揃え"
|
||||
right = "右揃え"
|
||||
|
||||
[annotation]
|
||||
title = "注釈"
|
||||
desc = "ハイライト、ペン、テキスト、ノートを使用できます。変更はそのまま保持され、フラット化は不要です。"
|
||||
highlight = "ハイライト"
|
||||
pen = "ペン"
|
||||
text = "テキストボックス"
|
||||
note = "ノート"
|
||||
rectangle = "長方形"
|
||||
ellipse = "楕円"
|
||||
select = "選択"
|
||||
exit = "注釈モードを終了"
|
||||
strokeWidth = "線の太さ"
|
||||
opacity = "不透明度"
|
||||
strokeOpacity = "線の不透明度"
|
||||
fillOpacity = "塗りの不透明度"
|
||||
fontSize = "フォントサイズ"
|
||||
chooseColor = "色を選択"
|
||||
color = "色"
|
||||
strokeColor = "線の色"
|
||||
fillColor = "塗りの色"
|
||||
underline = "下線"
|
||||
strikeout = "取り消し線"
|
||||
squiggly = "波線"
|
||||
inkHighlighter = "フリーハンドハイライト"
|
||||
freehandHighlighter = "フリーハンドハイライト"
|
||||
square = "正方形"
|
||||
circle = "円"
|
||||
polygon = "多角形"
|
||||
line = "直線"
|
||||
stamp = "画像を追加"
|
||||
textMarkup = "テキストマークアップ"
|
||||
drawing = "描画"
|
||||
shapes = "図形"
|
||||
notesStamps = "ノートとスタンプ"
|
||||
settings = "設定"
|
||||
borderOn = "枠線: オン"
|
||||
borderOff = "枠線: オフ"
|
||||
editInk = "ペンを編集"
|
||||
editLine = "直線を編集"
|
||||
editNote = "ノートを編集"
|
||||
editText = "テキストボックスを編集"
|
||||
editTextMarkup = "テキストマークアップを編集"
|
||||
editSelected = "注釈を編集"
|
||||
editSquare = "正方形を編集"
|
||||
editCircle = "円を編集"
|
||||
editPolygon = "多角形を編集"
|
||||
unsupportedType = "この注釈タイプは編集に完全対応していません。"
|
||||
textAlignment = "テキストの配置"
|
||||
noteIcon = "ノートアイコン"
|
||||
imagePreview = "プレビュー"
|
||||
contents = "テキスト"
|
||||
backgroundColor = "背景色"
|
||||
clearBackground = "背景を削除"
|
||||
noBackground = "背景なし"
|
||||
stampSettings = "スタンプ設定"
|
||||
savingCopy = "ダウンロードを準備中..."
|
||||
saveFailed = "コピーを保存できません"
|
||||
saveReady = "ダウンロードの準備ができました"
|
||||
selectAndMove = "選択して編集"
|
||||
editSelectDescription = "既存の注釈をクリックして、色、不透明度、テキスト、サイズを編集します。"
|
||||
editStampHint = "画像を変更するには、このスタンプを削除して新規追加してください。"
|
||||
editSwitchToSelect = "この注釈を編集するには、選択して編集に切り替えてください。"
|
||||
undo = "元に戻す"
|
||||
redo = "やり直し"
|
||||
applyChanges = "変更を適用"
|
||||
saveChanges = "変更を保存"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "設定"
|
||||
adminSettings = "管理者設定"
|
||||
allTools = "All Tools"
|
||||
reader = "リーダー"
|
||||
tours = "ツアー"
|
||||
showMeAround = "案内して"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "ここで次のツアーを視聴できます: ツールのツアー、新しい V2 レイアウトのツアー、管理者ツアー。"
|
||||
user = "ここで次のツアーを視聴できます: ツールのツアー、新しい V2 レイアウトのツアー。"
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "ツールツアー"
|
||||
toolsTourDesc = "ツールでできることを学ぶ"
|
||||
adminTour = "管理ツアー"
|
||||
adminTourDesc = "管理設定と機能を探索"
|
||||
whatsNewTour = "V2 の新機能を見る"
|
||||
whatsNewTourDesc = "更新されたレイアウトをツアー"
|
||||
|
||||
[admin]
|
||||
error = "エラー"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "設定の読み込みに失敗しました"
|
||||
saveError = "設定の保存に失敗しました"
|
||||
saved = "設定を正常に保存しました"
|
||||
saveSuccess = "設定を正常に保存しました"
|
||||
success = "設定を保存しました"
|
||||
error = "設定の保存に失敗しました"
|
||||
save = "変更を保存"
|
||||
discard = "破棄"
|
||||
restartRequired = "再起動が必要"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTML から PDF 変換用 WeasyPrint 実行ファイルのパス
|
||||
label = "Unoconvert 実行ファイル"
|
||||
description = "ドキュメント変換用 LibreOffice unoconvert のパス(空欄で既定: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "フロントエンド URL"
|
||||
description = "フロントエンドのベース URL(例: https://pdf.example.com)。メール招待リンクとモバイルの QR コードアップロードで使用します。空欄の場合はバックエンドの URL を使用します。"
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "クリックしてプラン詳細を表示"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "セキュリティ"
|
||||
description = "認証、ログイン動作、セキュリティポリシーを構成します。"
|
||||
@@ -4565,19 +4321,6 @@ connect = "接続"
|
||||
disconnect = "切断"
|
||||
disconnected = "プロバイダの切断に成功しました"
|
||||
disconnectError = "プロバイダの切断に失敗しました"
|
||||
mobileScannerConvertToPdf = "画像を PDF に変換"
|
||||
mobileScannerConvertToPdfDesc = "アップロードされた画像を自動的に PDF 形式に変換します。無効にすると、画像はそのまま保持されます。"
|
||||
mobileScannerImageResolution = "画像解像度"
|
||||
mobileScannerImageResolutionDesc = "アップロード画像の解像度。「縮小」は最大 1200px にスケーリングしてファイルサイズを削減します。"
|
||||
imageResolutionFull = "フル(元のサイズ)"
|
||||
imageResolutionReduced = "縮小(最大 1200px)"
|
||||
mobileScannerPageFormat = "ページ形式"
|
||||
mobileScannerPageFormatDesc = "変換画像の PDF ページサイズ。「保持」は元の画像サイズを使用します。"
|
||||
pageFormatKeep = "保持(元の寸法)"
|
||||
pageFormatA4 = "A4(210×297mm)"
|
||||
pageFormatLetter = "Letter(8.5×11in)"
|
||||
mobileScannerStretchToFit = "ページに合わせて拡大/縮小"
|
||||
mobileScannerStretchToFitDesc = "ページ全体を満たすように画像を伸縮します。無効にすると、アスペクト比を維持して中央配置します。"
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO 自動ログイン"
|
||||
@@ -4596,15 +4339,15 @@ label = "プロバイダ"
|
||||
description = "認証に使用する OAuth2 プロバイダ"
|
||||
|
||||
[admin.settings.connections.oauth2.issuer]
|
||||
label = "Issuer URL"
|
||||
label = "発行者 URL"
|
||||
description = "OAuth2 プロバイダの Issuer URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "クライアント ID"
|
||||
description = "プロバイダから発行された OAuth2 の Client ID"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "クライアント シークレット"
|
||||
description = "プロバイダから発行された OAuth2 の Client Secret"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4635,7 +4378,7 @@ label = "プロバイダ"
|
||||
description = "SAML2 プロバイダ名"
|
||||
|
||||
[admin.settings.connections.saml2.registrationId]
|
||||
label = "Registration ID"
|
||||
label = "登録 ID"
|
||||
description = "SAML2 の登録識別子"
|
||||
|
||||
[admin.settings.connections.saml2.autoCreateUser]
|
||||
@@ -4646,122 +4389,6 @@ description = "初回の SAML2 ログイン時にユーザーアカウントを
|
||||
label = "登録をブロック"
|
||||
description = "SAML2 による新規ユーザー登録を禁止"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "携帯電話からのアップロード"
|
||||
enable = "QR コードアップロードを有効化"
|
||||
description = "ユーザーが QR コードをスキャンしてモバイル端末からファイルをアップロードできるようにします"
|
||||
note = "注意: フロントエンド URL の設定が必要です。 "
|
||||
link = "システム設定で構成"
|
||||
mobileScannerConvertToPdf = "画像を PDF に変換"
|
||||
mobileScannerConvertToPdfDesc = "アップロードされた画像を自動的に PDF 形式に変換します。無効にすると、画像はそのまま保持されます。"
|
||||
mobileScannerImageResolution = "画像解像度"
|
||||
mobileScannerImageResolutionDesc = "アップロード画像の解像度。「縮小」は最大 1200px にスケーリングしてファイルサイズを削減します。"
|
||||
imageResolutionFull = "フル(元のサイズ)"
|
||||
imageResolutionReduced = "縮小(最大 1200px)"
|
||||
mobileScannerPageFormat = "ページ形式"
|
||||
mobileScannerPageFormatDesc = "変換画像の PDF ページサイズ。「保持」は元の画像サイズを使用します。"
|
||||
pageFormatKeep = "保持(元の寸法)"
|
||||
pageFormatA4 = "A4(210×297mm)"
|
||||
pageFormatLetter = "Letter(8.5×11in)"
|
||||
mobileScannerStretchToFit = "ページに合わせて拡大/縮小"
|
||||
mobileScannerStretchToFitDesc = "ページ全体を満たすように画像を伸縮します。無効にすると、アスペクト比を維持して中央配置します。"
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram ボット"
|
||||
description = "Telegram ボットの接続、アクセス制御、フィードバック動作を構成します。"
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram ボットを有効化"
|
||||
description = "設定済みの Telegram ボットを通じてユーザーが Stirling PDF とやり取りできるようにします。"
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "ボットのユーザー名"
|
||||
description = "Telegram ボットの公開ユーザー名。"
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "ボットトークン"
|
||||
description = "Telegram ボット用の BotFather から提供される API トークン。"
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "受信フォルダー"
|
||||
description = "受信した Telegram ファイルを保存する、パイプラインディレクトリ配下のフォルダー。"
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "カスタムフォルダーサフィックスを使用"
|
||||
description = "チャット ID を受信フォルダー名に追加し、チャットごとのアップロードを分離します。"
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "アクセス制御"
|
||||
description = "ボットとやり取りできるユーザーやチャンネルを制限します。"
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "特定のユーザー ID を許可"
|
||||
description = "有効にすると、一覧のユーザー ID のみがボットを使用できます。"
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "許可するユーザー ID"
|
||||
description = "ボットとのやり取りを許可する Telegram のユーザー ID を入力します。"
|
||||
placeholder = "ユーザー ID を追加して Enter を押す"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "特定のチャンネル ID を許可"
|
||||
description = "有効にすると、一覧のチャンネル ID のみがボットを使用できます。"
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "許可するチャンネル ID"
|
||||
description = "ボットとのやり取りを許可する Telegram のチャンネル ID を入力します。"
|
||||
placeholder = "チャンネル ID を追加して Enter を押す"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "処理"
|
||||
description = "Telegram アップロードのポーリング間隔と処理タイムアウトを制御します。"
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "処理タイムアウト(秒)"
|
||||
description = "エラーを報告する前に処理ジョブを待機する最大時間。"
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "ポーリング間隔(ms)"
|
||||
description = "新しい Telegram 更新を確認する間隔。"
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "フィードバックメッセージ"
|
||||
description = "ボットがユーザーやチャンネルにフィードバックを送信するタイミングを選択します。"
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "フィードバックを有効化"
|
||||
description = "ボットがフィードバックメッセージを送信するかどうかを制御します。"
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "チャンネルのフィードバックルール"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "「有効なドキュメントがありません」を表示(チャンネル)"
|
||||
description = "チャンネルへのアップロードで「有効なドキュメントがありません」の応答を抑制します。"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "処理エラーを表示(チャンネル)"
|
||||
description = "処理エラーメッセージをチャンネルに送信します。"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "エラーメッセージを表示(チャンネル)"
|
||||
description = "チャンネル向けの詳細なエラーメッセージを表示します。"
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "ユーザーのフィードバックルール"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "「有効なドキュメントがありません」を表示(ユーザー)"
|
||||
description = "ユーザーのアップロードで「有効なドキュメントがありません」の応答を抑制します。"
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "処理エラーを表示(ユーザー)"
|
||||
description = "処理エラーメッセージをユーザーに送信します。"
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "エラーメッセージを表示(ユーザー)"
|
||||
description = "ユーザー向けの詳細なエラーメッセージを表示します。"
|
||||
|
||||
[admin.settings.database]
|
||||
title = "データベース"
|
||||
description = "エンタープライズ導入向けのカスタムデータベース接続設定を構成します。"
|
||||
@@ -4888,7 +4515,7 @@ description = "より広範なシステム一時ディレクトリをクリー
|
||||
label = "プロセス実行制限"
|
||||
description = "各プロセス実行器のセッション上限とタイムアウトを設定"
|
||||
libreOffice = "LibreOffice"
|
||||
pdfToHtml = "PDF to HTML"
|
||||
pdfToHtml = "PDF を HTML に"
|
||||
qpdf = "QPDF"
|
||||
tesseract = "Tesseract OCR"
|
||||
pythonOpenCv = "Python OpenCV"
|
||||
@@ -4943,10 +4570,6 @@ description = "管理者が自動生成パスワード付きでメール招待
|
||||
label = "フロントエンド URL"
|
||||
description = "フロントエンドのベース URL(例: https://pdf.example.com)。メール内の招待リンク生成に使用。空欄の場合はバックエンド URL を使用します。"
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "注意: フロントエンド URL の設定が必要です。 "
|
||||
link = "システム設定で構成"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "法的ドキュメント"
|
||||
description = "法的ドキュメントおよびポリシーへのリンクを構成します。"
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "ドライブ"
|
||||
myFiles = "マイファイル"
|
||||
noRecentFiles = "最近のファイルは見つかりませんでした"
|
||||
googleDriveNotAvailable = "Google ドライブ連携は利用できません"
|
||||
mobileUpload = "モバイルアップロード"
|
||||
mobileShort = "モバイル"
|
||||
mobileUploadNotAvailable = "モバイルアップロードは有効になっていません"
|
||||
downloadSelected = "選択をダウンロード"
|
||||
saveSelected = "選択項目を保存"
|
||||
openFiles = "複数ファイルを開く"
|
||||
@@ -5179,7 +4799,7 @@ title = "サニタイズ"
|
||||
desc = "PDF ファイルから潜在的に有害な要素を削除します。"
|
||||
submit = "PDFをサニタイズ"
|
||||
completed = "サニタイズが正常に完了しました"
|
||||
filenamePrefix = "sanitised"
|
||||
filenamePrefix = "サニタイズ済み"
|
||||
sanitizationResults = "サニタイズ結果"
|
||||
|
||||
[sanitize.error]
|
||||
@@ -5227,7 +4847,7 @@ title = "パスワードの追加"
|
||||
desc = "パスワードで PDF 文書を暗号化します。"
|
||||
completed = "パスワード保護を適用しました"
|
||||
submit = "暗号化"
|
||||
filenamePrefix = "encrypted"
|
||||
filenamePrefix = "暗号化済み"
|
||||
|
||||
[addPassword.error]
|
||||
failed = "PDF の暗号化中にエラーが発生しました。"
|
||||
@@ -5322,7 +4942,7 @@ text = "これらの権限を変更不可にするには、パスワード追加
|
||||
title = "パスワードの削除"
|
||||
desc = "PDFからパスワードの削除します。"
|
||||
tags = "セキュア,復号,セキュリティ,パスワード解除,パスワード削除"
|
||||
filenamePrefix = "decrypted"
|
||||
filenamePrefix = "復号済み"
|
||||
submit = "削除"
|
||||
|
||||
[removePassword.password]
|
||||
@@ -5449,7 +5069,6 @@ loading = "読み込み中..."
|
||||
back = "戻る"
|
||||
continue = "続行"
|
||||
error = "エラー"
|
||||
save = "保存"
|
||||
|
||||
[config.overview]
|
||||
title = "アプリケーション構成"
|
||||
@@ -5512,15 +5131,6 @@ impact = "現在これらのキーを使用しているアプリやサービス
|
||||
confirmPrompt = "続行してよろしいですか?"
|
||||
confirmCta = "キーを更新"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API キーエラー"
|
||||
failedToCreateApiKey = "API キーの作成に失敗しました。"
|
||||
failedToRetrieveApiKey = "レスポンスから API キーを取得できませんでした。"
|
||||
failedToFetchApiKey = "API キーの取得に失敗しました。"
|
||||
apiKeyRefreshed = "API キーを更新しました"
|
||||
apiKeyRefreshedBody = "API キーが正常に更新されました。"
|
||||
failedToRefreshApiKey = "API キーの更新に失敗しました。"
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "添付ファイルを選択"
|
||||
info = "PDF に添付するファイルを選択します。これらのファイルは埋め込まれ、PDF の添付パネルからアクセスできます。"
|
||||
@@ -5625,16 +5235,6 @@ finish = "完了"
|
||||
startTour = "ツアーを開始"
|
||||
startTourDescription = "Stirling PDF の主な機能をガイド付きで紹介します"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "最初は <strong>Quick Access</strong> レールから始め、Reader、Automate、ファイル、各ツアーへ素早く移動できます。"
|
||||
leftPanel = "左側の <strong>ツール</strong> パネルにできることが一覧表示されています。カテゴリを閲覧するか、検索してツールを素早く見つけましょう。"
|
||||
fileUpload = "<strong>ファイル</strong> ボタンでアップロードするか最近の PDF を選択します。ワークスペースを確認できるようサンプルも読み込みます。"
|
||||
rightRail = "<strong>右レール</strong>では、ファイル選択、テーマや言語の変更、結果のダウンロードなどのクイックアクションができます。"
|
||||
topBar = "上部バーで <strong>ビューアー</strong>、<strong>ページエディター</strong>、<strong>アクティブファイル</strong> を切り替えられます。"
|
||||
pageEditorView = "ページエディターに切り替えて、ページの並べ替え、回転、削除を行います。"
|
||||
activeFilesView = "アクティブファイルで開いているすべてを確認し、作業対象を選択できます。"
|
||||
wrapUp = "V2 の新機能は以上です。いつでも <strong>ツアー</strong> メニューを開いて、これやツールのツアー、管理者ツアーを再生できます。"
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Stirling PDF へようこそ!"
|
||||
description = "主な機能と始め方を 1 分のクイックツアーで確認しますか?"
|
||||
@@ -5655,10 +5255,6 @@ download = "ダウンロード →"
|
||||
showMeAround = "ツアーを見る"
|
||||
skipTheTour = "ツアーをスキップ"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "ツアーの概要"
|
||||
body = "Stirling PDF V2 は多数のツールと刷新されたレイアウトを搭載しています。変更点と必要な機能の見つけ方を短いツアーで確認しましょう。"
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "今はスキップ"
|
||||
seePlans = "プランを見る →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "今すぐアップグレード →"
|
||||
freeTitle = "サーバーライセンス"
|
||||
overLimitTitle = "サーバーライセンスが必要です"
|
||||
overLimitBody = "当社のライセンスでは、サーバーごとに <strong>{{freeTierLimit}}</strong> ユーザーまで無料です。現在 <strong>{{overLimitUserCopy}}</strong> の Stirling ユーザーがいます。中断なく利用を続けるには、Stirling Server プランにアップグレードしてください - <strong>無制限席数</strong>、PDF テキスト編集、完全な管理機能が $99/サーバー/月 です。"
|
||||
freeBody = "当社の <strong>オープンコア</strong> ライセンスでは、サーバーごとに最大 <strong>{{freeTierLimit}}</strong> ユーザーまで無料です。中断なく拡張し、新しい <strong>PDF テキスト編集ツール</strong> に早期アクセスするには、Stirling Server プランをお勧めします。完全編集と <strong>無制限席数</strong> が $99/サーバー/月 です。"
|
||||
freeBody = "当社の<strong>Open-Core</strong>ライセンスでは、サーバーごとに最大<strong>{{freeTierLimit}}</strong>ユーザーまで無料でご利用いただけます。中断なくスケールするには、Stirling Server プランをおすすめします - <strong>無制限の席数</strong>と<strong>SSO サポート</strong>で $99/サーバー/月。"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "ダウンロード"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "営業に問い合わせ"
|
||||
contactToUpgrade = "プランのアップグレードやカスタマイズはお問い合わせください"
|
||||
maxUsers = "最大ユーザー数"
|
||||
upTo = "最大"
|
||||
getLicense = "サーバーライセンスを取得"
|
||||
upgradeToEnterprise = "エンタープライズにアップグレード"
|
||||
selectPeriod = "課金期間を選択"
|
||||
monthlyBilling = "月額課金"
|
||||
yearlyBilling = "年額課金"
|
||||
checkoutOpened = "チェックアウトを開きました"
|
||||
checkoutInstructions = "Stripe のタブで購入手続きを完了してください。支払い後、ここに戻ってページを更新するとライセンスが有効化されます。ライセンスキーはメールでも送付されます。"
|
||||
activateLicense = "ライセンスを有効化"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "新しいタブでチェックアウトを開きました"
|
||||
instructions = "Stripe のタブで購入を完了してください。支払い完了後、ライセンスキーがメールで届きます。"
|
||||
enterKey = "プランを有効化するには以下にライセンスキーを入力してください:"
|
||||
keyDescription = "メールに記載のライセンスキーを貼り付け"
|
||||
activate = "ライセンスを有効化"
|
||||
doLater = "後で行う"
|
||||
success = "ライセンスを有効化しました!"
|
||||
successMessage = "ライセンスは正常に有効化されました。このウィンドウを閉じても構いません。"
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "メール認証が必要です"
|
||||
message = "Stripe の課金ポータルでメールアドレスの認証が必要です。メールのログインリンクを確認してください。"
|
||||
|
||||
[plan.period]
|
||||
month = "月"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "監査システムは利用できません"
|
||||
notAvailableMessage = "監査システムが未設定または利用できません。"
|
||||
disabled = "監査ログは無効です"
|
||||
disabledMessage = "アプリケーション設定で監査ログを有効にして、システムイベントを記録してください。"
|
||||
enterpriseRequired = "エンタープライズライセンスが必要"
|
||||
enterpriseRequiredMessage = "監査ログシステムはエンタープライズ機能です。監査ログと分析にアクセスするには、エンタープライズライセンスにアップグレードしてください。"
|
||||
|
||||
[audit.error]
|
||||
title = "監査システムの読み込みエラー"
|
||||
@@ -6370,7 +5942,6 @@ description = "セルフホストの Stirling PDF サーバーの完全な URL
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "サーバー URL を入力してください"
|
||||
invalidUrl = "URL の形式が無効です。https://your-server.com のような有効な URL を入力してください"
|
||||
unreachable = "サーバーに接続できませんでした"
|
||||
testFailed = "接続テストに失敗しました"
|
||||
configFetch = "サーバー構成の取得に失敗しました。URL を確認して、もう一度お試しください。"
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "接続先:"
|
||||
submit = "ログイン"
|
||||
signInWith = "でサインイン"
|
||||
oauthPending = "認証のためブラウザーを開いています..."
|
||||
sso = "シングルサインオン"
|
||||
orContinueWith = "またはメールで続行"
|
||||
serverRequirement = "注: サーバーでログインを有効にする必要があります。"
|
||||
showInstructions = "有効化するには?"
|
||||
@@ -6404,7 +5974,7 @@ label = "ユーザー名"
|
||||
placeholder = "ユーザー名を入力"
|
||||
|
||||
[setup.login.email]
|
||||
label = "Email"
|
||||
label = "メールアドレス"
|
||||
placeholder = "メールアドレスを入力"
|
||||
|
||||
[setup.login.password]
|
||||
@@ -6455,8 +6025,6 @@ reset = "変更をリセット"
|
||||
downloadJson = "JSON をダウンロード"
|
||||
generatePdf = "PDF を生成"
|
||||
saveChanges = "変更を保存"
|
||||
applyChanges = "変更を適用"
|
||||
downloadCopy = "コピーをダウンロード"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ボックスに収まるようテキストを自動スケール"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "ヒント: Ctrl(Cmd)または Shift を押しながら
|
||||
title = "編集したテキストを1つのPDF要素に固定"
|
||||
description = "有効にすると、編集した各テキストボックスを1つのPDFテキスト要素としてエクスポートし、グリフの重なりやフォント混在を避けます。"
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "詳細設定"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "プレビューの制限事項"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "テキストと画像のフォーカス"
|
||||
text = "このワークスペースはテキストの編集と埋め込み画像の位置調整に重点を置いています。複雑なページのアートワーク、フォームウィジェット、レイヤー化されたグラフィックは書き出し時に保持されますが、ここでは完全には編集できません。"
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "プレビュー差異"
|
||||
text = "表の罫線、図形、注釈の見た目など、一部のビジュアルはプレビューと完全には一致しない場合があります。書き出された PDF では可能な限り元の描画コマンドが保持されます。"
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "アルファ版ビューアー"
|
||||
text = "このアルファ版ビューアーは発展途上のため、一部のフォント、色、透明効果、レイアウトがわずかに変化することがあります。共有前に生成された PDF を再確認してください。"
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "選択ボックスを結合"
|
||||
merge = "選択を結合"
|
||||
@@ -6614,58 +6164,3 @@ title = "テキスト追加の結果"
|
||||
|
||||
[addText.error]
|
||||
failed = "PDFにテキストを追加中にエラーが発生しました。"
|
||||
|
||||
[mobileUpload]
|
||||
title = "モバイルからアップロード"
|
||||
description = "スキャンして写真をアップロード。画像は自動で PDF に変換されます。"
|
||||
descriptionNoConvert = "モバイルデバイスから写真をアップロードするためにスキャンします。"
|
||||
error = "接続エラー"
|
||||
pollingError = "ファイル確認中にエラーが発生しました"
|
||||
sessionId = "セッション ID"
|
||||
sessionCreateError = "セッションの作成に失敗しました"
|
||||
expiryWarning = "セッションの有効期限が間もなく切れます"
|
||||
expiryWarningMessage = "この QR コードは {{seconds}} 秒で期限切れになります。新しいコードは自動生成されます。"
|
||||
filesReceived = "{{count}} 件のファイルを受信"
|
||||
connected = "モバイルデバイスが接続されました"
|
||||
instructions = "スマホのカメラでスキャン。画像は自動的に PDF に変換されます。"
|
||||
instructionsNoConvert = "スマホのカメラでスキャンしてファイルをアップロード。"
|
||||
|
||||
[mobileScanner]
|
||||
title = "モバイルスキャナー"
|
||||
noSession = "無効なセッション"
|
||||
noSessionMessage = "有効な QR コードをスキャンしてこのページにアクセスしてください。"
|
||||
validating = "セッションを検証中..."
|
||||
sessionInvalid = "セッションエラー"
|
||||
sessionExpired = "このセッションの有効期限が切れました。更新して再試行してください。"
|
||||
sessionNotFound = "セッションが見つかりません。更新して再試行してください。"
|
||||
sessionValidationError = "セッションを検証できません。もう一度お試しください。"
|
||||
uploadSuccess = "アップロード成功!"
|
||||
uploadSuccessMessage = "画像の転送が完了しました。"
|
||||
httpsRequired = "カメラアクセスには HTTPS または localhost が必要です。HTTPS を使用するか、localhost からアクセスしてください。"
|
||||
uploadFailed = "アップロードに失敗しました。もう一度お試しください。"
|
||||
uploading = "アップロード中..."
|
||||
connected = "接続済み"
|
||||
connecting = "接続中..."
|
||||
chooseMethod = "アップロード方法を選択"
|
||||
chooseMethodDescription = "文書のスキャンとアップロード方法を選択してください"
|
||||
camera = "カメラ"
|
||||
cameraDescription = "自動エッジ検出付きでデバイスのカメラを使って文書をスキャン"
|
||||
fileUpload = "ファイルアップロード"
|
||||
fileDescription = "デバイス内の既存の写真や文書をアップロード"
|
||||
cameraAccessDenied = "カメラへのアクセスが拒否されました。カメラアクセスを有効にしてください。"
|
||||
back = "戻る"
|
||||
settings = "設定"
|
||||
edgeDetection = "エッジ検出"
|
||||
flashlight = "フラッシュライト"
|
||||
flash = "フラッシュ"
|
||||
processing = "処理中..."
|
||||
capture = "撮影"
|
||||
selectFilesPrompt = "アップロードするファイルを選択"
|
||||
selectImage = "画像を選択"
|
||||
preview = "プレビュー"
|
||||
retake = "撮り直し"
|
||||
addToBatch = "バッチに追加"
|
||||
upload = "アップロード"
|
||||
batchImages = "バッチ"
|
||||
clearBatch = "クリア"
|
||||
uploadAll = "すべてアップロード"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "PDF에 저장되지 않은 변경 사항이 있습니다."
|
||||
pendingRedactionsTitle = "미적용 가리기"
|
||||
pendingRedactions = "적용되지 않은 가리기가 있으며, 손실됩니다."
|
||||
areYouSure = "정말 떠나시겠습니까?"
|
||||
unsavedChangesTitle = "저장되지 않은 변경 사항"
|
||||
keepWorking = "계속 작업"
|
||||
discardChanges = "폐기하고 나가기"
|
||||
discardRedactions = "삭제하고 나가기"
|
||||
applyAndContinue = "저장하고 나가기"
|
||||
exportAndContinue = "내보내고 계속"
|
||||
cancel = "취소"
|
||||
@@ -343,10 +340,6 @@ advance = "고급"
|
||||
edit = "보기 & 편집"
|
||||
popular = "인기"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "환경설정"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "고급"
|
||||
title = "보안 및 인증"
|
||||
security = "보안"
|
||||
connections = "연결"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "라이선스 및 분석"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "현재 버전"
|
||||
latestVersion = "최신 버전"
|
||||
checkForUpdates = "업데이트 확인"
|
||||
viewDetails = "자세히 보기"
|
||||
serverNeedsUpdate = "관리자가 서버를 업데이트해야 합니다"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "버전 정보"
|
||||
description = "데스크톱 및 서버 버전 세부정보"
|
||||
desktop = "데스크톱 버전"
|
||||
server = "서버 버전"
|
||||
|
||||
[settings.security]
|
||||
title = "보안"
|
||||
description = "계정을 안전하게 유지하려면 비밀번호를 업데이트하세요."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "비밀번호를 변경합니다. 업데이트 후 로그아웃됩니다."
|
||||
required = "모든 항목은 필수입니다."
|
||||
mismatch = "새 비밀번호가 일치하지 않습니다."
|
||||
error = "비밀번호를 업데이트할 수 없습니다. 현재 비밀번호를 확인한 뒤 다시 시도하세요."
|
||||
success = "비밀번호가 성공적으로 업데이트되었습니다. 다시 로그인하세요."
|
||||
ssoDisabled = "비밀번호 변경은 ID 공급자에서 관리합니다."
|
||||
current = "현재 비밀번호"
|
||||
currentPlaceholder = "현재 비밀번호 입력"
|
||||
new = "새 비밀번호"
|
||||
newPlaceholder = "새 비밀번호 입력"
|
||||
confirm = "새 비밀번호 확인"
|
||||
confirmPlaceholder = "새 비밀번호 다시 입력"
|
||||
update = "비밀번호 업데이트"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "키보드 단축키"
|
||||
@@ -522,16 +488,11 @@ low = "낮음"
|
||||
title = "자격 증명 변경"
|
||||
header = "계정 정보 업데이트"
|
||||
changePassword = "기본 로그인 자격 증명을 사용 중입니다. 새 비밀번호를 입력하세요"
|
||||
ssoManaged = "귀하의 계정은 ID 공급자에서 관리됩니다."
|
||||
newUsername = "새 사용자 이름"
|
||||
oldPassword = "현재 비밀번호"
|
||||
newPassword = "새 비밀번호"
|
||||
confirmNewPassword = "새 비밀번호 확인"
|
||||
submit = "변경 사항 제출"
|
||||
credsUpdated = "계정이 업데이트되었습니다"
|
||||
description = "변경 사항이 저장되었습니다. 다시 로그인하세요."
|
||||
error = "사용자 이름을 업데이트할 수 없습니다. 비밀번호를 확인한 뒤 다시 시도하세요."
|
||||
changeUsername = "사용자 이름을 업데이트합니다. 업데이트 후 로그아웃됩니다."
|
||||
|
||||
[account]
|
||||
title = "계정 설정"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "계정 설정"
|
||||
adminSettings = "관리자 설정 - 사용자 보기 및 추가"
|
||||
userControlSettings = "사용자 제어 설정"
|
||||
changeUsername = "사용자 이름 변경"
|
||||
changeUsernameDescription = "사용자 이름을 업데이트합니다. 업데이트 후 로그아웃됩니다."
|
||||
newUsernamePlaceholder = "새 사용자 이름 입력"
|
||||
newUsername = "새 사용자 이름"
|
||||
password = "확인 비밀번호"
|
||||
oldPassword = "이전 비밀번호"
|
||||
@@ -749,11 +708,6 @@ tags = "서명,사인"
|
||||
title = "서명"
|
||||
desc = "그리기, 텍스트 또는 이미지로 PDF에 서명 추가"
|
||||
|
||||
[home.annotate]
|
||||
tags = "주석,강조,그리기"
|
||||
title = "주석"
|
||||
desc = "뷰어에서 강조 표시, 그리기, 메모와 도형 추가"
|
||||
|
||||
[home.flatten]
|
||||
tags = "단순화,제거,대화형"
|
||||
title = "평면화"
|
||||
@@ -965,7 +919,7 @@ title = "PDF 오버레이"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF 텍스트 편집기"
|
||||
desc = "그룹화된 텍스트 편집과 PDF 재생성으로 Stirling PDF의 JSON 내보내기를 검토하고 편집하세요"
|
||||
desc = "PDF 내부의 기존 텍스트와 이미지를 편집합니다"
|
||||
|
||||
[home.addText]
|
||||
tags = "텍스트,주석,레이블"
|
||||
@@ -976,7 +930,6 @@ desc = "PDF 어디에나 사용자 텍스트를 추가합니다"
|
||||
addFiles = "파일 추가"
|
||||
uploadFromComputer = "컴퓨터에서 업로드"
|
||||
openFromComputer = "컴퓨터에서 열기"
|
||||
mobileUpload = "모바일에서 업로드"
|
||||
|
||||
[viewPdf]
|
||||
tags = "보기,읽기,주석,텍스트,이미지"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ → PDF 옵션"
|
||||
optimizeForEbook = "전자책 리더기에 맞게 PDF 최적화(Ghostscript 사용)"
|
||||
cbzOutputOptions = "PDF → CBZ 옵션"
|
||||
cbzDpi = "이미지 렌더링용 DPI"
|
||||
cbrOptions = "CBR 옵션"
|
||||
cbrOutputOptions = "PDF에서 CBR로 옵션"
|
||||
cbrDpi = "이미지 렌더링용 DPI"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook에서 PDF로 옵션"
|
||||
ebookOptionsDesc = "eBook을 PDF로 변환하는 옵션"
|
||||
embedAllFonts = "모든 글꼴 포함"
|
||||
embedAllFontsDesc = "eBook의 모든 글꼴을 생성된 PDF에 포함"
|
||||
includeTableOfContents = "목차 포함"
|
||||
includeTableOfContentsDesc = "결과 PDF에 생성된 목차 추가"
|
||||
includePageNumbers = "페이지 번호 포함"
|
||||
includePageNumbersDesc = "생성된 PDF에 페이지 번호 추가"
|
||||
optimizeForEbookPdf = "전자책 리더 최적화"
|
||||
optimizeForEbookPdfDesc = "eBook 읽기에 맞게 PDF 최적화(파일 크기 축소, eInk 기기에서 더 나은 렌더링)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF에서 eBook으로 옵션"
|
||||
epubOptionsDesc = "PDF를 EPUB/AZW3로 변환하는 옵션"
|
||||
detectChapters = "챕터 감지"
|
||||
detectChaptersDesc = "챕터처럼 보이는 제목을 감지하여 EPUB 페이지 나누기 삽입"
|
||||
targetDevice = "대상 기기"
|
||||
targetDeviceDesc = "리더 기기에 최적화된 출력 프로필 선택"
|
||||
outputFormat = "출력 형식"
|
||||
outputFormatDesc = "eBook의 출력 형식 선택"
|
||||
tabletPhone = "태블릿/휴대폰(이미지 포함)"
|
||||
kindleEink = "Kindle e-Ink(텍스트 최적화)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "변환,이미지,jpg,사진"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "첨부 파일 추가"
|
||||
remove = "첨부 파일 제거"
|
||||
embed = "첨부 파일 내장"
|
||||
convertToPdfA3b = "PDF/A-3b로 변환"
|
||||
convertToPdfA3bDescription = "첨부 파일이 포함된 보관용 PDF를 생성합니다"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b는 장기 보존을 보장하는 보관 형식입니다. 임의의 파일 형식을 첨부 파일로 포함할 수 있습니다. 변환에는 Ghostscript가 필요하며 큰 파일은 시간이 더 걸릴 수 있습니다."
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b 변환 정보"
|
||||
convertToPdfA3bTooltipTitle = "기능"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1988,8 +1909,8 @@ placeholder = "수정 날짜"
|
||||
[changeMetadata.trapped]
|
||||
label = "트래핑 상태"
|
||||
unknown = "알 수 없음"
|
||||
true = "True"
|
||||
false = "False"
|
||||
true = "참"
|
||||
false = "거짓"
|
||||
|
||||
[changeMetadata.advanced]
|
||||
title = "고급 옵션"
|
||||
@@ -2385,10 +2306,6 @@ saved = "저장됨"
|
||||
label = "서명 이미지 업로드"
|
||||
placeholder = "이미지 파일 선택"
|
||||
hint = "서명 PNG 또는 JPG 이미지를 업로드하세요"
|
||||
removeBackground = "흰색 배경 제거(투명 처리)"
|
||||
processing = "이미지 처리 중..."
|
||||
backgroundRemovalFailedTitle = "배경 제거 실패"
|
||||
backgroundRemovalFailedMessage = "이미지에서 배경을 제거할 수 없습니다. 원본 이미지를 사용합니다."
|
||||
|
||||
[sign.instructions]
|
||||
title = "서명 추가 방법"
|
||||
@@ -2434,11 +2351,6 @@ note = "평탄화는 PDF의 대화형 요소를 제거하여 편집할 수 없
|
||||
label = "양식만 평면화"
|
||||
desc = "양식 필드만 평탄화하고 다른 대화형 요소는 그대로 둡니다"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "렌더링 DPI(선택 사항, 권장 150 DPI)"
|
||||
help = "비워 두면 시스템 기본값을 사용합니다. DPI가 높을수록 출력이 선명하지만 처리 시간과 파일 크기가 증가합니다."
|
||||
placeholder = "예: 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "평탄화 결과"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "PDF 자르기"
|
||||
submit = "제출"
|
||||
noFileSelected = "자르기를 시작하려면 PDF 파일을 선택하세요"
|
||||
reset = "전체 PDF로 재설정"
|
||||
autoCrop = "여백 자동 자르기"
|
||||
|
||||
[crop.preview]
|
||||
title = "자르기 영역 선택"
|
||||
@@ -3244,7 +3155,6 @@ title = "가리기 방법"
|
||||
mode = "모드"
|
||||
automatic = "자동"
|
||||
automaticDesc = "검색어 기준으로 텍스트 가리기"
|
||||
automaticDisabledTooltip = "한 번에 여러 파일을 가리려면 파일 관리자에서 파일을 선택하세요"
|
||||
manual = "수동"
|
||||
manualDesc = "드래그하여 특정 영역을 가리기"
|
||||
manualComingSoon = "수동 가리기 곧 제공"
|
||||
@@ -3315,35 +3225,8 @@ text = "완전한 단어만 일치시키며, 부분 일치는 제외합니다.
|
||||
title = "PDF-Image로 변환"
|
||||
text = "가리기 후 PDF를 이미지 기반 PDF로 변환합니다. 가리기 박스 뒤의 텍스트가 완전히 제거되어 복구할 수 없도록 보장합니다."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "수동 가리기 컨트롤"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "텍스트 표시 도구"
|
||||
text = "PDF에서 텍스트를 직접 선택해 가리기로 표시하세요. 가릴 특정 텍스트를 강조하려면 클릭 후 드래그하세요."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "영역 표시 도구"
|
||||
text = "PDF에 사각 영역을 그려 가릴 영역을 표시합니다. 이미지, 서명 또는 불규칙한 모양을 가릴 때 유용합니다."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "가리기 적용"
|
||||
text = "표시가 끝나면 '적용'을 클릭해 표시된 모든 영역을 영구적으로 가립니다. 대기 수는 적용할 가리기 개수를 나타냅니다."
|
||||
bullet1 = "적용 전 필요한 만큼 많은 영역을 표시하세요"
|
||||
bullet2 = "모든 대기 중인 가리기는 한 번에 적용됩니다"
|
||||
bullet3 = "적용 후에는 되돌릴 수 없습니다"
|
||||
|
||||
[redact.manual]
|
||||
title = "가리기 도구"
|
||||
instructions = "PDF에서 텍스트를 선택하거나 영역을 그려 가릴 콘텐츠를 표시하세요."
|
||||
markText = "텍스트 표시"
|
||||
markArea = "영역 표시"
|
||||
pendingLabel = "대기 중:"
|
||||
applyWarning = "⚠️ 영구 적용되며 되돌릴 수 없고, 아래 데이터는 삭제됩니다"
|
||||
apply = "적용"
|
||||
noMarks = "가리기 표시가 없습니다. 위 도구로 가릴 내용을 표시하세요."
|
||||
header = "수동 가리기"
|
||||
controlsTitle = "수동 가리기 컨트롤"
|
||||
textBasedRedaction = "텍스트 기반 가리기"
|
||||
pageBasedRedaction = "페이지 기반 가리기"
|
||||
convertPDFToImageLabel = "PDF를 PDF-Image로 변환(박스 뒤 텍스트 제거용)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "수평 분할 수 입력"
|
||||
label = "수직 분할"
|
||||
placeholder = "수직 분할 수 입력"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "분할 모드"
|
||||
description = "페이지를 분할하는 방법을 선택하세요"
|
||||
splitAll = "모든 페이지 분할"
|
||||
splitAllExceptFirst = "첫 페이지 제외 모두 분할"
|
||||
splitAllExceptLast = "마지막 페이지 제외 모두 분할"
|
||||
splitAllExceptFirstAndLast = "첫·마지막 페이지 제외 모두 분할"
|
||||
custom = "사용자 지정 페이지"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "사용자 지정 페이지 번호"
|
||||
placeholder = "예: 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "스탬프,이미지 추가,중앙 이미지,워터마크,PDF,삽입,사용자 지정"
|
||||
header = "PDF 스탬프"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "파일 크기"
|
||||
[compress.grayscale]
|
||||
label = "압축을 위해 그레이스케일 적용"
|
||||
|
||||
[compress.linearize]
|
||||
label = "빠른 웹 보기를 위해 PDF 선형화"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "이미지를 선화로 변환"
|
||||
description = "ImageMagick을 사용해 페이지를 고대비 흑백으로 변환하여 파일 크기를 최대한 줄입니다."
|
||||
unavailable = "이 서버에 ImageMagick이 설치되지 않았거나 활성화되어 있지 않습니다"
|
||||
detailLevel = "세부 수준"
|
||||
edgeEmphasis = "가장자리 강조"
|
||||
edgeLow = "부드럽게"
|
||||
edgeMedium = "균형"
|
||||
edgeHigh = "강하게"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "압축 설정 개요"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "높은 값은 파일 크기 감소"
|
||||
title = "그레이스케일"
|
||||
text = "이 옵션을 선택하면 모든 이미지를 흑백으로 변환합니다. 특히 스캔한 PDF나 이미지가 많은 문서의 파일 크기를 크게 줄일 수 있습니다."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "선화"
|
||||
text = "ImageMagick을 사용해 페이지를 고대비 흑백으로 변환합니다. 세부 수준은 얼마나 많은 콘텐츠를 검은색으로 만들지, 가장자리 강조는 가장자리를 얼마나 적극적으로 감지할지 제어합니다."
|
||||
|
||||
[compress.error]
|
||||
failed = "PDF를 압축하는 중 오류가 발생했습니다."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "PDF를 압축하는 중 오류가 발생했습니다."
|
||||
_value = "압축 설정"
|
||||
1 = "1-3 PDF 압축,</br> 4-6 약한 이미지 압축,</br> 7-9 강한 이미지 압축은 이미지 품질을 크게 낮춥니다"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "값이 낮을수록 품질은 유지되지만 파일 크기는 커집니다"
|
||||
range4to6 = "중간 압축으로 품질이 어느 정도 감소합니다"
|
||||
range7to9 = "값이 높을수록 파일 크기는 크게 줄지만 이미지 선명도가 낮아질 수 있습니다"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "이 파일은 비밀번호로 보호되어 있습니다. 비밀번호를 입력하세요:"
|
||||
cancelled = "PDF 작업이 취소되었습니다: {0}"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "선택한 페이지 삭제"
|
||||
closePdf = "PDF 닫기"
|
||||
exportAll = "PDF 내보내기"
|
||||
downloadSelected = "선택한 파일 다운로드"
|
||||
annotations = "주석"
|
||||
exportSelected = "선택한 페이지 내보내기"
|
||||
saveChanges = "변경 내용 저장"
|
||||
downloadAll = "전체 다운로드"
|
||||
saveAll = "모두 저장"
|
||||
toggleTheme = "테마 전환"
|
||||
toggleBookmarks = "북마크 표시/숨기기"
|
||||
language = "언어"
|
||||
toggleAnnotations = "주석 가시성 전환"
|
||||
search = "PDF 검색"
|
||||
panMode = "이동 모드"
|
||||
applyRedactionsFirst = "먼저 가리기 적용"
|
||||
rotateLeft = "왼쪽으로 회전"
|
||||
rotateRight = "오른쪽으로 회전"
|
||||
toggleSidebar = "사이드바 전환"
|
||||
toggleBookmarks = "북마크 표시/숨기기"
|
||||
exportSelected = "선택한 페이지 내보내기"
|
||||
toggleAnnotations = "주석 가시성 전환"
|
||||
annotationMode = "주석 모드 전환"
|
||||
print = "PDF 인쇄"
|
||||
draw = "그리기"
|
||||
redact = "가리기"
|
||||
exitRedaction = "가리기 모드 종료"
|
||||
save = "저장"
|
||||
downloadAll = "전체 다운로드"
|
||||
saveAll = "모두 저장"
|
||||
|
||||
[textAlign]
|
||||
left = "왼쪽"
|
||||
center = "가운데"
|
||||
right = "오른쪽"
|
||||
|
||||
[annotation]
|
||||
title = "주석"
|
||||
desc = "강조, 펜, 텍스트, 메모를 사용하세요. 변경 사항은 실시간으로 유지되며 평탄화가 필요 없습니다."
|
||||
highlight = "강조 표시"
|
||||
pen = "펜"
|
||||
text = "텍스트 상자"
|
||||
note = "메모"
|
||||
rectangle = "사각형"
|
||||
ellipse = "타원"
|
||||
select = "선택"
|
||||
exit = "주석 모드 종료"
|
||||
strokeWidth = "너비"
|
||||
opacity = "불투명도"
|
||||
strokeOpacity = "선 불투명도"
|
||||
fillOpacity = "채우기 불투명도"
|
||||
fontSize = "글꼴 크기"
|
||||
chooseColor = "색상 선택"
|
||||
color = "색상"
|
||||
strokeColor = "선 색상"
|
||||
fillColor = "채우기 색상"
|
||||
underline = "밑줄"
|
||||
strikeout = "취소선"
|
||||
squiggly = "물결 밑줄"
|
||||
inkHighlighter = "자유형 형광펜"
|
||||
freehandHighlighter = "자유형 형광펜"
|
||||
square = "정사각형"
|
||||
circle = "원"
|
||||
polygon = "다각형"
|
||||
line = "선"
|
||||
stamp = "이미지 추가"
|
||||
textMarkup = "텍스트 마크업"
|
||||
drawing = "그리기"
|
||||
shapes = "도형"
|
||||
notesStamps = "메모 및 스탬프"
|
||||
settings = "설정"
|
||||
borderOn = "테두리: 켜짐"
|
||||
borderOff = "테두리: 꺼짐"
|
||||
editInk = "펜 편집"
|
||||
editLine = "선 편집"
|
||||
editNote = "메모 편집"
|
||||
editText = "텍스트 상자 편집"
|
||||
editTextMarkup = "텍스트 마크업 편집"
|
||||
editSelected = "주석 편집"
|
||||
editSquare = "사각형 편집"
|
||||
editCircle = "원 편집"
|
||||
editPolygon = "다각형 편집"
|
||||
unsupportedType = "이 주석 유형은 편집을 완전히 지원하지 않습니다."
|
||||
textAlignment = "텍스트 정렬"
|
||||
noteIcon = "메모 아이콘"
|
||||
imagePreview = "미리보기"
|
||||
contents = "텍스트"
|
||||
backgroundColor = "배경색"
|
||||
clearBackground = "배경 제거"
|
||||
noBackground = "배경 없음"
|
||||
stampSettings = "스탬프 설정"
|
||||
savingCopy = "다운로드 준비 중..."
|
||||
saveFailed = "사본을 저장할 수 없습니다"
|
||||
saveReady = "다운로드 준비됨"
|
||||
selectAndMove = "선택 및 편집"
|
||||
editSelectDescription = "기존 주석을 클릭해 색상, 불투명도, 텍스트, 크기를 편집하세요."
|
||||
editStampHint = "이미지를 변경하려면 이 스탬프를 삭제하고 새로 추가하세요."
|
||||
editSwitchToSelect = "이 주석을 편집하려면 선택 및 편집으로 전환하세요."
|
||||
undo = "실행 취소"
|
||||
redo = "다시 실행"
|
||||
applyChanges = "변경 사항 적용"
|
||||
saveChanges = "변경 사항 저장"
|
||||
saveChanges = "변경 내용 저장"
|
||||
|
||||
[search]
|
||||
title = "PDF 검색"
|
||||
@@ -4265,20 +4038,12 @@ settings = "설정"
|
||||
adminSettings = "관리자 설정"
|
||||
allTools = "All Tools"
|
||||
reader = "리더"
|
||||
tours = "둘러보기"
|
||||
showMeAround = "둘러보기 시작"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "여기에서 둘러보기를 시청하세요: 도구 둘러보기, 새 V2 레이아웃 둘러보기, 관리자 둘러보기."
|
||||
user = "여기에서 둘러보기를 시청하세요: 도구 둘러보기와 새 V2 레이아웃 둘러보기."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "도구 둘러보기"
|
||||
toolsTourDesc = "도구로 할 수 있는 일을 알아보세요"
|
||||
adminTour = "관리자 둘러보기"
|
||||
adminTourDesc = "관리자 설정 및 기능을 살펴보세요"
|
||||
whatsNewTour = "V2의 새로운 기능 보기"
|
||||
whatsNewTourDesc = "업데이트된 레이아웃 둘러보기"
|
||||
|
||||
[admin]
|
||||
error = "오류"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "설정을 불러오지 못했습니다"
|
||||
saveError = "설정을 저장하지 못했습니다"
|
||||
saved = "설정이 성공적으로 저장되었습니다"
|
||||
saveSuccess = "설정이 성공적으로 저장되었습니다"
|
||||
success = "설정을 성공적으로 저장했습니다"
|
||||
error = "설정을 저장하지 못했습니다"
|
||||
save = "변경 사항 저장"
|
||||
discard = "버리기"
|
||||
restartRequired = "재시작 필요"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTML to PDF 변환을 위한 WeasyPrint 실행 파일 경로(기
|
||||
label = "Unoconvert 실행 파일"
|
||||
description = "문서 변환을 위한 LibreOffice unoconvert 경로(기본값 사용 시 비워두세요: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "프런트엔드 URL"
|
||||
description = "프런트엔드의 기본 URL(예: https://pdf.example.com). 이메일 초대 링크와 모바일 QR 코드 업로드에 사용됩니다. 비워 두면 백엔드 URL을 사용합니다."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "클릭하여 플랜 상세 보기"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "보안"
|
||||
description = "인증, 로그인 동작 및 보안 정책을 구성합니다."
|
||||
@@ -4505,7 +4261,7 @@ description = "컴플라이언스 및 보안 모니터링을 위해 사용자
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "감사 수준"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=끄기, 1=기본, 2=표준, 3=상세"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "감사 로그 보존 기간(일)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "연결"
|
||||
disconnect = "연결 해제"
|
||||
disconnected = "제공자가 성공적으로 연결 해제되었습니다"
|
||||
disconnectError = "제공자 연결 해제에 실패했습니다"
|
||||
mobileScannerConvertToPdf = "이미지를 PDF로 변환"
|
||||
mobileScannerConvertToPdfDesc = "업로드된 이미지를 자동으로 PDF 형식으로 변환합니다. 비활성화하면 이미지는 원본 그대로 유지됩니다."
|
||||
mobileScannerImageResolution = "이미지 해상도"
|
||||
mobileScannerImageResolutionDesc = "업로드 이미지의 해상도입니다. \"축소\"는 최대 1200px로 축소해 파일 크기를 줄입니다."
|
||||
imageResolutionFull = "전체(원본 크기)"
|
||||
imageResolutionReduced = "축소(최대 1200px)"
|
||||
mobileScannerPageFormat = "페이지 형식"
|
||||
mobileScannerPageFormatDesc = "변환된 이미지의 PDF 페이지 크기입니다. \"유지\"는 원본 이미지 크기를 사용합니다."
|
||||
pageFormatKeep = "유지(원본 크기)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11인치)"
|
||||
mobileScannerStretchToFit = "맞춤 확대/축소"
|
||||
mobileScannerStretchToFitDesc = "이미지를 페이지 전체에 맞도록 늘립니다. 비활성화하면 종횡비를 유지한 채 가운데 정렬됩니다."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO 자동 로그인"
|
||||
@@ -4646,122 +4389,6 @@ description = "첫 SAML2 로그인 시 사용자 계정을 자동으로 생성"
|
||||
label = "등록 차단"
|
||||
description = "SAML2를 통한 신규 사용자 등록 방지"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "모바일 업로드"
|
||||
enable = "QR 코드 업로드 활성화"
|
||||
description = "사용자가 QR 코드를 스캔해 모바일 기기에서 파일을 업로드하도록 허용"
|
||||
note = "참고: 프런트엔드 URL 구성이 필요합니다. "
|
||||
link = "시스템 설정에서 구성"
|
||||
mobileScannerConvertToPdf = "이미지를 PDF로 변환"
|
||||
mobileScannerConvertToPdfDesc = "업로드된 이미지를 자동으로 PDF 형식으로 변환합니다. 비활성화하면 이미지는 원본 그대로 유지됩니다."
|
||||
mobileScannerImageResolution = "이미지 해상도"
|
||||
mobileScannerImageResolutionDesc = "업로드 이미지의 해상도입니다. \"축소\"는 최대 1200px로 축소해 파일 크기를 줄입니다."
|
||||
imageResolutionFull = "전체(원본 크기)"
|
||||
imageResolutionReduced = "축소(최대 1200px)"
|
||||
mobileScannerPageFormat = "페이지 형식"
|
||||
mobileScannerPageFormatDesc = "변환된 이미지의 PDF 페이지 크기입니다. \"유지\"는 원본 이미지 크기를 사용합니다."
|
||||
pageFormatKeep = "유지(원본 크기)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11인치)"
|
||||
mobileScannerStretchToFit = "맞춤 확대/축소"
|
||||
mobileScannerStretchToFitDesc = "이미지를 페이지 전체에 맞도록 늘립니다. 비활성화하면 종횡비를 유지한 채 가운데 정렬됩니다."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram 봇"
|
||||
description = "Telegram 봇 연결, 접근 제어, 피드백 동작을 구성합니다."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram 봇 활성화"
|
||||
description = "구성한 Telegram 봇을 통해 사용자가 Stirling PDF와 상호작용하도록 허용합니다."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "봇 사용자 이름"
|
||||
description = "Telegram 봇의 공개 사용자 이름입니다."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "봇 토큰"
|
||||
description = "Telegram 봇을 위한 BotFather 제공 API 토큰입니다."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "수신함 폴더"
|
||||
description = "수신되는 Telegram 파일이 저장될 파이프라인 디렉터리 아래의 폴더입니다."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "커스텀 폴더 접미사 사용"
|
||||
description = "채팅 ID를 수신 파일 폴더에 추가해 채팅별 업로드를 분리합니다."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "접근 제어"
|
||||
description = "봇과 상호작용할 수 있는 사용자 또는 채널을 제한합니다."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "특정 사용자 ID 허용"
|
||||
description = "활성화 시, 목록에 있는 사용자 ID만 봇을 사용할 수 있습니다."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "허용된 사용자 ID"
|
||||
description = "봇과 상호작용을 허용할 Telegram 사용자 ID를 입력하세요."
|
||||
placeholder = "사용자 ID를 추가하고 Enter 키를 누르세요"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "특정 채널 ID 허용"
|
||||
description = "활성화 시, 목록에 있는 채널 ID만 봇을 사용할 수 있습니다."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "허용된 채널 ID"
|
||||
description = "봇과 상호작용을 허용할 Telegram 채널 ID를 입력하세요."
|
||||
placeholder = "채널 ID를 추가하고 Enter 키를 누르세요"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "처리"
|
||||
description = "Telegram 업로드의 폴링 간격과 처리 시간 제한을 제어합니다."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "처리 시간 제한(초)"
|
||||
description = "오류를 보고하기 전 처리 작업을 대기할 최대 시간입니다."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "폴링 간격(ms)"
|
||||
description = "새로운 Telegram 업데이트 확인 간격입니다."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "피드백 메시지"
|
||||
description = "봇이 사용자 및 채널에 피드백을 보낼 시점을 선택합니다."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "피드백 활성화"
|
||||
description = "봇이 피드백 메시지를 보낼지 여부를 제어합니다."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "채널 피드백 규칙"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "\"유효한 문서 없음\" 표시(채널)"
|
||||
description = "채널 업로드에 대해 유효한 문서 없음 응답을 표시하지 않습니다."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "처리 오류 표시(채널)"
|
||||
description = "채널에 처리 오류 메시지를 보냅니다."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "오류 메시지 표시(채널)"
|
||||
description = "채널에 상세 오류 메시지를 표시합니다."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "사용자 피드백 규칙"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "\"유효한 문서 없음\" 표시(사용자)"
|
||||
description = "사용자 업로드에 대해 유효한 문서 없음 응답을 표시하지 않습니다."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "처리 오류 표시(사용자)"
|
||||
description = "사용자에게 처리 오류 메시지를 보냅니다."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "오류 메시지 표시(사용자)"
|
||||
description = "사용자에게 상세 오류 메시지를 표시합니다."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "데이터베이스"
|
||||
description = "엔터프라이즈 배포를 위한 사용자 지정 데이터베이스 연결 설정을 구성합니다."
|
||||
@@ -4888,7 +4515,7 @@ description = "더 넓은 시스템 임시 디렉터리를 정리할지 여부(
|
||||
label = "프로세스 실행기 제한"
|
||||
description = "각 프로세스 실행기의 세션 제한 및 시간 제한을 구성합니다"
|
||||
libreOffice = "LibreOffice"
|
||||
pdfToHtml = "PDF to HTML"
|
||||
pdfToHtml = "PDF를 HTML로"
|
||||
qpdf = "QPDF"
|
||||
tesseract = "Tesseract OCR"
|
||||
pythonOpenCv = "Python OpenCV"
|
||||
@@ -4943,10 +4570,6 @@ description = "관리자가 자동 생성 비밀번호로 이메일을 통해
|
||||
label = "프런트엔드 URL"
|
||||
description = "프런트엔드의 기본 URL(예: https://pdf.example.com). 이메일의 초대 링크 생성에 사용됩니다. 비워두면 백엔드 URL을 사용합니다."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "참고: 프런트엔드 URL 구성이 필요합니다. "
|
||||
link = "시스템 설정에서 구성"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "법적 문서"
|
||||
description = "법적 문서 및 정책에 대한 링크를 구성합니다."
|
||||
@@ -4972,7 +4595,7 @@ label = "쿠키 정책"
|
||||
description = "쿠키 정책의 URL 또는 파일 이름"
|
||||
|
||||
[admin.settings.legal.impressum]
|
||||
label = "Impressum"
|
||||
label = "법적 고지"
|
||||
description = "Impressum의 URL 또는 파일 이름(일부 관할권에서 필수)"
|
||||
|
||||
[admin.settings.premium]
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "드라이브"
|
||||
myFiles = "내 파일"
|
||||
noRecentFiles = "최근 파일이 없습니다"
|
||||
googleDriveNotAvailable = "Google Drive 통합을 사용할 수 없습니다"
|
||||
mobileUpload = "모바일 업로드"
|
||||
mobileShort = "모바일"
|
||||
mobileUploadNotAvailable = "모바일 업로드가 활성화되어 있지 않습니다"
|
||||
downloadSelected = "선택 항목 다운로드"
|
||||
saveSelected = "선택 항목 저장"
|
||||
openFiles = "파일 열기"
|
||||
@@ -5449,7 +5069,6 @@ loading = "불러오는 중..."
|
||||
back = "뒤로"
|
||||
continue = "계속"
|
||||
error = "오류"
|
||||
save = "저장"
|
||||
|
||||
[config.overview]
|
||||
title = "애플리케이션 구성"
|
||||
@@ -5512,15 +5131,6 @@ impact = "현재 이 키를 사용하는 애플리케이션이나 서비스는
|
||||
confirmPrompt = "계속하시겠습니까?"
|
||||
confirmCta = "키 새로고침"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API 키 오류"
|
||||
failedToCreateApiKey = "API 키를 생성하지 못했습니다."
|
||||
failedToRetrieveApiKey = "응답에서 API 키를 가져오지 못했습니다."
|
||||
failedToFetchApiKey = "API 키를 가져오지 못했습니다."
|
||||
apiKeyRefreshed = "API 키 새로 고침"
|
||||
apiKeyRefreshedBody = "API 키가 성공적으로 새로 고쳐졌습니다."
|
||||
failedToRefreshApiKey = "API 키를 새로 고치지 못했습니다."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "첨부 파일 선택"
|
||||
info = "PDF에 첨부할 파일을 선택하세요. 선택한 파일은 포함되며 PDF의 첨부 패널을 통해 접근할 수 있습니다."
|
||||
@@ -5625,16 +5235,6 @@ finish = "완료"
|
||||
startTour = "투어 시작"
|
||||
startTourDescription = "Stirling PDF의 주요 기능을 둘러보는 가이드 투어"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Reader, Automate, 내 파일, 모든 둘러보기로 이동하려면 <strong>빠른 실행</strong> 레일에서 시작하세요."
|
||||
leftPanel = "왼쪽 <strong>도구</strong> 패널에 가능한 작업이 모두 나열됩니다. 카테고리를 탐색하거나 검색해 빠르게 도구를 찾으세요."
|
||||
fileUpload = "<strong>파일</strong> 버튼으로 PDF를 업로드하거나 최근 파일을 선택하세요. 작업 공간을 확인할 수 있도록 샘플을 불러옵니다."
|
||||
rightRail = "<strong>오른쪽 레일</strong>에는 파일 선택, 테마/언어 변경, 결과 다운로드 등 빠른 작업이 있습니다."
|
||||
topBar = "상단 바에서 <strong>뷰어</strong>, <strong>페이지 편집기</strong>, <strong>활성 파일</strong> 간 전환할 수 있습니다."
|
||||
pageEditorView = "페이지 편집기로 전환해 페이지를 재정렬, 회전 또는 삭제하세요."
|
||||
activeFilesView = "활성 파일에서 열려 있는 모든 항목을 보고 작업할 대상을 선택하세요."
|
||||
wrapUp = "이것이 V2의 새로운 점입니다. 언제든지 <strong>둘러보기</strong> 메뉴를 열어 이 둘러보기, 도구 둘러보기, 관리자 둘러보기를 다시 시청하세요."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Stirling PDF에 오신 것을 환영합니다!"
|
||||
description = "주요 기능과 시작 방법을 1분 만에 알아보는 간단한 투어를 진행할까요?"
|
||||
@@ -5655,10 +5255,6 @@ download = "다운로드 →"
|
||||
showMeAround = "둘러보기"
|
||||
skipTheTour = "투어 건너뛰기"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "둘러보기 개요"
|
||||
body = "Stirling PDF V2는 수십 가지 도구와 새로워진 레이아웃을 제공합니다. 변경된 점과 필요한 기능을 어디서 찾는지 빠르게 둘러보세요."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "나중에 건너뛰기"
|
||||
seePlans = "요금제 보기 →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "지금 업그레이드 →"
|
||||
freeTitle = "서버 라이선스"
|
||||
overLimitTitle = "서버 라이선스 필요"
|
||||
overLimitBody = "당사의 라이선스는 서버당 무료로 최대 <strong>{{freeTierLimit}}</strong>명의 사용자를 허용합니다. 현재 <strong>{{overLimitUserCopy}}</strong>명의 Stirling 사용자가 있습니다. 중단 없이 계속 사용하려면 Stirling Server 플랜으로 업그레이드하세요 - <strong>무제한 좌석</strong>, PDF 텍스트 편집, 전체 관리자 제어 제공, $99/서버/월."
|
||||
freeBody = "당사의 <strong>Open-Core</strong> 라이선스는 서버당 최대 <strong>{{freeTierLimit}}</strong>명의 사용자를 무료로 허용합니다. 중단 없이 확장하고 새로운 <strong>PDF 텍스트 편집 도구</strong>에 조기 액세스하려면 Stirling Server 플랜을 권장합니다 - 전체 편집과 <strong>무제한 좌석</strong>을 $99/서버/월에 제공합니다."
|
||||
freeBody = "당사의 <strong>Open-Core</strong> 라이선스는 서버당 최대 <strong>{{freeTierLimit}}</strong>명의 사용자를 무료로 허용합니다. 중단 없이 확장하려면 Stirling Server 플랜을 권장합니다 - <strong>무제한 좌석</strong> 및 <strong>SSO 지원</strong>, $99/서버/월."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "다운로드"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "영업팀 문의"
|
||||
contactToUpgrade = "요금제 업그레이드 또는 맞춤 설정은 문의해 주세요"
|
||||
maxUsers = "최대 사용자 수"
|
||||
upTo = "최대"
|
||||
getLicense = "서버 라이선스 받기"
|
||||
upgradeToEnterprise = "엔터프라이즈로 업그레이드"
|
||||
selectPeriod = "결제 주기 선택"
|
||||
monthlyBilling = "월별 결제"
|
||||
yearlyBilling = "연간 결제"
|
||||
checkoutOpened = "결제 창 열림"
|
||||
checkoutInstructions = "Stripe 탭에서 결제를 완료하세요. 결제 후 이곳으로 돌아와 페이지를 새로고침하면 라이선스가 활성화됩니다. 라이선스 키가 포함된 이메일도 발송됩니다."
|
||||
activateLicense = "라이선스 활성화"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "새 탭에서 결제 창 열림"
|
||||
instructions = "Stripe 탭에서 결제를 완료하세요. 결제가 완료되면 라이선스 키가 이메일로 전송됩니다."
|
||||
enterKey = "플랜을 활성화하려면 아래에 라이선스 키를 입력하세요:"
|
||||
keyDescription = "이메일의 라이선스 키를 붙여넣으세요"
|
||||
activate = "라이선스 활성화"
|
||||
doLater = "나중에 진행"
|
||||
success = "라이선스 활성화됨!"
|
||||
successMessage = "라이선스가 성공적으로 활성화되었습니다. 이제 이 창을 닫아도 됩니다."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "이메일 인증 필요"
|
||||
message = "Stripe 청구 포털에서 이메일 주소를 인증해야 합니다. 이메일의 로그인 링크를 확인하세요."
|
||||
|
||||
[plan.period]
|
||||
month = "월"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "감사 시스템을 사용할 수 없습니다"
|
||||
notAvailableMessage = "감사 시스템이 구성되어 있지 않거나 사용할 수 없습니다."
|
||||
disabled = "감사 로깅이 비활성화되었습니다"
|
||||
disabledMessage = "시스템 이벤트를 추적하려면 애플리케이션 구성에서 감사 로깅을 활성화하세요."
|
||||
enterpriseRequired = "엔터프라이즈 라이선스 필요"
|
||||
enterpriseRequiredMessage = "감사 로깅 시스템은 엔터프라이즈 기능입니다. 감사 로그와 분석에 접근하려면 엔터프라이즈 라이선스로 업그레이드하세요."
|
||||
|
||||
[audit.error]
|
||||
title = "감사 시스템을 불러오는 중 오류"
|
||||
@@ -6370,7 +5942,6 @@ description = "자가 호스팅 Stirling PDF 서버의 전체 URL을 입력하
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "서버 URL을 입력하세요"
|
||||
invalidUrl = "잘못된 URL 형식입니다. https://your-server.com 같은 올바른 URL을 입력하세요"
|
||||
unreachable = "서버에 연결할 수 없습니다"
|
||||
testFailed = "연결 테스트에 실패했습니다"
|
||||
configFetch = "서버 구성을 가져오지 못했습니다. URL을 확인하고 다시 시도하세요."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "연결 대상:"
|
||||
submit = "로그인"
|
||||
signInWith = "다음으로 로그인"
|
||||
oauthPending = "인증을 위해 브라우저를 여는 중..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "또는 이메일로 계속"
|
||||
serverRequirement = "참고: 서버에서 로그인 기능이 활성화되어 있어야 합니다."
|
||||
showInstructions = "활성화 방법"
|
||||
@@ -6455,8 +6025,6 @@ reset = "변경 사항 초기화"
|
||||
downloadJson = "JSON 다운로드"
|
||||
generatePdf = "PDF 생성"
|
||||
saveChanges = "변경 사항 저장"
|
||||
applyChanges = "변경 사항 적용"
|
||||
downloadCopy = "사본 다운로드"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "텍스트 자동 크기 조정"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "팁: Ctrl(Cmd) 또는 Shift를 눌러 텍스트 상자를
|
||||
title = "편집된 텍스트를 단일 PDF 요소로 고정"
|
||||
description = "활성화하면 겹치는 글리프나 혼합 폰트를 피하기 위해 편집된 각 텍스트 상자를 하나의 PDF 텍스트 요소로 내보냅니다."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "고급 설정"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "미리보기 제한사항"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "텍스트 및 이미지 중심"
|
||||
text = "이 작업 공간은 텍스트 편집과 포함된 이미지 재배치에 중점을 둡니다. 복잡한 페이지 아트워크, 양식 위젯, 레이어드 그래픽은 내보내기를 위해 보존되지만 여기서는 완전히 편집할 수 없습니다."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "미리보기 차이"
|
||||
text = "표 테두리, 도형, 주석 표시 등 일부 시각 요소는 미리보기에서 정확히 표시되지 않을 수 있습니다. 내보낸 PDF는 가능하면 원래 그리기 명령을 유지합니다."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "알파 뷰어"
|
||||
text = "이 알파 뷰어는 아직 발전 중입니다. 일부 글꼴, 색상, 투명 효과, 레이아웃 세부사항이 약간 달라질 수 있습니다. 공유 전 생성된 PDF를 꼭 다시 확인하세요."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "선택 항목 병합"
|
||||
merge = "선택 병합"
|
||||
@@ -6614,58 +6164,3 @@ title = "텍스트 추가 결과"
|
||||
|
||||
[addText.error]
|
||||
failed = "PDF에 텍스트를 추가하는 중 오류가 발생했습니다."
|
||||
|
||||
[mobileUpload]
|
||||
title = "모바일에서 업로드"
|
||||
description = "스캔하여 사진을 업로드하세요. 이미지는 자동으로 PDF로 변환됩니다."
|
||||
descriptionNoConvert = "모바일 기기에서 사진을 스캔해 업로드하세요."
|
||||
error = "연결 오류"
|
||||
pollingError = "파일 확인 중 오류"
|
||||
sessionId = "세션 ID"
|
||||
sessionCreateError = "세션을 생성하지 못했습니다"
|
||||
expiryWarning = "세션 만료 임박"
|
||||
expiryWarningMessage = "이 QR 코드는 {{seconds}}초 후 만료됩니다. 새 코드가 자동으로 생성됩니다."
|
||||
filesReceived = "파일 {{count}}개 수신됨"
|
||||
connected = "모바일 기기 연결됨"
|
||||
instructions = "휴대폰 카메라로 스캔하세요. 이미지는 자동으로 PDF로 변환됩니다."
|
||||
instructionsNoConvert = "휴대폰 카메라로 스캔해 파일을 업로드하세요."
|
||||
|
||||
[mobileScanner]
|
||||
title = "모바일 스캐너"
|
||||
noSession = "잘못된 세션"
|
||||
noSessionMessage = "이 페이지에 접근하려면 유효한 QR 코드를 스캔하세요."
|
||||
validating = "세션 검증 중..."
|
||||
sessionInvalid = "세션 오류"
|
||||
sessionExpired = "이 세션은 만료되었습니다. 새로고침 후 다시 시도하세요."
|
||||
sessionNotFound = "세션을 찾을 수 없습니다. 새로고침 후 다시 시도하세요."
|
||||
sessionValidationError = "세션을 확인할 수 없습니다. 다시 시도하세요."
|
||||
uploadSuccess = "업로드 성공!"
|
||||
uploadSuccessMessage = "이미지가 전송되었습니다."
|
||||
httpsRequired = "카메라 접근에는 HTTPS 또는 localhost가 필요합니다. HTTPS를 사용하거나 localhost로 접근하세요."
|
||||
uploadFailed = "업로드에 실패했습니다. 다시 시도하세요."
|
||||
uploading = "업로드 중..."
|
||||
connected = "연결됨"
|
||||
connecting = "연결 중..."
|
||||
chooseMethod = "업로드 방법 선택"
|
||||
chooseMethodDescription = "문서를 스캔하고 업로드할 방법을 선택하세요"
|
||||
camera = "카메라"
|
||||
cameraDescription = "기기 카메라로 자동 가장자리 감지와 함께 문서를 스캔"
|
||||
fileUpload = "파일 업로드"
|
||||
fileDescription = "기기의 기존 사진 또는 문서를 업로드"
|
||||
cameraAccessDenied = "카메라 접근이 거부되었습니다. 카메라 접근을 허용하세요."
|
||||
back = "뒤로"
|
||||
settings = "설정"
|
||||
edgeDetection = "가장자리 감지"
|
||||
flashlight = "손전등"
|
||||
flash = "플래시"
|
||||
processing = "처리 중..."
|
||||
capture = "사진 촬영"
|
||||
selectFilesPrompt = "업로드할 파일 선택"
|
||||
selectImage = "이미지 선택"
|
||||
preview = "미리보기"
|
||||
retake = "다시 찍기"
|
||||
addToBatch = "배치에 추가"
|
||||
upload = "업로드"
|
||||
batchImages = "배치"
|
||||
clearBatch = "지우기"
|
||||
uploadAll = "모두 업로드"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "നിങ്ങളുടെ PDF-ിൽ സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ ഉണ്ട്."
|
||||
pendingRedactionsTitle = "പ്രയോഗിച്ചിട്ടില്ലാത്ത റെഡാക്ഷനുകൾ"
|
||||
pendingRedactions = "നിങ്ങൾ പ്രയോഗിച്ചിട്ടില്ലാത്ത റെഡാക്ഷനുകൾ ഉണ്ട്; അവ നഷ്ടപ്പെടും."
|
||||
areYouSure = "നിങ്ങൾക്ക് പോകണമെന്ന് തീർച്ചയാണോ?"
|
||||
unsavedChangesTitle = "സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ"
|
||||
keepWorking = "തുടർന്നു പ്രവർത്തിക്കുക"
|
||||
discardChanges = "മാറ്റങ്ങൾ ഉപേക്ഷിച്ച് പുറത്ത് പോകുക"
|
||||
discardRedactions = "റദ്ദാക്കി പുറത്ത് പോകുക"
|
||||
applyAndContinue = "സേവ് ചെയ്ത് പുറത്ത് പോകുക"
|
||||
exportAndContinue = "എക്സ്പോർട്ട് ചെയ്ത് തുടരുക"
|
||||
cancel = "റദ്ദാക്കുക"
|
||||
@@ -134,7 +131,7 @@ unsupported = "പിന്തുണയില്ല"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "തുടങ്ങാൻ ഒരു ടൂൾ തിരഞ്ഞെടുക്കുക"
|
||||
alpha = "Alpha"
|
||||
alpha = "ആൽഫ"
|
||||
premiumFeature = "പ്രീമിയം ഫീച്ചർ:"
|
||||
comingSoon = "വരുന്നു:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "വിപുലമായത്"
|
||||
edit = "കാണുക & തിരുത്തുക"
|
||||
popular = "ജനപ്രിയം"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "അഭിരുചികൾ"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "അഡ്വാൻസ്ഡ്"
|
||||
title = "സുരക്ഷയും ഓതന്റിക്കേഷനും"
|
||||
security = "സുരക്ഷ"
|
||||
connections = "കണക്ഷനുകൾ"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "ലൈസൻസിംഗും അനലിറ്റിക്സും"
|
||||
@@ -382,7 +374,7 @@ privacy = "സ്വകാര്യത"
|
||||
|
||||
[settings.developer]
|
||||
title = "ഡെവലപ്പർ"
|
||||
apiKeys = "API Keys"
|
||||
apiKeys = "API കീകൾ"
|
||||
|
||||
[settings.tooltips]
|
||||
enableLoginFirst = "ആദ്യം ലോഗിൻ മോഡ് സജീവമാക്കുക"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "ഇപ്പോഴത്തെ പതിപ്പ്"
|
||||
latestVersion = "പുതിയ പതിപ്പ്"
|
||||
checkForUpdates = "അപ്ഡേറ്റുകൾ പരിശോധിക്കുക"
|
||||
viewDetails = "വിശദാംശങ്ങൾ കാണുക"
|
||||
serverNeedsUpdate = "സെർവർ അഡ്മിനിസ്ട്രേറ്റർ അപ്ഡേറ്റ് ചെയ്യണം"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "പതിപ്പ് വിവരം"
|
||||
description = "ഡെസ്ക്ടോപ്പിന്റെയും സെർവറിന്റെയും പതിപ്പ് വിവരങ്ങൾ"
|
||||
desktop = "ഡെസ്ക്ടോപ് പതിപ്പ്"
|
||||
server = "സെർവർ പതിപ്പ്"
|
||||
|
||||
[settings.security]
|
||||
title = "സുരക്ഷ"
|
||||
description = "അക്കൗണ്ട് സുരക്ഷിതമായി നിലനിർത്താൻ പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യുക."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "പാസ്വേഡ് മാറ്റുക. അപ്ഡേറ്റിനുശേഷം നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്യപ്പെടും."
|
||||
required = "എല്ലാ ഫീൽഡുകളും നിർബന്ധമാണ്."
|
||||
mismatch = "പുതിയ പാസ്വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല."
|
||||
error = "പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല. നിങ്ങളുടെ നിലവിലെ പാസ്വേഡ് ശരിയാണ് എന്ന് ഉറപ്പാക്കി വീണ്ടും ശ്രമിക്കുക."
|
||||
success = "പാസ്വേഡ് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു. ദയവായി വീണ്ടും സൈൻ ഇൻ ചെയ്യുക."
|
||||
ssoDisabled = "പാസ്വേഡ് മാറ്റങ്ങൾ നിങ്ങളുടെ ഐഡന്റിറ്റി പ്രൊവൈഡർ കൈകാര്യം ചെയ്യുന്നു."
|
||||
current = "ഇപ്പോൾ ഉള്ള പാസ്വേഡ്"
|
||||
currentPlaceholder = "നിലവിലെ പാസ്വേഡ് നൽകുക"
|
||||
new = "പുതിയ പാസ്വേഡ്"
|
||||
newPlaceholder = "പുതിയ പാസ്വേഡ് നൽകുക"
|
||||
confirm = "പുതിയ പാസ്വേഡ് സ്ഥിരീകരിക്കുക"
|
||||
confirmPlaceholder = "നിങ്ങളുടെ പുതിയ പാസ്വേഡ് വീണ്ടും നൽകുക"
|
||||
update = "പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യുക"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "കീബോർഡ് ഷോർട്ട്കട്ടുകൾ"
|
||||
@@ -522,16 +488,11 @@ low = "താഴ്ന്നത്"
|
||||
title = "വിവരങ്ങൾ മാറ്റുക"
|
||||
header = "നിങ്ങളുടെ അക്കൗണ്ട് വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക"
|
||||
changePassword = "നിങ്ങൾ സ്ഥിര ലോഗിൻ വിവരങ്ങളാണ് ഉപയോഗിക്കുന്നത്. ദയവായി ഒരു പുതിയ പാസ്വേഡ് നൽകുക"
|
||||
ssoManaged = "നിങ്ങളുടെ അക്കൗണ്ട് നിങ്ങളുടെ ഐഡന്റിറ്റി പ്രൊവൈഡർ കൈകാര്യം ചെയ്യുന്നു."
|
||||
newUsername = "പുതിയ ഉപയോക്തൃനാമം"
|
||||
oldPassword = "നിലവിലെ പാസ്വേഡ്"
|
||||
newPassword = "പുതിയ പാസ്വേഡ്"
|
||||
confirmNewPassword = "പുതിയ പാസ്വേഡ് സ്ഥിരീകരിക്കുക"
|
||||
submit = "മാറ്റങ്ങൾ സമർപ്പിക്കുക"
|
||||
credsUpdated = "അക്കൗണ്ട് അപ്ഡേറ്റ് ചെയ്തു"
|
||||
description = "മാറ്റങ്ങൾ സംരക്ഷിച്ചു. ദയവായി വീണ്ടും ലോഗിൻ ചെയ്യുക."
|
||||
error = "യൂസർനെയിം അപ്ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല. നിങ്ങളുടെ പാസ്വേഡ് ശരിയെന്ന് ഉറപ്പാക്കി വീണ്ടും ശ്രമിക്കുക."
|
||||
changeUsername = "നിങ്ങളുടെ യൂസർനെയിം അപ്ഡേറ്റ് ചെയ്യുക. അപ്ഡേറ്റിന് ശേഷം നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്യപ്പെടും."
|
||||
|
||||
[account]
|
||||
title = "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "അക്കൗണ്ട് ക്രമീകരണങ്ങ
|
||||
adminSettings = "അഡ്മിൻ ക്രമീകരണങ്ങൾ - ഉപയോക്താക്കളെ കാണുക, ചേർക്കുക"
|
||||
userControlSettings = "ഉപയോക്തൃ നിയന്ത്രണ ക്രമീകരണങ്ങൾ"
|
||||
changeUsername = "ഉപയോക്തൃനാമം മാറ്റുക"
|
||||
changeUsernameDescription = "നിങ്ങളുടെ യൂസർനെയിം അപ്ഡേറ്റ് ചെയ്യുക. അപ്ഡേറ്റിന് ശേഷം നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്യപ്പെടും."
|
||||
newUsernamePlaceholder = "നിങ്ങളുടെ പുതിയ യൂസർനെയിം നൽകുക"
|
||||
newUsername = "പുതിയ ഉപയോക്തൃനാമം"
|
||||
password = "സ്ഥിരീകരണ പാസ്വേഡ്"
|
||||
oldPassword = "പഴയ പാസ്വേഡ്"
|
||||
@@ -749,18 +708,13 @@ tags = "ഒപ്പ്,ഓട്ടോഗ്രാഫ്"
|
||||
title = "ഒപ്പിടുക"
|
||||
desc = "വരച്ചോ, ടെക്സ്റ്റ് ഉപയോഗിച്ചോ, ചിത്രം ഉപയോഗിച്ചോ PDF-ൽ ഒപ്പ് ചേർക്കുന്നു"
|
||||
|
||||
[home.annotate]
|
||||
tags = "അനോട്ടേറ്റ്,ഹൈലൈറ്റ്,വരയ്ക്കുക"
|
||||
title = "അനോട്ടേറ്റ്"
|
||||
desc = "വ്യൂവറിൽ ഹൈലൈറ്റ് ചെയ്യുക, വരയ്ക്കുക, കുറിപ്പുകളും രൂപങ്ങളും ചേർക്കുക"
|
||||
|
||||
[home.flatten]
|
||||
tags = "ലളിതമാക്കുക,നീക്കം ചെയ്യുക,ഇന്ററാക്ടീവ്"
|
||||
title = "പരത്തുക"
|
||||
desc = "ഒരു PDF-ൽ നിന്ന് എല്ലാ ഇന്ററാക്ടീവ് ഘടകങ്ങളും ഫോമുകളും നീക്കം ചെയ്യുക"
|
||||
|
||||
[home.certSign]
|
||||
tags = "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto"
|
||||
tags = "പ്രാമാണീകരണം,PEM,P12,ഔദ്യോഗികം,എൻക്രിപ്റ്റ്,സൈൻ,സർട്ടിഫിക്കറ്റ്,PKCS12,JKS,സെർവർ,മാനുവൽ,ഓട്ടോ"
|
||||
title = "സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒപ്പിടുക"
|
||||
desc = "ഒരു സർട്ടിഫിക്കറ്റ്/കീ (PEM/P12) ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുന്നു"
|
||||
|
||||
@@ -845,7 +799,7 @@ title = "ഒരൊറ്റ വലിയ പേജ്"
|
||||
desc = "എല്ലാ PDF പേജുകളും ഒരൊറ്റ വലിയ പേജിലേക്ക് ലയിപ്പിക്കുന്നു"
|
||||
|
||||
[home.showJS]
|
||||
tags = "javascript,code,script"
|
||||
tags = "javascript,കോഡ്,സ്ക്രിപ്റ്റ്"
|
||||
title = "ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക"
|
||||
desc = "ഒരു PDF-ൽ കുത്തിവച്ച ഏതെങ്കിലും JS തിരയുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു"
|
||||
|
||||
@@ -965,10 +919,10 @@ title = "PDF-കൾ ഓവർലേ ചെയ്യുക"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF ടെക്സ്റ്റ് എഡിറ്റർ"
|
||||
desc = "ഗ്രൂപ്പുചെയ്ത ടെക്സ്റ്റ് എഡിറ്റിംഗിനോടും PDF വീണ്ടും സൃഷ്ടിക്കുന്നതോടും കൂടി Stirling PDF JSON എക്സ്പോർട്ടുകൾ റിവ്യൂ ചെയ്ത് എഡിറ്റ് ചെയ്യുക"
|
||||
desc = "PDFകളിലെ നിലവിലുള്ള ടെക്സ്റ്റും ചിത്രങ്ങളും തിരുത്തുക"
|
||||
|
||||
[home.addText]
|
||||
tags = "text,annotation,label"
|
||||
tags = "ടെക്സ്റ്റ്,അനോട്ടേഷൻ,ലേബൽ"
|
||||
title = "ടെക്സ്റ്റ് ചേർക്കുക"
|
||||
desc = "നിങ്ങളുടെ PDF-ൽ എവിടെയിലും കസ്റ്റം ടെക്സ്റ്റ് ചേർക്കുക"
|
||||
|
||||
@@ -976,7 +930,6 @@ desc = "നിങ്ങളുടെ PDF-ൽ എവിടെയിലും ക
|
||||
addFiles = "ഫയലുകൾ ചേർക്കുക"
|
||||
uploadFromComputer = "കമ്പ്യൂട്ടറിൽ നിന്ന് അപ്ലോഡ് ചെയ്യുക"
|
||||
openFromComputer = "കമ്പ്യൂട്ടറിൽ നിന്ന് തുറക്കുക"
|
||||
mobileUpload = "മൊബൈൽ മുതൽ അപ്ലോഡ് ചെയ്യുക"
|
||||
|
||||
[viewPdf]
|
||||
tags = "കാണുക,വായിക്കുക,വ്യാഖ്യാനിക്കുക,ടെക്സ്റ്റ്,ചിത്രം,ഹൈലൈറ്റ്,തിരുത്തുക"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "CBZ ടു PDF ഓപ്ഷനുകൾ"
|
||||
optimizeForEbook = "ഇബുക്ക് റീഡറുകൾക്കായി PDF ഓപ്റ്റിമൈസ് ചെയ്യുക (Ghostscript ഉപയോഗിക്കുന്നു)"
|
||||
cbzOutputOptions = "PDF ടു CBZ ഓപ്ഷനുകൾ"
|
||||
cbzDpi = "ഇമേജ് റെൻഡറിംഗിനുള്ള DPI"
|
||||
cbrOptions = "CBR ഓപ്ഷനുകൾ"
|
||||
cbrOutputOptions = "PDF-നെ CBR ആക്കാനുള്ള ഓപ്ഷനുകൾ"
|
||||
cbrDpi = "ഇമേജ് റൻഡറിംഗിനുള്ള DPI"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "eBook-നെ PDF ആക്കാനുള്ള ഓപ്ഷനുകൾ"
|
||||
ebookOptionsDesc = "eBook-കളെ PDF ആക്കുന്നതിനുള്ള ഓപ്ഷനുകൾ"
|
||||
embedAllFonts = "എല്ലാ ഫോണ്ടുകളും ഉൾസേർക്കുക"
|
||||
embedAllFontsDesc = "eBook ലെയുള്ള എല്ലാ ഫോണ്ടുകളും സൃഷ്ടിക്കുന്ന PDF-ലേക്ക് ഉൾപ്പെടുത്തുക"
|
||||
includeTableOfContents = "വിഷയ സൂചി ഉൾപ്പെടുത്തുക"
|
||||
includeTableOfContentsDesc = "ഫലം ലഭിക്കുന്ന PDF-ൽ സൃഷ്ടിച്ച വിഷയം സൂചിക ചേർക്കുക"
|
||||
includePageNumbers = "പേജ് നമ്പറുകൾ ഉൾപ്പെടുത്തുക"
|
||||
includePageNumbersDesc = "സൃഷ്ടിച്ച PDF-ൽ പേജ് നമ്പറുകൾ ചേർക്കുക"
|
||||
optimizeForEbookPdf = "eBook റീഡറുകൾക്കായി ഒപ്റ്റിമൈസ് ചെയ്യുക"
|
||||
optimizeForEbookPdfDesc = "eBook വായനയ്ക്ക് PDF ഒപ്റ്റിമൈസ് ചെയ്യുക (ചെറുതായ ഫയൽ വലിപ്പം, eInk ഉപകരണങ്ങളിൽ മെച്ചപ്പെട്ട റെൻഡറിംഗ്)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "PDF-നെ eBook ആക്കാനുള്ള ഓപ്ഷനുകൾ"
|
||||
epubOptionsDesc = "PDF-നെ EPUB/AZW3 ആയി മാറ്റുന്നതിനുള്ള ഓപ്ഷനുകൾ"
|
||||
detectChapters = "അധ്യായങ്ങൾ കണ്ടെത്തുക"
|
||||
detectChaptersDesc = "അധ്യായങ്ങളായി തോന്നുന്ന തലക്കെട്ടുകൾ കണ്ടെത്തി EPUB പേജ് ബ്രേക്കുകൾ ചേർക്കുക"
|
||||
targetDevice = "ലക്ഷ്യ ഉപകരണം"
|
||||
targetDeviceDesc = "റീഡർ ഉപകരണത്തിന് ഒപ്റ്റിമൈസ് ചെയ്ത ഔട്ട്പുട്ട് പ്രൊഫൈൽ തിരഞ്ഞെടുക്കുക"
|
||||
outputFormat = "ഔട്ട്പുട്ട് ഫോർമാറ്റ്"
|
||||
outputFormatDesc = "eBook-ന്റെ ഔട്ട്പുട്ട് ഫോർമാറ്റ് തിരഞ്ഞെടുക്കുക"
|
||||
tabletPhone = "ടാബ്ലെറ്റ്/ഫോൺ (ചിത്രങ്ങളോടെ)"
|
||||
kindleEink = "Kindle e-Ink (ടെക്സ്റ്റ് ഒപ്റ്റിമൈസ്ഡ്)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ"
|
||||
@@ -1435,11 +1361,6 @@ header = "അറ്റാച്ച്മെന്റുകൾ ചേർക്ക
|
||||
add = "അറ്റാച്ച്മെന്റ് ചേർക്കുക"
|
||||
remove = "അറ്റാച്ച്മെന്റ് നീക്കം ചെയ്യുക"
|
||||
embed = "അറ്റാച്ച്മെന്റ് എംബെഡ് ചെയ്യുക"
|
||||
convertToPdfA3b = "PDF/A-3b ആയി മാറ്റുക"
|
||||
convertToPdfA3bDescription = "എംബെഡുചെയ്ത അറ്റാച്ച്മെന്റുകളോടുകൂടിയ ആർക്കൈവൽ PDF സൃഷ്ടിക്കുന്നു"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b ദീർഘകാല സംരക്ഷണം ഉറപ്പാക്കുന്ന ഒരു ആർക്കൈവൽ ഫോർമാറ്റാണ്. ഇത് ഇച്ഛാനുസൃത ഫയൽ ഫോർമാറ്റുകൾ അറ്റാച്ച്മെന്റുകളായി ഉൾചേർക്കാൻ അനുവദിക്കുന്നു. പരിവർത്തനത്തിന് Ghostscript ആവശ്യമാണ്, വലിയ ഫയലുകൾക്ക് കൂടുതൽ സമയം വേണ്ടിവരാം."
|
||||
convertToPdfA3bTooltipHeader = "PDF/A-3b പരിവർത്തനത്തെക്കുറിച്ച്"
|
||||
convertToPdfA3bTooltipTitle = "ഇത് ചെയ്യുന്നത്"
|
||||
submit = "അറ്റാച്ച്മെന്റുകൾ ചേർക്കുക"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "സേവ് ചെയ്തത്"
|
||||
label = "ഒപ്പിന്റെ ചിത്രം അപ്ലോഡ് ചെയ്യുക"
|
||||
placeholder = "ഇമേജ് ഫയൽ തിരഞ്ഞെടുക്കുക"
|
||||
hint = "നിങ്ങളുടെ ഒപ്പിന്റെ PNG അല്ലെങ്കിൽ JPG ചിത്രം അപ്ലോഡ് ചെയ്യുക"
|
||||
removeBackground = "വെള്ള ബാക്ക്ഗ്രൗണ്ട് നീക്കംചെയ്യുക (ട്രാൻസ്പാരന്റ് ആക്കുക)"
|
||||
processing = "ഇമേജ് പ്രോസസ്സ് ചെയ്യുന്നു..."
|
||||
backgroundRemovalFailedTitle = "ബാക്ക്ഗ്രൗണ്ട് നീക്കം ചെയ്യൽ പരാജയപ്പെട്ടു"
|
||||
backgroundRemovalFailedMessage = "ചിത്രത്തിൽ നിന്ന് ബാക്ക്ഗ്രൗണ്ട് നീക്കംചെയ്യാൻ കഴിഞ്ഞില്ല. പകരം യഥാർത്ഥ ചിത്രം ഉപയോഗിക്കുന്നു."
|
||||
|
||||
[sign.instructions]
|
||||
title = "ഒപ്പ് എങ്ങനെ ചേർക്കാം"
|
||||
@@ -2434,11 +2351,6 @@ note = "ഫ്ലാറ്റൻ ചെയ്യുന്നത് PDF-ിൽ
|
||||
label = "ഫോമുകൾ മാത്രം ഫ്ലാറ്റൻ ചെയ്യുക"
|
||||
desc = "ഫോം ഫീൽഡുകൾ മാത്രം ഫ്ലാറ്റൻ ചെയ്ത്, മറ്റു ഇന്ററാക്ടീവ് ഘടകങ്ങൾ അവികൃതമായി വിടുക"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "റെൻഡറിംഗ് DPI (ഐച്ഛികം, ശുപാർശ 150 DPI)"
|
||||
help = "സിസ്റ്റം ഡീഫോൾട്ട് ഉപയോഗിക്കാൻ ഒഴിവാക്കുക. ഉയർന്ന DPI ഔട്ട്പുട്ട് കൂടുതൽ മൂർച്ചയാക്കും, പക്ഷേ പ്രോസസിംഗ് സമയംയും ഫയൽ വലിപ്പവും വർധിപ്പിക്കും."
|
||||
placeholder = "ഉദാ. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "ഫ്ലാറ്റൻ ഫലങ്ങൾ"
|
||||
|
||||
@@ -2835,7 +2747,7 @@ submit = "സമർപ്പിക്കുക"
|
||||
failed = "മൾട്ടി-പേജ് ലേഔട്ട് സൃഷ്ടിക്കുമ്പോൾ പിശക് സംഭവിച്ചു."
|
||||
|
||||
[bookletImposition]
|
||||
tags = "booklet,imposition,printing,binding,folding,signature"
|
||||
tags = "ബുക്ക്ലെറ്റ്,ഇംപോസിഷൻ,പ്രിന്റിംഗ്,ബൈൻഡിംഗ്,മടക്കൽ,സിഗ്നേച്ചർ"
|
||||
title = "ബുക്ക്ലെറ്റ് ഇംപോസിഷൻ"
|
||||
header = "ബുക്ക്ലെറ്റ് ഇംപോസിഷൻ"
|
||||
submit = "ബുക്ക്ലെറ്റ് സൃഷ്ടിക്കുക"
|
||||
@@ -2934,7 +2846,7 @@ scaleFactor = "ഒരു പേജിന്റെ സൂം നില (ക്ര
|
||||
submit = "സമർപ്പിക്കുക"
|
||||
|
||||
[adjustPageScale]
|
||||
tags = "resize,modify,dimension,adapt"
|
||||
tags = "വലിപ്പമാറ്റം,ഭേദഗതി,പരിമാണം,അനുസൃതമാക്കൽ"
|
||||
title = "പേജ് സ്കെയിൽ ക്രമപ്പെടുത്തുക"
|
||||
header = "പേജ് സ്കെയിൽ ക്രമപ്പെടുത്തുക"
|
||||
submit = "പേജ് സ്കെയിൽ ക്രമപ്പെടുത്തുക"
|
||||
@@ -2945,8 +2857,8 @@ label = "സ്കെയിൽ ഫാക്ടർ"
|
||||
[adjustPageScale.pageSize]
|
||||
label = "ടാർഗറ്റ് പേജ് വലിപ്പം"
|
||||
keep = "അസൽ വലിപ്പം നിലനിർത്തുക"
|
||||
letter = "Letter"
|
||||
legal = "Legal"
|
||||
letter = "ലറ്റർ"
|
||||
legal = "ലീഗൽ"
|
||||
|
||||
[adjustPageScale.error]
|
||||
failed = "പേജ് സ്കെയിൽ ക്രമപ്പെടുത്തുന്നതിനിടെ പിശക് സംഭവിച്ചു."
|
||||
@@ -3013,7 +2925,6 @@ header = "PDF ക്രോപ്പ് ചെയ്യുക"
|
||||
submit = "സമർപ്പിക്കുക"
|
||||
noFileSelected = "ക്രോപ്പ് ആരംഭിക്കാൻ ഒരു PDF ഫയൽ തിരഞ്ഞെടുക്കുക"
|
||||
reset = "പൂർണ്ണ PDF ലേക്ക് റീസെറ്റ് ചെയ്യുക"
|
||||
autoCrop = "ശൂന്യസ്ഥലം സ്വയം ക്രോപ്പ് ചെയ്യുക"
|
||||
|
||||
[crop.preview]
|
||||
title = "ക്രോപ്പ് ഏരിയ തിരഞ്ഞെടുപ്പ്"
|
||||
@@ -3244,7 +3155,6 @@ title = "റിഡാക്ഷൻ രീതി"
|
||||
mode = "മോഡ്"
|
||||
automatic = "ഓട്ടോമാറ്റിക്"
|
||||
automaticDesc = "തിരച്ചിൽ പദങ്ങളുടെ അടിസ്ഥാനത്തിൽ ടെക്സ്റ്റ് റിഡാക്റ്റ് ചെയ്യുക"
|
||||
automaticDisabledTooltip = "ഒരുമിച്ചു ഒന്നിലധികം ഫയലുകൾ റെഡാക്റ്റ് ചെയ്യാൻ ഫയൽ മാനേജറിൽ ഫയലുകൾ തിരഞ്ഞെടുക്കുക"
|
||||
manual = "മാനുവൽ"
|
||||
manualDesc = "നിശ്ചിത മേഖലകൾ റിഡാക്റ്റ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്ത് ഡ്രാഗ് ചെയ്യുക"
|
||||
manualComingSoon = "മാനുവൽ റിഡാക്ഷൻ ഉടൻ വരുന്നു"
|
||||
@@ -3315,35 +3225,8 @@ text = "പൂർണ്ണ വാക്കുകൾ മാത്രം മാച
|
||||
title = "PDF-Image ആയി മാറ്റുക"
|
||||
text = "റിഡാക്ഷൻ കഴിഞ്ഞ് PDF-നെ ഇമേജ്-അധിഷ്ടിത PDF ആയി മാറ്റുന്നു. റിഡാക്ഷൻ ബോക്സുകളുടെ പിന്നിലെ ടെക്സ്റ്റ് പൂർണമായും നീക്കംചെയ്ത് തിരിച്ചുപിടിക്കാനാവാത്തതാക്കുന്നു."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "മാനുവൽ റെഡാക്ഷൻ നിയന്ത്രണങ്ങൾ"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "ടെക്സ്റ്റ് മാർക്ക് ടൂൾ"
|
||||
text = "റെഡാക്ഷൻ ചെയ്യാൻ PDF-ൽ നേരിട്ട് ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കുക. റെഡാക്റ്റ് ചെയ്യേണ്ട പ്രത്യേക ടെക്സ്റ്റ് ഹൈലൈറ്റ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്ത് വലിക്കുക."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "ഏരിയ മാർക്ക് ടൂൾ"
|
||||
text = "റെഡാക്ഷൻ ചെയ്യേണ്ട മേഖലകൾ അടയാളപ്പെടുത്താൻ PDF-ൽ ചതുരാകൃതിയിലുള്ള പ്രദേശങ്ങൾ വരയ്ക്കുക. ചിത്രങ്ങൾ, ഒപ്പുകൾ, അല്ലെങ്കിൽ അനിയമിത ആകൃതികൾ മറയ്ക്കാൻ ഇത് ഉപകാരപ്രദമാണ്."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "റെഡാക്ഷനുകൾ പ്രയോഗിക്കുക"
|
||||
text = "ഉള്ളടക്കം അടയാളപ്പെടുത്തിയതിന് ശേഷം, 'Apply' ക്ലിക്ക് ചെയ്ത് എല്ലാ അടയാളപ്പെടുത്തിയ ഭാഗങ്ങളും സ്ഥിരമായി റെഡാക്റ്റ് ചെയ്യുക. പെൻഡിംഗ് എണ്ണം എത്ര റെഡാക്ഷനുകൾ പ്രയോഗിക്കാൻ തയ്യാറാണെന്ന് കാണിക്കും."
|
||||
bullet1 = "പ്രയോഗിക്കുന്നതിന് മുമ്പ് ആവശ്യമുള്ളത്ര മേഖലയെ അടയാളപ്പെടുത്തുക"
|
||||
bullet2 = "എല്ലാ പെൻഡിംഗ് റെഡാക്ഷനുകളും ഒരേസമയം പ്രയോഗിക്കും"
|
||||
bullet3 = "പ്രയോഗിച്ചതിന് ശേഷം റെഡാക്ഷനുകൾ പിൻവലിക്കാൻ സാധിക്കില്ല"
|
||||
|
||||
[redact.manual]
|
||||
title = "റെഡാക്ഷൻ ഉപകരണങ്ങൾ"
|
||||
instructions = "റെഡാക്ഷനായി ഉള്ളടക്കം അടയാളപ്പെടുത്താൻ PDF-ൽ ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കുകയോ പ്രദേശങ്ങൾ വരയ്ക്കുകയോ ചെയ്യുക."
|
||||
markText = "ടെക്സ്റ്റ് മാർക്ക് ചെയ്യുക"
|
||||
markArea = "ഏരിയ മാർക്ക് ചെയ്യുക"
|
||||
pendingLabel = "പെൻഡിംഗ്:"
|
||||
applyWarning = "⚠️ സ്ഥിരമായി പ്രയോഗിക്കുന്നു; പിന്വലിക്കാൻ കഴിയില്ല, അടിഞ്ഞിരിക്കുന്ന ഡാറ്റ ഇല്ലാതാകും"
|
||||
apply = "പ്രയോഗിക്കുക"
|
||||
noMarks = "റെഡാക്ഷൻ മാർക്കുകളൊന്നുമില്ല. മുകളിലുള്ള ഉപകരണങ്ങൾ ഉപയോഗിച്ച് റെഡാക്ഷനായി ഉള്ളടക്കം അടയാളപ്പെടുത്തുക."
|
||||
header = "മാനുവൽ റിഡാക്ഷൻ"
|
||||
controlsTitle = "മാനുവൽ റെഡാക്ഷൻ നിയന്ത്രണങ്ങൾ"
|
||||
textBasedRedaction = "ടെക്സ്റ്റ്-അധിഷ്ടിത റിഡാക്ഷൻ"
|
||||
pageBasedRedaction = "പേജ്-അധിഷ്ടിത റിഡാക്ഷൻ"
|
||||
convertPDFToImageLabel = "PDF-നെ PDF-Image ആയി മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കാൻ ഉപയോഗിക്കുന്നു)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "തിരശ്ചീന വിഭജനങ്ങളുടെ എ
|
||||
label = "ലംബ വിഭജനങ്ങൾ"
|
||||
placeholder = "ലംബ വിഭജനങ്ങളുടെ എണ്ണം നൽകുക"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "സ്പ്ലിറ്റ് മോഡ്"
|
||||
description = "പേജുകൾ എങ്ങനെ വിഭജിക്കണമെന്ന് തിരഞ്ഞെടുക്കുക"
|
||||
splitAll = "എല്ലാ പേജുകളും വിഭജിക്കുക"
|
||||
splitAllExceptFirst = "ആദ്യത്തെ ഒഴികെ എല്ലാം വിഭജിക്കുക"
|
||||
splitAllExceptLast = "അവസാനത്തെ ഒഴികെ എല്ലാം വിഭജിക്കുക"
|
||||
splitAllExceptFirstAndLast = "ആദ്യം, അവസാനം ഒഴികെ എല്ലാം വിഭജിക്കുക"
|
||||
custom = "ഇഷ്ടാനുസൃത പേജുകൾ"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "ഇഷ്ടാനുസൃത പേജ് നമ്പറുകൾ"
|
||||
placeholder = "ഉദാ. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "സ്റ്റാമ്പ്, ചിത്രം ചേർക്കുക, ചിത്രം മധ്യത്തിലാക്കുക, വാട്ടർമാർക്ക്, PDF, ഉൾപ്പെടുത്തുക, ഇഷ്ടാനുസൃതമാക്കുക"
|
||||
header = "PDF സ്റ്റാമ്പ് ചെയ്യുക"
|
||||
@@ -3611,7 +3481,7 @@ certHint = "കസ്റ്റം ട്രസ്റ്റ് സോഴ്സ
|
||||
title = "സ്ഥിരീകരണ സെറ്റിങ്ങുകൾ"
|
||||
|
||||
[replaceColor]
|
||||
tags = "Replace Colour,Page operations,Back end,server side"
|
||||
tags = "നിറം പകരുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക്എൻഡ്,സെർവർ-സൈഡ്"
|
||||
|
||||
[replaceColor.labels]
|
||||
settings = "സെറ്റിങ്ങുകൾ"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "ഫയൽ വലിപ്പം"
|
||||
[compress.grayscale]
|
||||
label = "കംപ്രഷനായി ഗ്രേസ്കെയിൽ പ്രയോഗിക്കുക"
|
||||
|
||||
[compress.linearize]
|
||||
label = "വേഗത്തിലുള്ള വെബ് കാണുന്നതിനായി PDF ലിനിയറൈസ് ചെയ്യുക"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "ചിത്രങ്ങളെ ലൈൻ ആർട്ടാക്കി മാറ്റുക"
|
||||
description = "പരമാവധി വലുപ്പ കുറയ്ക്കുന്നതിനായി പേജുകൾ ഹൈ-കോൺട്രാസ്റ്റ് കറുപ്പ്-വെളുപ്പാക്കി മാറ്റാൻ ImageMagick ഉപയോഗിക്കുന്നു."
|
||||
unavailable = "ImageMagick ഈ സെർവറിൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല അല്ലെങ്കിൽ പ്രവർത്തനക്ഷമമല്ല"
|
||||
detailLevel = "വിശദത നില"
|
||||
edgeEmphasis = "എഡ്ജ് ഊന്നൽ"
|
||||
edgeLow = "മൃദുവായി"
|
||||
edgeMedium = "സമതുലിതം"
|
||||
edgeHigh = "ശക്തമായി"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "കംപ്രസ് സെറ്റിങ്ങുകളുടെ അവലോകനം"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "ഉയർന്ന മൂല്യങ്ങൾ ഫയൽ വലിപ
|
||||
title = "ഗ്രേസ്കെയിൽ"
|
||||
text = "എല്ലാ ഇമേജുകളും ബ്ലാക്ക്-ആൻഡ്-വൈറ്റാക്കി മാറ്റാൻ ഈ ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക; പ്രത്യേകിച്ച് സ്കാൻ ചെയ്ത PDFകൾക്കും ഇമേജ് കൂടുതലുള്ള ഡോക്യുമെന്റുകൾക്കും ഫയൽ വലിപ്പം ഗണ്യമായി കുറയ്ക്കാം."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "ലൈൻ ആർട്ട്"
|
||||
text = "ImageMagick ഉപയോഗിച്ച് പേജുകൾ ഹൈ-കോൺട്രാസ്റ്റ് കറുപ്പ്-വെളുപ്പാക്കി മാറ്റുക. എത്ര ഉള്ളടക്കം കറുപ്പാകണമെന്നത് നിയന്ത്രിക്കാൻ വിശദത നില ഉപയോഗിക്കുക, അറ്റങ്ങൾ കണ്ടെത്തുന്നതിന്റെ ശക്തി നിയന്ത്രിക്കാൻ എഡ്ജ് ഊന്നൽ ഉപയോഗിക്കുക."
|
||||
|
||||
[compress.error]
|
||||
failed = "PDF കംപ്രസ് ചെയ്യുന്നതിനിടെ പിശക് സംഭവിച്ചു."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "PDF കംപ്രസ് ചെയ്യുന്നതിനിട
|
||||
_value = "കംപ്രഷൻ ക്രമീകരണങ്ങൾ"
|
||||
1 = "1-3 PDF കംപ്രഷൻ,</br> 4-6 ലൈറ്റ് ഇമേജ് കംപ്രഷൻ,</br> 7-9 തീവ്രമായ ഇമേജ് കംപ്രഷൻ ചിത്രത്തിന്റെ ഗുണനിലവാരം ഗണ്യമായി കുറയ്ക്കും"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "കുറഞ്ഞ മൂല്യങ്ങൾ ഗുണനിലവാരം നിലനിർത്തും, പക്ഷേ വലിയ ഫയലുകൾ ലഭിക്കും"
|
||||
range4to6 = "ഇടത്തരം കമ്പ്രഷൻ, മിതമായ ഗുണനിലവാര കുറവ്"
|
||||
range7to9 = "ഉയർന്ന മൂല്യങ്ങൾ ഫയൽ വലിപ്പം ഗണ്യമായി കുറയ്ക്കും, പക്ഷേ ചിത്രത്തിന്റെ വ്യക്തത കുറയാം"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "ഈ ഫയൽ പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു. ദയവായി പാസ്വേഡ് നൽകുക:"
|
||||
cancelled = "PDF-നായുള്ള പ്രവർത്തനം റദ്ദാക്കി: {0}"
|
||||
@@ -4027,7 +3875,7 @@ version = "നിലവിലെ റിലീസ്"
|
||||
title = "API ഡോക്യുമെന്റേഷൻ"
|
||||
header = "API ഡോക്യുമെന്റേഷൻ"
|
||||
desc = "Stirling PDF API എൻഡ്പോയിന്റുകൾ കാണുകയും പരിശോധിക്കുകയും ചെയ്യുക"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,ഡോക്യുമെന്റേഷൻ,swagger,എൻഡ്പോയിന്റുകൾ,വികസനം"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "ഞങ്ങൾ കുക്കികൾ എങ്ങനെ ഉപയോഗിക്കുന്നു"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "തിരഞ്ഞെടുത്ത പേജുകൾ ഇല
|
||||
closePdf = "PDF അടയ്ക്കുക"
|
||||
exportAll = "PDF എക്സ്പോർട്ട് ചെയ്യുക"
|
||||
downloadSelected = "തിരഞ്ഞെടുത്ത ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യുക"
|
||||
annotations = "അനോട്ടേഷനുകൾ"
|
||||
exportSelected = "തിരഞ്ഞെടുത്ത പേജുകൾ എക്സ്പോർട്ട് ചെയ്യുക"
|
||||
saveChanges = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
downloadAll = "എല്ലാം ഡൗൺലോഡ് ചെയ്യുക"
|
||||
saveAll = "എല്ലാം സേവ് ചെയ്യുക"
|
||||
toggleTheme = "തീം മാറ്റുക"
|
||||
toggleBookmarks = "ബുക്ക്മാർക്കുകൾ ടോഗിൾ ചെയ്യുക"
|
||||
language = "ഭാഷ"
|
||||
toggleAnnotations = "അനോട്ടേഷൻ ദൃശ്യമാനം മാറ്റുക"
|
||||
search = "PDF തിരയുക"
|
||||
panMode = "പാൻ മോഡ്"
|
||||
applyRedactionsFirst = "ആദ്യം റെഡാക്ഷനുകൾ പ്രയോഗിക്കുക"
|
||||
rotateLeft = "ഇടത്തേക്ക് തിരിക്കുക"
|
||||
rotateRight = "വലത്തേക്ക് തിരിക്കുക"
|
||||
toggleSidebar = "സൈഡ്ബാർ മാറ്റുക"
|
||||
toggleBookmarks = "ബുക്ക്മാർക്കുകൾ ടോഗിൾ ചെയ്യുക"
|
||||
exportSelected = "തിരഞ്ഞെടുത്ത പേജുകൾ എക്സ്പോർട്ട് ചെയ്യുക"
|
||||
toggleAnnotations = "അനോട്ടേഷൻ ദൃശ്യമാനം മാറ്റുക"
|
||||
annotationMode = "അനോട്ടേഷൻ മോഡ് മാറ്റുക"
|
||||
print = "PDF അച്ചടിക്കുക"
|
||||
draw = "വരയ്ക്കുക"
|
||||
redact = "റെഡാക്റ്റ് ചെയ്യുക"
|
||||
exitRedaction = "റെഡാക്ഷൻ മോഡിൽ നിന്ന് പുറത്ത് പോകുക"
|
||||
save = "സംരക്ഷിക്കുക"
|
||||
downloadAll = "എല്ലാം ഡൗൺലോഡ് ചെയ്യുക"
|
||||
saveAll = "എല്ലാം സേവ് ചെയ്യുക"
|
||||
|
||||
[textAlign]
|
||||
left = "ഇടത്"
|
||||
center = "മധ്യം"
|
||||
right = "വലത്"
|
||||
|
||||
[annotation]
|
||||
title = "അനോട്ടേറ്റ്"
|
||||
desc = "ഹൈലൈറ്റ്, പേന, ടെക്സ്റ്റ്, കുറിപ്പുകൾ എന്നിവ ഉപയോഗിക്കുക. മാറ്റങ്ങൾ തത്സമയം നിലനിൽക്കും—ഫ്ലാറ്റൻ ചെയ്യേണ്ടതില്ല."
|
||||
highlight = "ഹൈലൈറ്റ്"
|
||||
pen = "പേന"
|
||||
text = "ടെക്സ്റ്റ് ബോക്സ്"
|
||||
note = "കുറിപ്പ്"
|
||||
rectangle = "ആയതം"
|
||||
ellipse = "എലിപ്സ്"
|
||||
select = "തിരഞ്ഞെടുക്കുക"
|
||||
exit = "അനോട്ടേഷൻ മോഡിൽ നിന്ന് പുറത്ത് പോകുക"
|
||||
strokeWidth = "കനം"
|
||||
opacity = "അപാകത"
|
||||
strokeOpacity = "സ്ട്രോക്കിന്റെ അപാകത"
|
||||
fillOpacity = "ഫിൽ അപാകത"
|
||||
fontSize = "ഫോണ്ട് വലുപ്പം"
|
||||
chooseColor = "നിറം തിരഞ്ഞെടുക്കുക"
|
||||
color = "നിറം"
|
||||
strokeColor = "സ്ട്രോക്ക് നിറം"
|
||||
fillColor = "ഫിൽ നിറം"
|
||||
underline = "അടിവര"
|
||||
strikeout = "സ്ട്രൈക്കൗട്ട്"
|
||||
squiggly = "സ്ക്വിഗ്ലി"
|
||||
inkHighlighter = "ഫ്രീഹാൻഡ് ഹൈലൈറ്റർ"
|
||||
freehandHighlighter = "ഫ്രീഹാൻഡ് ഹൈലൈറ്റർ"
|
||||
square = "ചതുരം"
|
||||
circle = "വൃത്തം"
|
||||
polygon = "ബഹുഭുജം"
|
||||
line = "രേഖ"
|
||||
stamp = "ചിത്രം ചേർക്കുക"
|
||||
textMarkup = "ടെക്സ്റ്റ് മാർക്കപ്പ്"
|
||||
drawing = "വരയ്ക്കൽ"
|
||||
shapes = "ആകൃതികൾ"
|
||||
notesStamps = "കുറിപ്പുകളും സ്റ്റാമ്പുകളും"
|
||||
settings = "സെറ്റിങ്ങുകൾ"
|
||||
borderOn = "ബോർഡർ: ഓൺ"
|
||||
borderOff = "ബോർഡർ: ഓഫ്"
|
||||
editInk = "പേന എഡിറ്റ് ചെയ്യുക"
|
||||
editLine = "രേഖ എഡിറ്റ് ചെയ്യുക"
|
||||
editNote = "കുറിപ്പ് എഡിറ്റ് ചെയ്യുക"
|
||||
editText = "ടെക്സ്റ്റ് ബോക്സ് എഡിറ്റ് ചെയ്യുക"
|
||||
editTextMarkup = "ടെക്സ്റ്റ് മാർക്കപ്പ് എഡിറ്റ് ചെയ്യുക"
|
||||
editSelected = "അനോട്ടേഷൻ എഡിറ്റ് ചെയ്യുക"
|
||||
editSquare = "ചതുരം എഡിറ്റ് ചെയ്യുക"
|
||||
editCircle = "വൃത്തം എഡിറ്റ് ചെയ്യുക"
|
||||
editPolygon = "ബഹുഭുജം എഡിറ്റ് ചെയ്യുക"
|
||||
unsupportedType = "ഈ അനോട്ടേഷൻ തരം പൂർണ്ണമായി എഡിറ്റിംഗിനായി പിന്തുണയ്ക്കുന്നില്ല."
|
||||
textAlignment = "ടെക്സ്റ്റ് അലൈന്മെന്റ്"
|
||||
noteIcon = "കുറിപ്പ് ഐക്കൺ"
|
||||
imagePreview = "പ്രിവ്യൂ"
|
||||
contents = "ടെക്സ്റ്റ്"
|
||||
backgroundColor = "ബാക്ക്ഗ്രൗണ്ട് നിറം"
|
||||
clearBackground = "ബാക്ക്ഗ്രൗണ്ട് നീക്കംചെയ്യുക"
|
||||
noBackground = "ബാക്ക്ഗ്രൗണ്ട് ഇല്ല"
|
||||
stampSettings = "സ്റ്റാമ്പ് സജ്ജീകരണങ്ങൾ"
|
||||
savingCopy = "ഡൗൺലോഡിനായി തയ്യാറാക്കുന്നു..."
|
||||
saveFailed = "കോപ്പി സംരക്ഷിക്കാൻ കഴിഞ്ഞില്ല"
|
||||
saveReady = "ഡൗൺലോഡ് തയ്യാറാണ്"
|
||||
selectAndMove = "തിരഞ്ഞെടുക്കി എഡിറ്റ് ചെയ്യുക"
|
||||
editSelectDescription = "നിറം, അപാകത, ടെക്സ്റ്റ്, വലുപ്പം എന്നിവ എഡിറ്റ് ചെയ്യാൻ നിലവിലുള്ള അനോട്ടേഷൻ ക്ലിക്ക് ചെയ്യുക."
|
||||
editStampHint = "ചിത്രം മാറ്റാൻ, ഈ സ്റ്റാമ്പ് ഇല്ലാതാക്കി പുതിയത് ചേർക്കുക."
|
||||
editSwitchToSelect = "ഈ അനോട്ടേഷൻ എഡിറ്റ് ചെയ്യാൻ Select & Edit-ലേക്ക് മാറുക."
|
||||
undo = "അൺഡു"
|
||||
redo = "റീഡു"
|
||||
applyChanges = "മാറ്റങ്ങൾ പ്രയോഗിക്കുക"
|
||||
saveChanges = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "സെറ്റിങ്ങുകൾ"
|
||||
adminSettings = "അഡ്മിൻ സെറ്റിങ്ങുകൾ"
|
||||
allTools = "All Tools"
|
||||
reader = "റീഡർ"
|
||||
tours = "ടൂറുകൾ"
|
||||
showMeAround = "എനിക്ക് കാണിച്ചു തരൂ"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "ഇവിടെ വാക്ക്ത്രൂസ് കാണുക: Tools ടൂർ, പുതിയ V2 ലേഔട്ട് ടൂർ, Admin ടൂർ."
|
||||
user = "ഇവിടെ വാക്ക്ത്രൂസ് കാണുക: Tools ടൂർ, പുതിയ V2 ലേഔട്ട് ടൂർ."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "ടൂളുകളുടെ പരിചയം"
|
||||
toolsTourDesc = "ഉപകരണങ്ങൾ എന്ത് ചെയ്യുമെന്നു പഠിക്കുക"
|
||||
adminTour = "അഡ്മിൻ പരിചയം"
|
||||
adminTourDesc = "അഡ്മിൻ സജ്ജീകരണങ്ങളും സവിശേഷതകളും അന്വേഷിക്കുക"
|
||||
whatsNewTour = "V2-ലെ പുതുമകൾ കാണുക"
|
||||
whatsNewTourDesc = "അപ്ഡേറ്റ് ചെയ്ത ലേഔട്ട് ടൂർ ചെയ്യുക"
|
||||
|
||||
[admin]
|
||||
error = "പിശക്"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "സജ്ജീകരണങ്ങൾ ലോഡുചെയ്യ
|
||||
saveError = "സജ്ജീകരണങ്ങൾ സംരക്ഷിക്കൽ പരാജയപ്പെട്ടു"
|
||||
saved = "സജ്ജീകരണങ്ങൾ വിജയകരമായി സംരക്ഷിച്ചു"
|
||||
saveSuccess = "സജ്ജീകരണങ്ങൾ വിജയകരമായി സംരക്ഷിച്ചു"
|
||||
success = "സജ്ജീകരണങ്ങൾ വിജയകരമായി സംരക്ഷിച്ചു"
|
||||
error = "സജ്ജീകരണങ്ങൾ സംരക്ഷിക്കാൻ പരാജയപ്പെട്ടു"
|
||||
save = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
discard = "തള്ളുക"
|
||||
restartRequired = "റീസ്റ്റാർട്ട് ആവശ്യമാണ്"
|
||||
@@ -4422,13 +4185,6 @@ description = "HTML-നെ PDF ആക്കുന്നതിനുള്ള Wea
|
||||
label = "Unoconvert എക്സിക്യൂട്ടബിൾ"
|
||||
description = "ഡോക്യുമെന്റ് കൺവർഷനുകൾക്കായുള്ള LibreOffice unoconvert-ന്റെ പാത (ഡീഫാൾട്ട് ഉപയോഗിക്കാൻ ശൂന്യം വിടുക: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "ഫ്രണ്ട്എൻഡ് URL"
|
||||
description = "ഫ്രണ്ട്എൻഡിന്റെ ബെയ്സ് URL (ഉദാ., https://pdf.example.com). ഇമെയിൽ ക്ഷണ ലിങ്കുകൾക്കും മൊബൈൽ QR കോഡ് അപ്ലോഡുകൾക്കും ഉപയോഗിക്കുന്നു. ബാക്ക്എൻഡ് URL ഉപയോഗിക്കാനായി ശൂന്യമാക്കുക."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "പ്ലാൻ വിശദാംശങ്ങൾ കാണാൻ ക്ലിക്ക് ചെയ്യുക"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "സുരക്ഷ"
|
||||
description = "ഓതന്റിക്കേഷൻ, ലോഗിൻ പെരുമാറ്റം, സുരക്ഷാ നയങ്ങൾ എന്നിവ ക്രമീകരിക്കുക."
|
||||
@@ -4565,19 +4321,6 @@ connect = "കണക്റ്റ് ചെയ്യുക"
|
||||
disconnect = "ഡിസ്കണക്റ്റ് ചെയ്യുക"
|
||||
disconnected = "പ്രൊവൈഡർ വിജയകരമായി ഡിസ്കണക്റ്റ് ചെയ്തു"
|
||||
disconnectError = "പ്രൊവൈഡറെ ഡിസ്കണക്റ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു"
|
||||
mobileScannerConvertToPdf = "ചിത്രങ്ങളെ PDF ആക്കുക"
|
||||
mobileScannerConvertToPdfDesc = "അപ്ലോഡ് ചെയ്ത ചിത്രങ്ങളെ സ്വയമേവ PDF ഫോർമാറ്റിലേക്ക് മാറ്റുക. പ്രവർത്തനരഹിതമാക്കിയാൽ, ചിത്രങ്ങൾ അതേപടി നിലനിർത്തും."
|
||||
mobileScannerImageResolution = "ഇമേജ് റെസല്യൂഷൻ"
|
||||
mobileScannerImageResolutionDesc = "അപ്ലോഡ് ചെയ്ത ചിത്രങ്ങളുടെ റെസല്യൂഷൻ. \"Reduced\" ഫയൽ വലുപ്പം കുറയ്ക്കാൻ ചിത്രങ്ങളെ പരമാവധി 1200px ആയി സ്കെയിൽ ചെയ്യും."
|
||||
imageResolutionFull = "ഫുൾ (യഥാർത്ഥ വലുപ്പം)"
|
||||
imageResolutionReduced = "റിഡ്യൂസ്ഡ് (പരമാവധി 1200px)"
|
||||
mobileScannerPageFormat = "പേജ് ഫോർമാറ്റ്"
|
||||
mobileScannerPageFormatDesc = "മാറ്റിയ ചിത്രങ്ങൾക്ക് PDF പേജ് വലുപ്പം. \"Keep\" യഥാർത്ഥ ചിത്രത്തിന്റെ അളവുകൾ ഉപയോഗിക്കും."
|
||||
pageFormatKeep = "കീപ് (യഥാർത്ഥ അളവുകൾ)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "ഫിറ്റ് ചെയ്യാൻ നീട്ടുക"
|
||||
mobileScannerStretchToFitDesc = "ചിത്രങ്ങളെ മുഴുവൻ പേജ് നിറയ്ക്കാൻ നീട്ടുക. പ്രവർത്തനരഹിതമാക്കിയാൽ, ചിത്രങ്ങൾ ആസ്പെക്ട് അനുപാതം നിലനിർത്തി നടുവിലേക്ക് നിരത്തും."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO ഓട്ടോ ലോഗിൻ"
|
||||
@@ -4596,7 +4339,7 @@ label = "പ്രൊവൈഡർ"
|
||||
description = "ഓതന്റിക്കേഷനായി ഉപയോഗിക്കുന്ന OAuth2 പ്രൊവൈഡർ"
|
||||
|
||||
[admin.settings.connections.oauth2.issuer]
|
||||
label = "Issuer URL"
|
||||
label = "ഇഷ്യൂവർ URL"
|
||||
description = "OAuth2 പ്രൊവൈഡറിന്റെ issuer URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
@@ -4620,7 +4363,7 @@ label = "രജിസ്ട്രേഷൻ തടയുക"
|
||||
description = "OAuth2 വഴി പുതിയ ഉപയോക്തൃ രജിസ്ട്രേഷൻ തടയുക"
|
||||
|
||||
[admin.settings.connections.oauth2.scopes]
|
||||
label = "OAuth2 Scopes"
|
||||
label = "OAuth2 സ്കോപ്പുകൾ"
|
||||
description = "OAuth2 സ്കോപ്പുകളുടെ കോമ ഉപയോഗിച്ച് വേർതിരിച്ച പട്ടിക (ഉദാ., openid, profile, email)"
|
||||
|
||||
[admin.settings.connections.saml2]
|
||||
@@ -4646,122 +4389,6 @@ description = "ആദ്യ SAML2 ലോഗിനിൽ ഉപയോക്തൃ
|
||||
label = "രജിസ്ട്രേഷൻ തടയുക"
|
||||
description = "SAML2 വഴി പുതിയ ഉപയോക്തൃ രജിസ്ട്രേഷൻ തടയുക"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "മൊബൈൽ ഫോൺ അപ്ലോഡ്"
|
||||
enable = "QR കോഡ് അപ്ലോഡ് പ്രവർത്തനക്ഷമമാക്കുക"
|
||||
description = "QR കോഡ് സ്കാൻ ചെയ്ത് ഉപയോക്താക്കൾക്ക് മൊബൈൽ ഉപകരണങ്ങളിൽ നിന്ന് ഫയലുകൾ അപ്ലോഡ് ചെയ്യാൻ അനുവദിക്കുക"
|
||||
note = "കുറിപ്പ്: Frontend URL കോൺഫിഗർ ചെയ്തിരിക്കണം. "
|
||||
link = "സിസ്റ്റം സജ്ജീകരണങ്ങളിൽ കോൺഫിഗർ ചെയ്യുക"
|
||||
mobileScannerConvertToPdf = "ചിത്രങ്ങളെ PDF ആക്കുക"
|
||||
mobileScannerConvertToPdfDesc = "അപ്ലോഡ് ചെയ്ത ചിത്രങ്ങളെ സ്വയമേവ PDF ഫോർമാറ്റിലേക്ക് മാറ്റുക. പ്രവർത്തനരഹിതമാക്കിയാൽ, ചിത്രങ്ങൾ അതേപടി നിലനിർത്തും."
|
||||
mobileScannerImageResolution = "ഇമേജ് റെസല്യൂഷൻ"
|
||||
mobileScannerImageResolutionDesc = "അപ്ലോഡ് ചെയ്ത ചിത്രങ്ങളുടെ റെസല്യൂഷൻ. \"Reduced\" ഫയൽ വലുപ്പം കുറയ്ക്കാൻ ചിത്രങ്ങളെ പരമാവധി 1200px ആയി സ്കെയിൽ ചെയ്യും."
|
||||
imageResolutionFull = "ഫുൾ (യഥാർത്ഥ വലുപ്പം)"
|
||||
imageResolutionReduced = "റിഡ്യൂസ്ഡ് (പരമാവധി 1200px)"
|
||||
mobileScannerPageFormat = "പേജ് ഫോർമാറ്റ്"
|
||||
mobileScannerPageFormatDesc = "മാറ്റിയ ചിത്രങ്ങൾക്ക് PDF പേജ് വലുപ്പം. \"Keep\" യഥാർത്ഥ ചിത്രത്തിന്റെ അളവുകൾ ഉപയോഗിക്കും."
|
||||
pageFormatKeep = "കീപ് (യഥാർത്ഥ അളവുകൾ)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "ഫിറ്റ് ചെയ്യാൻ നീട്ടുക"
|
||||
mobileScannerStretchToFitDesc = "ചിത്രങ്ങളെ മുഴുവൻ പേജ് നിറയ്ക്കാൻ നീട്ടുക. പ്രവർത്തനരഹിതമാക്കിയാൽ, ചിത്രങ്ങൾ ആസ്പെക്ട് അനുപാതം നിലനിർത്തി നടുവിലേക്ക് നിരത്തും."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram ബോട്ട്"
|
||||
description = "Telegram ബോട്ടിന്റെ കണക്റ്റിവിറ്റി, ആക്സസ് നിയന്ത്രണങ്ങൾ, ഫീഡ്ബാക്ക് പെരുമാറ്റം എന്നിവ കോൺഫിഗർ ചെയ്യുക."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram ബോട്ട് പ്രവർത്തനക്ഷമമാക്കുക"
|
||||
description = "കോൺഫിഗർ ചെയ്ത Telegram ബോട്ടിലൂടെ ഉപയോക്താക്കൾക്ക് Stirling PDF ഉപയോഗിക്കാൻ അനുവദിക്കുക."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "ബോട്ട് യൂസർനെയിം"
|
||||
description = "നിങ്ങളുടെ Telegram ബോട്ടിന്റെ പൊതു യൂസർനെയിം."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "ബോട്ട് ടോക്കൺ"
|
||||
description = "നിങ്ങളുടെ Telegram ബോട്ടിനായി BotFather നൽകുന്ന API ടോക്കൺ."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "ഇൻബോക്സ് ഫോൾഡർ"
|
||||
description = "പൈപ്പ്ലൈനിൻറെ ഡയറക്ടറിയിൽ Telegram ഫയലുകൾ സംഭരിക്കുന്ന ഫോൾഡർ."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "ഇഷ്ടാനുസൃത ഫോൾഡർ സഫിക്സ് ഉപയോഗിക്കുക"
|
||||
description = "ഓരോ ചാറ്റിനുമുള്ള അപ്ലോഡുകൾ വേർതിരിക്കാൻ, വരുന്ന ഫയൽ ഫോൾഡറുകൾക്ക് ചാറ്റ് ID ചേർക്കുക."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "പ്രവേശന നിയന്ത്രണം"
|
||||
description = "ഏത് ഉപയോക്താക്കളോ ചാനലുകളോ ബോട്ടുമായി ഇടപഴകാമെന്ന് നിയന്ത്രിക്കുക."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "നിർദ്ദിഷ്ട User IDകൾ അനുവദിക്കുക"
|
||||
description = "ഇത് പ്രവർത്തനക്ഷമമാക്കിയാൽ, പട്ടികപ്പെടുത്തിയ User IDകൾക്ക് മാത്രം ബോട്ട് ഉപയോഗിക്കാം."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "അനുവദിച്ച User IDകൾ"
|
||||
description = "ബോട്ടുമായി ഇടപഴകാൻ അനുവദിച്ച Telegram User IDകൾ നൽകുക."
|
||||
placeholder = "User ID ചേർക്കുക, Enter അമർത്തുക"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "നിർദ്ദിഷ്ട Channel IDകൾ അനുവദിക്കുക"
|
||||
description = "ഇത് പ്രവർത്തനക്ഷമമാക്കിയാൽ, പട്ടികപ്പെടുത്തിയ Channel IDകൾക്ക് മാത്രം ബോട്ട് ഉപയോഗിക്കാം."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "അനുവദിച്ച Channel IDകൾ"
|
||||
description = "ബോട്ടുമായി ഇടപഴകാൻ അനുവദിച്ച Telegram Channel IDകൾ നൽകുക."
|
||||
placeholder = "Channel ID ചേർക്കുക, Enter അമർത്തുക"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "പ്രോസസ്സിംഗ്"
|
||||
description = "Telegram അപ്ലോഡുകൾക്കുള്ള പോളിംഗ് ഇൻറർവാലുകളും പ്രോസസ്സിംഗ് ടൈംഔട്ടുകളും നിയന്ത്രിക്കുക."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "പ്രോസസ്സിംഗ് ടൈംഔട്ട് (സെക്കൻഡ്)"
|
||||
description = "പിശക് റിപ്പോർട്ട് ചെയ്യുന്നതിന് മുമ്പ് പ്രോസസ്സിംഗ് ജോബിനായി കാത്തിരിക്കുന്ന പരമാവധി സമയം."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "പോളിംഗ് ഇൻറർവാൽ (ms)"
|
||||
description = "പുതിയ Telegram അപ്ഡേറ്റുകൾ പരിശോധിക്കുന്നതിനിടയിലെ ഇടവേള."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "ഫീഡ്ബാക്ക് സന്ദേശങ്ങൾ"
|
||||
description = "ബോട്ട് ഉപയോക്താക്കൾക്കും ചാനലുകൾക്കും എപ്പോൾ ഫീഡ്ബാക്ക് അയയ്ക്കണമെന്ന് തിരഞ്ഞെടുക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "ഫീഡ്ബാക്ക് പ്രവർത്തനക്ഷമമാക്കുക"
|
||||
description = "ബോട്ട് ഫീഡ്ബാക്ക് സന്ദേശങ്ങൾ അയയ്ക്കണമോ എന്നത് നിയന്ത്രിക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "ചാനൽ ഫീഡ്ബാക്ക് ചട്ടങ്ങൾ"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "\"No valid document\" കാണിക്കുക (ചാനൽ)"
|
||||
description = "ചാനൽ അപ്ലോഡുകളിൽ \"No valid document\" പ്രതികരണം പ്രദർശിപ്പിക്കാതിരിക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "പ്രോസസ്സിംഗ് പിശകുകൾ കാണിക്കുക (ചാനൽ)"
|
||||
description = "പ്രോസസ്സിംഗ് പിശക് സന്ദേശങ്ങൾ ചാനലുകൾക്ക് അയയ്ക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "പിശക് സന്ദേശങ്ങൾ കാണിക്കുക (ചാനൽ)"
|
||||
description = "ചാനലുകൾക്ക് വിശദമായ പിശക് സന്ദേശങ്ങൾ കാണിക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "ഉപയോക്തൃ ഫീഡ്ബാക്ക് ചട്ടങ്ങൾ"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "\"No valid document\" കാണിക്കുക (ഉപയോക്താവ്)"
|
||||
description = "ഉപയോക്തൃ അപ്ലോഡുകളിൽ \"No valid document\" പ്രതികരണം പ്രദർശിപ്പിക്കാതിരിക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "പ്രോസസ്സിംഗ് പിശകുകൾ കാണിക്കുക (ഉപയോക്താവ്)"
|
||||
description = "പ്രോസസ്സിംഗ് പിശക് സന്ദേശങ്ങൾ ഉപയോക്താക്കൾക്ക് അയയ്ക്കുക."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "പിശക് സന്ദേശങ്ങൾ കാണിക്കുക (ഉപയോക്താവ്)"
|
||||
description = "ഉപയോക്താക്കൾക്ക് വിശദമായ പിശക് സന്ദേശങ്ങൾ കാണിക്കുക."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "ഡാറ്റാബേസ്"
|
||||
description = "എന്റർപ്രൈസ് വിന്യാസങ്ങൾക്ക് കസ്റ്റം ഡാറ്റാബേസുമായി ബന്ധപ്പെട്ട സജ്ജീകരണങ്ങൾ ക്രമീകരിക്കുക."
|
||||
@@ -4943,10 +4570,6 @@ description = "ഓട്ടോ-ജനറേറ്റ് ചെയ്ത പാ
|
||||
label = "ഫ്രണ്ട്എൻഡ് URL"
|
||||
description = "ഫ്രണ്ട്എൻഡിനുള്ള ബേസ് URL (ഉദാ. https://pdf.example.com). ഇമെയിലുകളിലെ ക്ഷണ ലിങ്കുകൾ സൃഷ്ടിക്കാൻ ഉപയോഗിക്കുന്നു. ബാക്ക്എൻഡ് URL ഉപയോഗിക്കാനായി ശൂന്യം വിടുക."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "കുറിപ്പ്: Frontend URL കോൺഫിഗർ ചെയ്തിരിക്കണം. "
|
||||
link = "സിസ്റ്റം സജ്ജീകരണങ്ങളിൽ കോൺഫിഗർ ചെയ്യുക"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "ലീഗൽ ഡോക്യുമെന്റുകൾ"
|
||||
description = "നിയമ പ്രമാണങ്ങളും നയങ്ങളും സംബന്ധിച്ച ലിങ്കുകൾ ക്രമീകരിക്കുക."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "ഡ്രൈവ്"
|
||||
myFiles = "എന്റെ ഫയലുകൾ"
|
||||
noRecentFiles = "സമീപകാല ഫയലുകൾ ഒന്നും കണ്ടെത്തിയില്ല"
|
||||
googleDriveNotAvailable = "Google Drive ഇന്റഗ്രേഷൻ ലഭ്യമല്ല"
|
||||
mobileUpload = "മൊബൈൽ അപ്ലോഡ്"
|
||||
mobileShort = "മൊബൈൽ"
|
||||
mobileUploadNotAvailable = "മൊബൈൽ അപ്ലോഡ് പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല"
|
||||
downloadSelected = "തിരഞ്ഞെടുത്തത് ഡൗൺലോഡ് ചെയ്യുക"
|
||||
saveSelected = "തിരഞ്ഞെടുത്തത് സേവ് ചെയ്യുക"
|
||||
openFiles = "ഫയലുകൾ തുറക്കുക"
|
||||
@@ -5449,7 +5069,6 @@ loading = "ലോഡുചെയ്യുന്നു..."
|
||||
back = "തിരികെ"
|
||||
continue = "തുടരുക"
|
||||
error = "പിശക്"
|
||||
save = "സംരക്ഷിക്കുക"
|
||||
|
||||
[config.overview]
|
||||
title = "ആപ്ലിക്കേഷൻ ക്രമീകരണം"
|
||||
@@ -5512,15 +5131,6 @@ impact = "ഇപ്പോൾ ഈ കീകൾ ഉപയോഗിക്കുന
|
||||
confirmPrompt = "തുടരാൻ നിങ്ങൾക്ക് ഉറപ്പാണോ?"
|
||||
confirmCta = "കീകൾ റിഫ്രെഷ് ചെയ്യുക"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API കീ പിശക്"
|
||||
failedToCreateApiKey = "API കീ സൃഷ്ടിക്കാൻ പരാജയപ്പെട്ടു."
|
||||
failedToRetrieveApiKey = "പ്രതികരണത്തിൽ നിന്ന് API കീ ലഭ്യമാക്കാൻ പരാജയപ്പെട്ടു."
|
||||
failedToFetchApiKey = "API കീ കൊണ്ടുവരാൻ പരാജയപ്പെട്ടു."
|
||||
apiKeyRefreshed = "API കീ പുതുക്കി"
|
||||
apiKeyRefreshedBody = "നിങ്ങളുടെ API കീ വിജയകരമായി പുതുക്കി."
|
||||
failedToRefreshApiKey = "API കീ പുതുക്കാൻ പരാജയപ്പെട്ടു."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "അറ്റാച്ച്മെന്റുകൾ തിരഞ്ഞെടുക്കുക"
|
||||
info = "നിങ്ങളുടെ PDFയിലേക്ക് അറ്റാച്ചുചെയ്യാൻ ഫയലുകൾ തിരഞ്ഞെടുക്കുക. ഈ ഫയലുകൾ എംബെഡ് ചെയ്യപ്പെടുകയും PDFയുടെ അറ്റാച്ച്മെന്റ് പാനൽ വഴി ആക്സസ് ചെയ്യാനാകുകയും ചെയ്യും."
|
||||
@@ -5625,16 +5235,6 @@ finish = "പൂർത്തിയാക്കുക"
|
||||
startTour = "ടൂർ ആരംഭിക്കുക"
|
||||
startTourDescription = "Stirling PDF 的 പ്രധാന സവിശേഷതകളുടെ മാർഗ്ഗനിർദ്ദേശ ടൂർ"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Reader, Automate, നിങ്ങളുടെ ഫയലുകൾ, എല്ലാ ടൂറുകളും എന്നിവയ്ക്ക് ഇടയിൽ മാറാൻ <strong>Quick Access</strong> റെയിലിൽ നിന്ന് ആരംഭിക്കുക."
|
||||
leftPanel = "ഇടത്തേയുള്ള <strong>Tools</strong> പാനൽ നിങ്ങൾക്ക് ചെയ്യാവുന്ന എല്ലാം പട്ടികപ്പെടുത്തുന്നു. വിഭാഗങ്ങൾ ബ്രൗസ് ചെയ്യുകയോ ഒരു ടൂൾ പെട്ടെന്ന് കണ്ടെത്താൻ തിരയുകയോ ചെയ്യുക."
|
||||
fileUpload = "<strong>Files</strong> ബട്ടൺ ഉപയോഗിച്ച് അപ്ലോഡ് ചെയ്യുക അല്ലെങ്കിൽ അടുത്തിടെ ഉപയോഗിച്ച PDF തിരഞ്ഞെടുക്കുക. വർക്സ്പേസ് കാണാൻ ഒരു സാമ്പിൾ ഞങ്ങൾ ലോഡ് ചെയ്യും."
|
||||
rightRail = "<strong>Right Rail</strong> ഫയലുകൾ തിരഞ്ഞെടുക്കാൻ, തീം അല്ലെങ്കിൽ ഭാഷ മാറ്റാൻ, ഫലങ്ങൾ ഡൗൺലോഡ് ചെയ്യാൻ ഉള്ള ക്വിക് ആക്ഷനുകൾ സൂക്ഷിക്കുന്നു."
|
||||
topBar = "മുകളിലെ ബാർ <strong>Viewer</strong>, <strong>Page Editor</strong>, <strong>Active Files</strong> എന്നിവയ്ക്ക് ഇടയിൽ മാറാൻ അനുവദിക്കുന്നു."
|
||||
pageEditorView = "പേജുകൾ പുനഃക്രമീകരിക്കാൻ, ഭ്രമിപ്പിക്കാൻ, അല്ലെങ്കിൽ ഇല്ലാതാക്കാൻ Page Editor-ിലേക്ക് മാറുക."
|
||||
activeFilesView = "തുറന്നിട്ടിരിക്കുന്ന എല്ലാം കാണാനും എന്തിൽ പ്രവർത്തിക്കണമെന്നത് തിരഞ്ഞെടുക്കാനും Active Files ഉപയോഗിക്കുക."
|
||||
wrapUp = "V2യിലെ പുതുമകൾ ഇത്രയാണ്. ഇത്, Tools ടൂർ, അല്ലെങ്കിൽ Admin ടൂർ വീണ്ടും കാണാൻ ഏതുസമയവും <strong>Tours</strong> മെനു തുറക്കുക."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Stirling PDFലേക്ക് സ്വാഗതം!"
|
||||
description = "പ്രധാന സവിശേഷതകളും തുടങ്ങുന്നത് എങ്ങനെയെന്നതും അറിയാൻ 1 മിനിട്ടിലെ ഒരു ദ്രുത ടൂർ വേണമോ?"
|
||||
@@ -5655,10 +5255,6 @@ download = "ഡൗൺലോഡ് →"
|
||||
showMeAround = "ടൂർ കാണിക്കുക"
|
||||
skipTheTour = "ടൂർ ഒഴിവാക്കുക"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "ടൂർ അവലോകനം"
|
||||
body = "Stirling PDF V2 ഡസൻകണക്കിന് ഉപകരണങ്ങളും പുതുക്കിയ ലേഔട്ടും ഉൾപ്പെടുത്തി എത്തുന്നു. എന്താണ് മാറിയതെന്നും നിങ്ങൾക്ക് ആവശ്യമായ സവിശേഷതകൾ എവിടെയാണെന്നും വേഗത്തിൽ കാണാം."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "ഇപ്പോൾ ഒഴിവാക്കുക"
|
||||
seePlans = "പ്ലാനുകൾ കാണുക →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "ഇപ്പോൾ അപ്ഗ്രേഡ് ചെയ്യു
|
||||
freeTitle = "സെർവർ ലൈസൻസ്"
|
||||
overLimitTitle = "സെർവർ ലൈസൻസ് ആവശ്യമാണ്"
|
||||
overLimitBody = "ഞങ്ങളുടെ ലൈസൻസിംഗ് ഓരോ സെർവർക്കും പരമാവധി <strong>{{freeTierLimit}}</strong> ഉപയോക്താക്കളെ സൗജന്യമായി അനുവദിക്കുന്നു. നിങ്ങള്ക്ക് <strong>{{overLimitUserCopy}}</strong> Stirling ഉപയോക്താക്കളുണ്ട്. തടസ്സമില്ലാതെ തുടരാൻ, Stirling Server പ്ലാനിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യുക - <strong>unlimited seats</strong>, PDF text editing, പൂർണ്ണ അഡ്മിൻ നിയന്ത്രണം, $99/server/mo."
|
||||
freeBody = "ഞങ്ങളുടെ <strong>Open-Core</strong> ലൈസൻസിംഗ് ഓരോ സെർവർക്കും പരമാവധി <strong>{{freeTierLimit}}</strong> ഉപയോക്താക്കളെ സൗജന്യമായി അനുവദിക്കുന്നു. തടസ്സമില്ലാതെ സ്കെയിൽ ചെയ്യാനും പുതിയ <strong>PDF text editing tool</strong> ന് മുൻകാല ആക്സസ് നേടാനും, Stirling Server പ്ലാൻ ഞങ്ങൾ ശുപാർശ ചെയ്യുന്നു - പൂർണ്ണ എഡിറ്റിംഗും <strong>unlimited seats</strong> ഉം $99/server/mo."
|
||||
freeBody = "ഞങ്ങളുടെ <strong>Open-Core</strong> ലൈസൻസിംഗ് ഓരോ സെർവർക്കും പരമാവധി <strong>{{freeTierLimit}}</strong> ഉപയോക്താക്കളെ സൗജന്യമായി അനുവദിക്കുന്നു. തടസ്സമില്ലാതെ സ്കെയിൽ ചെയ്യാൻ, ഞങ്ങൾ Stirling Server പ്ലാൻ ശുപാർശ ചെയ്യുന്നു - <strong>പരിമിതിയില്ലാത്ത സീറ്റുകൾ</strong>യും <strong>SSO പിന്തുണ</strong>യും for $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "ഡൗൺലോഡ്"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "വിൽപ്പന ടീമിനെ ബന്ധപ്പ
|
||||
contactToUpgrade = "നിങ്ങളുടെ പ്ലാൻ അപ്ഗ്രേഡ് ചെയ്യുകയോ ഇഷ്ടാനുസൃതമാക്കുകയോ ചെയ്യാൻ ഞങ്ങളെ ബന്ധപ്പെടുക"
|
||||
maxUsers = "പരമാവധി ഉപയോക്താക്കൾ"
|
||||
upTo = "വരെ"
|
||||
getLicense = "സർവർ ലൈസൻസ് നേടുക"
|
||||
upgradeToEnterprise = "Enterprise-ലേക്ക് അപ്ഗ്രേഡ് ചെയ്യുക"
|
||||
selectPeriod = "ബില്ലിംഗ് കാലയളവ് തിരഞ്ഞെടുക്കുക"
|
||||
monthlyBilling = "പ്രതിമാസ ബില്ലിംഗ്"
|
||||
yearlyBilling = "പ്രതിവർഷ ബില്ലിംഗ്"
|
||||
checkoutOpened = "ചെക്കൗട്ട് തുറന്നു"
|
||||
checkoutInstructions = "Stripe ടാബിൽ നിങ്ങളുടെ വാങ്ങൽ പൂർത്തിയാക്കുക. പെയ്മെന്റിന് ശേഷം, ലൈസൻസ് സജീവമാക്കാൻ ഇവിടെ തിരിച്ചെത്തി പേജ് റിഫ്രെഷ് ചെയ്യുക. നിങ്ങള്ക്ക് ലൈസൻസ് കീ അടങ്ങുന്ന ഒരു ഇമെയിലും ലഭിക്കും."
|
||||
activateLicense = "നിങ്ങളുടെ ലൈസൻസ് സജീവമാക്കുക"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "പുതിയ ടാബിൽ ചെക്കൗട്ട് തുറന്നു"
|
||||
instructions = "Stripe ടാബിൽ നിങ്ങളുടെ വാങ്ങൽ പൂർത്തിയാക്കുക. പെയ്മെന്റ് പൂർത്തിയായാൽ, നിങ്ങളുടെ ലൈസൻസ് കീ അടങ്ങുന്ന ഒരു ഇമെയിൽ നിങ്ങൾക്ക് ലഭിക്കും."
|
||||
enterKey = "നിങ്ങളുടെ പ്ലാൻ സജീവമാക്കാൻ താഴെ നിങ്ങളുടെ ലൈസൻസ് കീ നൽകുക:"
|
||||
keyDescription = "ഇമെയിലിൽ നിന്ന് ലൈസൻസ് കീ പേസ്റ്റ് ചെയ്യുക"
|
||||
activate = "ലൈസൻസ് സജീവമാക്കുക"
|
||||
doLater = "ഇത് പിന്നീട് ചെയ്യും"
|
||||
success = "ലൈസൻസ് സജീവമായി!"
|
||||
successMessage = "നിങ്ങളുടെ ലൈസൻസ് വിജയകരമായി സജീവപ്പെടുത്തി. നിങ്ങൾക്ക് ഇപ്പോൾ ഈ ജാലകം അടയ്ക്കാം."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "ഇമെയിൽ സ്ഥിരീകരണം ആവശ്യമാണ്"
|
||||
message = "Stripe ബില്ലിംഗ് പോർട്ടലിൽ നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കണം. ലോഗിൻ ലിങ്കിനായി ഇമെയിൽ പരിശോധിക്കുക."
|
||||
|
||||
[plan.period]
|
||||
month = "മാസം"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "ഓഡിറ്റ് സിസ്റ്റം ലഭ്യമ
|
||||
notAvailableMessage = "ഓഡിറ്റ് സിസ്റ്റം കോൺഫിഗർ ചെയ്തിട്ടില്ല അല്ലെങ്കിൽ ലഭ്യമല്ല."
|
||||
disabled = "ഓഡിറ്റ് ലോഗിംഗ് പ്രവർത്തനരഹിതമാണ്"
|
||||
disabledMessage = "സിസ്റ്റം ഇവന്റുകൾ ട്രാക്ക് ചെയ്യാൻ നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ക്രമീകരണത്തിൽ ഓഡിറ്റ് ലോഗിംഗ് പ്രവർത്തനക്ഷമമാക്കുക."
|
||||
enterpriseRequired = "എന്റർപ്രൈസ് ലൈസൻസ് ആവശ്യമാണ്"
|
||||
enterpriseRequiredMessage = "ഓഡിറ്റ് ലോഗിംഗ് സിസ്റ്റം ഒരു എന്റർപ്രൈസ് സവിശേഷതയാണ്. ഓഡിറ്റ് ലോഗുകളും അനലിറ്റിക്സും ആക്സസ് ചെയ്യാൻ ദയവായി എന്റർപ്രൈസ് ലൈസൻസിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യുക."
|
||||
|
||||
[audit.error]
|
||||
title = "ഓഡിറ്റ് സിസ്റ്റം ലോഡ് ചെയ്യുന്നതിൽ പിശക്"
|
||||
@@ -6370,7 +5942,6 @@ description = "നിങ്ങളുടെ സെൽഫ്-ഹോസ്റ്റ
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "ദയവായി ഒരു സെർവർ URL നൽകുക"
|
||||
invalidUrl = "അസാധുവായ URL ഫോർമാറ്റ്. https://your-server.com പോലുള്ള സാധുവായ URL നൽകുക"
|
||||
unreachable = "സെർവറുമായി ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല"
|
||||
testFailed = "കണക്ഷൻ ടെസ്റ്റ് പരാജയപ്പെട്ടു"
|
||||
configFetch = "സർവർ കോൺഫിഗറേഷൻ ലഭ്യമാക്കൽ പരാജയപ്പെട്ടു. ദയവായി URL പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "കണക്റ്റ് ചെയ്യുന്നു:"
|
||||
submit = "ലോഗിൻ"
|
||||
signInWith = "ഇതുപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക"
|
||||
oauthPending = "ഓതന്റിക്കേഷനായി ബ്രൗസർ തുറക്കുന്നു..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "അല്ലെങ്കിൽ ഇമെയിലോടെ തുടരുക"
|
||||
serverRequirement = "ശ്രദ്ധിക്കുക: സെർവറിൽ ലോഗിൻ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കണം."
|
||||
showInstructions = "എങ്ങനെ പ്രവർത്തനക്ഷമമാക്കാം?"
|
||||
@@ -6448,15 +6018,13 @@ singleLine = "സിംഗിൾ ലൈൻ"
|
||||
[pdfTextEditor.badges]
|
||||
unsaved = "എഡിറ്റ് ചെയ്തു"
|
||||
modified = "എഡിറ്റ് ചെയ്തു"
|
||||
earlyAccess = "Early Access"
|
||||
earlyAccess = "എർലി ആക്സസ്"
|
||||
|
||||
[pdfTextEditor.actions]
|
||||
reset = "മാറ്റങ്ങൾ റീസെറ്റ് ചെയ്യുക"
|
||||
downloadJson = "JSON ഡൗൺലോഡ് ചെയ്യുക"
|
||||
generatePdf = "PDF സൃഷ്ടിക്കുക"
|
||||
saveChanges = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
applyChanges = "മാറ്റങ്ങൾ പ്രയോഗിക്കുക"
|
||||
downloadCopy = "കോപ്പി ഡൗൺലോഡ് ചെയ്യുക"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ബോക്സിൽ ഒതുങ്ങാൻ ടെക്സ്റ്റ് സ്വയം സ്കെയിൽ ചെയ്യുക"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "ടിപ്പ്: ടെക്സ്റ്റ് ബോ
|
||||
title = "തിരുത്തിയ ടെക്സ്റ്റ് ഒരു സിംഗിൾ PDF ഘടകത്തിൽ ലോക്ക് ചെയ്യുക"
|
||||
description = "ഇത് ഓണാക്കിയാൽ, ഓവർലാപ്പിംഗ് ഗ്ലിഫ്സ് അല്ലെങ്കിൽ മിശ്ര ഫോണ്ടുകൾ ഒഴിവാക്കാൻ തിരുത്തിയ ഓരോ ടെക്സ്റ്റ് ബോക്സും ഒറ്റ PDF ടെക്സ്റ്റ് ഘടകമായി എക്സ്പോർട്ട് ചെയ്യും."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "അഡ്വാൻസ്ഡ് സജ്ജീകരണങ്ങൾ"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "പ്രിവ്യൂ പരിമിതങ്ങൾ"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "ടെക്സ്റ്റും ചിത്രവും കേന്ദ്രീകരിക്കുന്നത്"
|
||||
text = "ഈ വർക്സ്പേസ് ടെക്സ്റ്റ് എഡിറ്റിംഗിലും എംബെഡുചെയ്ത ചിത്രങ്ങളുടെ സ്ഥാനമാറ്റത്തിലും ശ്രദ്ധ കേന്ദ്രീകരിക്കുന്നു. സങ്കീർണ്ണമായ പേജ് ആർട്ട്വർക്ക്, ഫോം വിഡ്ജറ്റുകൾ, ലെയേർഡ് ഗ്രാഫിക്സ് എന്നിവ എക്സ്പോർട്ടിനായി നിലനിർത്തും, പക്ഷേ ഇവിടെ പൂർണ്ണമായി എഡിറ്റ് ചെയ്യാനാകില്ല."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "പ്രിവ്യൂ വ്യത്യാസങ്ങൾ"
|
||||
text = "ചില ദൃശ്യങ്ങൾ (ടേബിൾ ബോർഡറുകൾ, ആകൃതികൾ, അല്ലെങ്കിൽ അനോട്ടേഷൻ രൂപങ്ങൾ പോലുള്ളവ) പ്രിവ്യൂവിൽ കൃത്യമായി പ്രദർശിപ്പിക്കണമെന്നില്ല. എക്സ്പോർട്ട് ചെയ്ത PDF ഓരിജിനൽ ഡ്രോയിംഗ് കമാൻഡുകൾ കഴിയുന്നിടത്തോളം നിലനിർത്തും."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "ആൽഫാ വ്യൂവർ"
|
||||
text = "ഈ ആൽഫാ വ്യൂവർ ഇനിയും വികസനത്തിലാണു—ചില ഫോണ്ടുകൾ, നിറങ്ങൾ, പാരദർശ്യത ഇഫക്ടുകൾ, ലേഔട്ട് വിശദാംശങ്ങൾ എന്നിവ നേരിയ മാറ്റങ്ങൾ കാണിക്കാം. പങ്കിടുന്നതിന് മുമ്പ് സൃഷ്ടിച്ച PDF വീണ്ടും പരിശോധിക്കുക."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "തിരഞ്ഞെടുത്ത ബോക്സുകൾ ലയിപ്പിക്കുക"
|
||||
merge = "ലയിപ്പിക്കുക"
|
||||
@@ -6614,58 +6164,3 @@ title = "ടെക്സ്റ്റ് ചേർക്കൽ ഫലങ്ങൾ
|
||||
|
||||
[addText.error]
|
||||
failed = "PDF-യിൽ ടെക്സ്റ്റ് ചേർക്കുമ്പോൾ പിശക് സംഭവിച്ചു."
|
||||
|
||||
[mobileUpload]
|
||||
title = "മൊബൈലിൽ നിന്ന് അപ്ലോഡ് ചെയ്യുക"
|
||||
description = "സ്കാൻ ചെയ്ത് ചിത്രങ്ങൾ അപ്ലോഡ് ചെയ്യുക. ചിത്രങ്ങൾ സ്വയമേവ PDF-യായി മാറും."
|
||||
descriptionNoConvert = "നിങ്ങളുടെ മൊബൈൽ ഉപകരണത്തിൽ നിന്ന് ചിത്രങ്ങൾ അപ്ലോഡ് ചെയ്യാൻ സ്കാൻ ചെയ്യുക."
|
||||
error = "കണക്ഷൻ പിശക്"
|
||||
pollingError = "ഫയലുകൾ പരിശോധിക്കുമ്പോൾ പിശക്"
|
||||
sessionId = "സെഷൻ ID"
|
||||
sessionCreateError = "സെഷൻ സൃഷ്ടിക്കാൻ പരാജയപ്പെട്ടു"
|
||||
expiryWarning = "സെഷൻ ഉടൻ കാലഹരണം പ്രാപിക്കും"
|
||||
expiryWarningMessage = "ഈ QR കോഡ് {{seconds}} സെക്കൻഡിൽ കാലഹരണം പ്രാപിക്കും. പുതിയ കോഡ് സ്വയമേവ സൃഷ്ടിക്കും."
|
||||
filesReceived = "{{count}} ഫയൽ(കൾ) ലഭിച്ചു"
|
||||
connected = "മൊബൈൽ ഉപകരണം കണക്റ്റുചെയ്തു"
|
||||
instructions = "നിങ്ങളുടെ ഫോണിന്റെ ക്യാമറ ഉപയോഗിച്ച് സ്കാൻ ചെയ്യുക. ചിത്രങ്ങൾ സ്വയം PDF-യായി മാറും."
|
||||
instructionsNoConvert = "ഫയലുകൾ അപ്ലോഡ് ചെയ്യാൻ ഫോണിന്റെ ക്യാമറ ഉപയോഗിച്ച് സ്കാൻ ചെയ്യുക."
|
||||
|
||||
[mobileScanner]
|
||||
title = "മൊബൈൽ സ്കാനർ"
|
||||
noSession = "അസാധുവായ സെഷൻ"
|
||||
noSessionMessage = "ഈ പേജ് ആക്സസ് ചെയ്യാൻ സാധുവായ QR കോഡ് സ്കാൻ ചെയ്യുക."
|
||||
validating = "സെഷൻ ശരിവെയ്ക്കുന്നു..."
|
||||
sessionInvalid = "സെഷൻ പിശക്"
|
||||
sessionExpired = "ഈ സെഷന്റെ കാലാവധി കഴിഞ്ഞു. ദയവായി റിഫ്രെഷ് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക."
|
||||
sessionNotFound = "സെഷൻ കണ്ടെത്തിയില്ല. ദയവായി റിഫ്രെഷ് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക."
|
||||
sessionValidationError = "സെഷൻ സ്ഥിരീകരിക്കാൻ കഴിഞ്ഞില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക."
|
||||
uploadSuccess = "അപ്ലോഡ് വിജയകരം!"
|
||||
uploadSuccessMessage = "നിങ്ങളുടെ ചിത്രങ്ങൾ മാറ്റി."
|
||||
httpsRequired = "ക്യാമറ ആക്സസിന് HTTPS അല്ലെങ്കിൽ localhost ആവശ്യമാണ്. ദയവായി HTTPS ഉപയോഗിക്കുകയോ localhost വഴി പ്രവേശിക്കുകയോ ചെയ്യുക."
|
||||
uploadFailed = "അപ്ലോഡ് പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുക."
|
||||
uploading = "അപ്ലോഡ് ചെയ്യുന്നു..."
|
||||
connected = "കണക്റ്റുചെയ്തു"
|
||||
connecting = "കണക്റ്റുചെയ്യുന്നു..."
|
||||
chooseMethod = "അപ്ലോഡ് രീതി തിരഞ്ഞെടുക്കുക"
|
||||
chooseMethodDescription = "ഡോക്യുമെന്റുകൾ എങ്ങനെ സ്കാൻ ചെയ്ത് അപ്ലോഡ് ചെയ്യണമെന്ന് തിരഞ്ഞെടുക്കുക"
|
||||
camera = "ക്യാമറ"
|
||||
cameraDescription = "സ്വയമേവ എഡ്ജ് കണ്ടെത്തലോടുകൂടി നിങ്ങളുടെ ഉപകരണത്തിന്റെ ക്യാമറ ഉപയോഗിച്ച് ഡോക്യുമെന്റുകൾ സ്കാൻ ചെയ്യുക"
|
||||
fileUpload = "ഫയൽ അപ്ലോഡ്"
|
||||
fileDescription = "നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് നിലവിലുള്ള ഫോട്ടോകൾ അല്ലെങ്കിൽ ഡോക്യുമെന്റുകൾ അപ്ലോഡ് ചെയ്യുക"
|
||||
cameraAccessDenied = "ക്യാമറ ആക്സസ് നിരസിച്ചു. ദയവായി ക്യാമറ ആക്സസ് പ്രവർത്തനക്ഷമമാക്കുക."
|
||||
back = "മടങ്ങുക"
|
||||
settings = "സജ്ജീകരണങ്ങൾ"
|
||||
edgeDetection = "എഡ്ജ് കണ്ടെത്തൽ"
|
||||
flashlight = "ഫ്ലാഷ്ലൈറ്റ്"
|
||||
flash = "ഫ്ലാഷ്"
|
||||
processing = "പ്രോസസ്സിംഗ്..."
|
||||
capture = "ഫോട്ടോ പകർത്തുക"
|
||||
selectFilesPrompt = "അപ്ലോഡ് ചെയ്യാൻ ഫയലുകൾ തിരഞ്ഞെടുക്കുക"
|
||||
selectImage = "ചിത്രം തിരഞ്ഞെടുക്കുക"
|
||||
preview = "പ്രിവ്യൂ"
|
||||
retake = "വീണ്ടും എടുക്കുക"
|
||||
addToBatch = "ബാച്ചിലേക്ക് ചേർക്കുക"
|
||||
upload = "അപ്ലോഡ്"
|
||||
batchImages = "ബാച്ച്"
|
||||
clearBatch = "ക്ലിയർ"
|
||||
uploadAll = "എല്ലാം അപ്ലോഡ് ചെയ്യുക"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "U heeft niet-opgeslagen wijzigingen in uw PDF."
|
||||
pendingRedactionsTitle = "Niet-toegepaste anonimiseringen"
|
||||
pendingRedactions = "U hebt niet-toegepaste anonimiseringen die verloren gaan."
|
||||
areYouSure = "Weet u zeker dat u wilt vertrekken?"
|
||||
unsavedChangesTitle = "Niet-opgeslagen wijzigingen"
|
||||
keepWorking = "Doorgaan met werken"
|
||||
discardChanges = "Verwerpen en verlaten"
|
||||
discardRedactions = "Verwerpen & verlaten"
|
||||
applyAndContinue = "Opslaan en verlaten"
|
||||
exportAndContinue = "Exporteren en doorgaan"
|
||||
cancel = "Annuleren"
|
||||
@@ -367,7 +364,6 @@ advanced = "Geavanceerd"
|
||||
title = "Beveiliging & Authenticatie"
|
||||
security = "Beveiliging"
|
||||
connections = "Verbindingen"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licenties & Analyse"
|
||||
@@ -442,13 +438,6 @@ currentVersion = "Huidige versie"
|
||||
latestVersion = "Laatste versie"
|
||||
checkForUpdates = "Op updates controleren"
|
||||
viewDetails = "Details bekijken"
|
||||
serverNeedsUpdate = "Server moet door de beheerder worden bijgewerkt"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Versie-informatie"
|
||||
description = "Details van desktop- en serverversie"
|
||||
desktop = "Desktopversie"
|
||||
server = "Serverversie"
|
||||
|
||||
[settings.security]
|
||||
title = "Beveiliging"
|
||||
@@ -539,8 +528,6 @@ accountSettings = "Account instellingen"
|
||||
adminSettings = "Beheerdersinstellingen - Gebruikers bekijken en toevoegen"
|
||||
userControlSettings = "Gebruikerscontrole instellingen"
|
||||
changeUsername = "Wijzig gebruikersnaam"
|
||||
changeUsernameDescription = "Werk uw gebruikersnaam bij. U wordt afgemeld na het bijwerken."
|
||||
newUsernamePlaceholder = "Voer uw nieuwe gebruikersnaam in"
|
||||
newUsername = "Nieuwe gebruikersnaam"
|
||||
password = "Bevestigingswachtwoord"
|
||||
oldPassword = "Oud wachtwoord"
|
||||
@@ -749,11 +736,6 @@ tags = "handtekening,ondertekenen"
|
||||
title = "Ondertekenen"
|
||||
desc = "Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annoteren,markeren,tekenen"
|
||||
title = "Annoteren"
|
||||
desc = "Markeer, teken en voeg notities en vormen toe in de viewer"
|
||||
|
||||
[home.flatten]
|
||||
tags = "vereenvoudigen,verwijderen,interactief"
|
||||
title = "Afvlakken"
|
||||
@@ -976,7 +958,6 @@ desc = "Voeg overal in uw PDF aangepaste tekst toe"
|
||||
addFiles = "Bestanden toevoegen"
|
||||
uploadFromComputer = "Uploaden vanaf computer"
|
||||
openFromComputer = "Openen vanaf computer"
|
||||
mobileUpload = "Uploaden vanaf mobiel"
|
||||
|
||||
[viewPdf]
|
||||
tags = "bekijken,lezen,annoteren,tekst,afbeelding"
|
||||
@@ -1292,33 +1273,6 @@ cbzOptions = "CBZ-naar-PDF-opties"
|
||||
optimizeForEbook = "PDF optimaliseren voor e-readers (gebruikt Ghostscript)"
|
||||
cbzOutputOptions = "PDF-naar-CBZ-opties"
|
||||
cbzDpi = "DPI voor weergave van afbeeldingen"
|
||||
cbrOptions = "CBR-opties"
|
||||
cbrOutputOptions = "Opties voor PDF naar CBR"
|
||||
cbrDpi = "DPI voor afbeeldingsrendering"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opties voor eBook naar PDF"
|
||||
ebookOptionsDesc = "Opties voor het converteren van eBooks naar PDF"
|
||||
embedAllFonts = "Alle lettertypen insluiten"
|
||||
embedAllFontsDesc = "Alle lettertypen uit het eBook in de gegenereerde PDF insluiten"
|
||||
includeTableOfContents = "Inhoudsopgave opnemen"
|
||||
includeTableOfContentsDesc = "Een gegenereerde inhoudsopgave toevoegen aan de resulterende PDF"
|
||||
includePageNumbers = "Paginanummers opnemen"
|
||||
includePageNumbersDesc = "Paginanummers toevoegen aan de gegenereerde PDF"
|
||||
optimizeForEbookPdf = "Optimaliseren voor e-readers"
|
||||
optimizeForEbookPdfDesc = "De PDF optimaliseren voor eBook-lezen (kleinere bestandsgrootte, betere weergave op eInk-apparaten)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opties voor PDF naar eBook"
|
||||
epubOptionsDesc = "Opties voor het converteren van PDF naar EPUB/AZW3"
|
||||
detectChapters = "Hoofdstukken detecteren"
|
||||
detectChaptersDesc = "Koppen die op hoofdstukken lijken detecteren en EPUB-paginabreuken invoegen"
|
||||
targetDevice = "Doelapparaat"
|
||||
targetDeviceDesc = "Kies een uitvoerprofiel dat is geoptimaliseerd voor het leesapparaat"
|
||||
outputFormat = "Uitvoerformaat"
|
||||
outputFormatDesc = "Kies het uitvoerformaat voor het eBook"
|
||||
tabletPhone = "Tablet/Telefoon (met afbeeldingen)"
|
||||
kindleEink = "Kindle e-Ink (tekst geoptimaliseerd)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversie,img,jpg,foto"
|
||||
@@ -1435,11 +1389,6 @@ header = "Add attachments"
|
||||
add = "Bijlage toevoegen"
|
||||
remove = "Bijlage verwijderen"
|
||||
embed = "Bijlage insluiten"
|
||||
convertToPdfA3b = "Converteren naar PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Maakt een archief-PDF met ingesloten bijlagen"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b is een archiefformaat dat langdurige bewaring waarborgt. Het staat het insluiten van willekeurige bestandsformaten als bijlagen toe. Converteren vereist Ghostscript en kan langer duren voor grote bestanden."
|
||||
convertToPdfA3bTooltipHeader = "Over PDF/A-3b-conversie"
|
||||
convertToPdfA3bTooltipTitle = "Wat het doet"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2334,6 @@ saved = "Opgeslagen"
|
||||
label = "Handtekeningafbeelding uploaden"
|
||||
placeholder = "Afbeeldingsbestand selecteren"
|
||||
hint = "Upload een PNG- of JPG-afbeelding van uw handtekening"
|
||||
removeBackground = "Witte achtergrond verwijderen (transparant maken)"
|
||||
processing = "Afbeelding verwerken..."
|
||||
backgroundRemovalFailedTitle = "Achtergrond verwijderen mislukt"
|
||||
backgroundRemovalFailedMessage = "Kan de achtergrond niet uit de afbeelding verwijderen. De originele afbeelding wordt gebruikt."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Hoe een handtekening toevoegen"
|
||||
@@ -2434,11 +2379,6 @@ note = "Afvlakken verwijdert interactieve elementen uit de PDF, waardoor deze ni
|
||||
label = "Alleen formulieren afvlakken"
|
||||
desc = "Alleen formuliervelden afvlakken; andere interactieve elementen blijven intact"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Render-DPI (optioneel, aanbevolen 150 DPI)"
|
||||
help = "Laat leeg om de systeemstandaard te gebruiken. Hogere DPI verscherpt de uitvoer maar verhoogt de verwerkingstijd en bestandsgrootte."
|
||||
placeholder = "bijv. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultaten afvlakken"
|
||||
|
||||
@@ -3013,7 +2953,6 @@ header = "PDF bijsnijden"
|
||||
submit = "Indienen"
|
||||
noFileSelected = "Selecteer een PDF-bestand om te beginnen met bijsnijden"
|
||||
reset = "Resetten naar volledige PDF"
|
||||
autoCrop = "Witruimte automatisch bijsnijden"
|
||||
|
||||
[crop.preview]
|
||||
title = "Selectie bijsnijgebied"
|
||||
@@ -3244,7 +3183,6 @@ title = "Methode voor zwartlakken"
|
||||
mode = "Modus"
|
||||
automatic = "Automatisch"
|
||||
automaticDesc = "Tekst zwartlakken op basis van zoektermen"
|
||||
automaticDisabledTooltip = "Selecteer bestanden in de bestandsbeheerder om meerdere bestanden tegelijk te anonimiseren"
|
||||
manual = "Handmatig"
|
||||
manualDesc = "Klik en sleep om specifieke gebieden te zwartlakken"
|
||||
manualComingSoon = "Handmatig zwartlakken komt binnenkort"
|
||||
@@ -3315,35 +3253,8 @@ text = "Match alleen complete woorden, geen gedeeltelijke overeenkomsten. 'John'
|
||||
title = "Converteren naar PDF-afbeelding"
|
||||
text = "Converteert de PDF na zwartlakken naar een op afbeeldingen gebaseerde PDF. Dit zorgt ervoor dat tekst achter zwartlakvakken volledig wordt verwijderd en onherstelbaar is."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Handmatige anonimiseringsbesturingselementen"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Tekst markeren"
|
||||
text = "Selecteer tekst direct op de PDF om deze te markeren voor anonimisering. Klik en sleep om specifieke tekst te markeren die u wilt anonimiseren."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Gebied markeren"
|
||||
text = "Teken rechthoekige gebieden op de PDF om regio's te markeren voor anonimisering. Handig voor het anonimiseren van afbeeldingen, handtekeningen of onregelmatige vormen."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Anonimiseringen toepassen"
|
||||
text = "Klik na het markeren op 'Toepassen' om alle gemarkeerde gebieden permanent te anonimiseren. De teller in behandeling toont hoeveel anonimiseringen klaar zijn om toegepast te worden."
|
||||
bullet1 = "Markeer zoveel gebieden als nodig voordat u toepast"
|
||||
bullet2 = "Alle openstaande anonimiseringen worden in één keer toegepast"
|
||||
bullet3 = "Anonimiseringen kunnen na toepassing niet ongedaan worden gemaakt"
|
||||
|
||||
[redact.manual]
|
||||
title = "Anonimiseringshulpmiddelen"
|
||||
instructions = "Selecteer tekst of teken gebieden op de PDF om inhoud te markeren voor anonimisering."
|
||||
markText = "Tekst markeren"
|
||||
markArea = "Gebied markeren"
|
||||
pendingLabel = "In behandeling:"
|
||||
applyWarning = "⚠️ Permanente toepassing, kan niet ongedaan worden gemaakt en de onderliggende gegevens worden verwijderd"
|
||||
apply = "Toepassen"
|
||||
noMarks = "Geen anonimiseringsmarkeringen. Gebruik de bovenstaande tools om inhoud te markeren voor anonimisering."
|
||||
header = "Handmatig zwartlakken"
|
||||
controlsTitle = "Handmatige anonimiseringsbesturingselementen"
|
||||
textBasedRedaction = "Tekstgebaseerd zwartlakken"
|
||||
pageBasedRedaction = "Pagina-gebaseerd zwartlakken"
|
||||
convertPDFToImageLabel = "PDF converteren naar PDF-afbeelding (gebruikt om tekst achter het vak te verwijderen)"
|
||||
@@ -3459,19 +3370,6 @@ placeholder = "Voer het aantal horizontale secties in"
|
||||
label = "Verticale secties"
|
||||
placeholder = "Voer het aantal verticale secties in"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Splitsmodus"
|
||||
description = "Kies hoe de pagina's worden gesplitst"
|
||||
splitAll = "Alle pagina's splitsen"
|
||||
splitAllExceptFirst = "Alles behalve de eerste splitsen"
|
||||
splitAllExceptLast = "Alles behalve de laatste splitsen"
|
||||
splitAllExceptFirstAndLast = "Alles behalve de eerste en laatste splitsen"
|
||||
custom = "Aangepaste pagina's"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Aangepaste paginanummers"
|
||||
placeholder = "bijv. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen"
|
||||
header = "Stempel PDF"
|
||||
@@ -3833,9 +3731,6 @@ filesize = "Bestandsgrootte"
|
||||
[compress.grayscale]
|
||||
label = "Grijstinten toepassen voor compressie"
|
||||
|
||||
[compress.linearize]
|
||||
label = "PDF lineariseren voor snelle webweergave"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Afbeeldingen omzetten in lijntekening"
|
||||
description = "Gebruikt ImageMagick om pagina's te reduceren tot hoogcontrast zwart-wit voor maximale verkleining van de bestandsgrootte."
|
||||
@@ -3879,11 +3774,6 @@ failed = "Er is een fout opgetreden bij het comprimeren van de PDF."
|
||||
_value = "Compressie-instellingen"
|
||||
1 = "1-3 PDF-compressie,</br> 4-6 lichte afbeeldingscompressie,</br> 7-9 intense afbeeldingscompressie Zal de beeldkwaliteit sterk verminderen"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Lagere waarden behouden kwaliteit maar resulteren in grotere bestanden"
|
||||
range4to6 = "Gemiddelde compressie met matige kwaliteitsvermindering"
|
||||
range7to9 = "Hogere waarden verkleinen de bestandsgrootte aanzienlijk maar kunnen de afbeeldingsscherpte verminderen"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Dit bestand is met een wachtwoord beveiligd. Voer het wachtwoord in:"
|
||||
cancelled = "Bewerking geannuleerd voor PDF: {0}"
|
||||
@@ -4123,97 +4013,22 @@ deleteSelected = "Geselecteerde pagina's verwijderen"
|
||||
closePdf = "PDF sluiten"
|
||||
exportAll = "PDF exporteren"
|
||||
downloadSelected = "Geselecteerde bestanden downloaden"
|
||||
annotations = "Annotaties"
|
||||
exportSelected = "Geselecteerde pagina's exporteren"
|
||||
saveChanges = "Wijzigingen opslaan"
|
||||
downloadAll = "Alles downloaden"
|
||||
saveAll = "Alles opslaan"
|
||||
toggleTheme = "Thema wisselen"
|
||||
toggleBookmarks = "Bladwijzers tonen/verbergen"
|
||||
language = "Taal"
|
||||
toggleAnnotations = "Annotaties tonen/verbergen"
|
||||
search = "PDF doorzoeken"
|
||||
panMode = "Pan-modus"
|
||||
applyRedactionsFirst = "Eerst anonimiseringen toepassen"
|
||||
rotateLeft = "Linksom draaien"
|
||||
rotateRight = "Rechtsom draaien"
|
||||
toggleSidebar = "Zijbalk tonen/verbergen"
|
||||
toggleBookmarks = "Bladwijzers tonen/verbergen"
|
||||
exportSelected = "Geselecteerde pagina's exporteren"
|
||||
toggleAnnotations = "Annotaties tonen/verbergen"
|
||||
annotationMode = "Annotatiemodus schakelen"
|
||||
print = "PDF afdrukken"
|
||||
draw = "Tekenen"
|
||||
redact = "Anonimiseren"
|
||||
exitRedaction = "Anonimiseringsmodus verlaten"
|
||||
save = "Opslaan"
|
||||
downloadAll = "Alles downloaden"
|
||||
saveAll = "Alles opslaan"
|
||||
|
||||
[textAlign]
|
||||
left = "Links"
|
||||
center = "Midden"
|
||||
right = "Rechts"
|
||||
|
||||
[annotation]
|
||||
title = "Annoteren"
|
||||
desc = "Gebruik markeren, pen, tekst en notities. Wijzigingen blijven actief—afvlakken is niet nodig."
|
||||
highlight = "Markeren"
|
||||
pen = "Pen"
|
||||
text = "Tekstvak"
|
||||
note = "Notitie"
|
||||
rectangle = "Rechthoek"
|
||||
ellipse = "Ellips"
|
||||
select = "Selecteren"
|
||||
exit = "Annotatiemodus verlaten"
|
||||
strokeWidth = "Breedte"
|
||||
opacity = "Dekking"
|
||||
strokeOpacity = "Lijndekking"
|
||||
fillOpacity = "Vuldekking"
|
||||
fontSize = "Lettergrootte"
|
||||
chooseColor = "Kleur kiezen"
|
||||
color = "Kleur"
|
||||
strokeColor = "Lijnkleur"
|
||||
fillColor = "Vulkleur"
|
||||
underline = "Onderstrepen"
|
||||
strikeout = "Doorhalen"
|
||||
squiggly = "Gekruld"
|
||||
inkHighlighter = "Vrije markeerstift"
|
||||
freehandHighlighter = "Vrije markeerstift"
|
||||
square = "Vierkant"
|
||||
circle = "Cirkel"
|
||||
polygon = "Veelhoek"
|
||||
line = "Lijn"
|
||||
stamp = "Afbeelding toevoegen"
|
||||
textMarkup = "Tekstmarkering"
|
||||
drawing = "Tekening"
|
||||
shapes = "Vormen"
|
||||
notesStamps = "Notities en stempels"
|
||||
settings = "Instellingen"
|
||||
borderOn = "Rand: Aan"
|
||||
borderOff = "Rand: Uit"
|
||||
editInk = "Pen bewerken"
|
||||
editLine = "Lijn bewerken"
|
||||
editNote = "Notitie bewerken"
|
||||
editText = "Tekstvak bewerken"
|
||||
editTextMarkup = "Tekstmarkering bewerken"
|
||||
editSelected = "Annotatie bewerken"
|
||||
editSquare = "Vierkant bewerken"
|
||||
editCircle = "Cirkel bewerken"
|
||||
editPolygon = "Veelhoek bewerken"
|
||||
unsupportedType = "Dit annotatietype wordt niet volledig ondersteund voor bewerken."
|
||||
textAlignment = "Tekstuitlijning"
|
||||
noteIcon = "Notitiepictogram"
|
||||
imagePreview = "Voorbeeld"
|
||||
contents = "Tekst"
|
||||
backgroundColor = "Achtergrondkleur"
|
||||
clearBackground = "Achtergrond verwijderen"
|
||||
noBackground = "Geen achtergrond"
|
||||
stampSettings = "Stempelinstellingen"
|
||||
savingCopy = "Download voorbereiden..."
|
||||
saveFailed = "Kan kopie niet opslaan"
|
||||
saveReady = "Download gereed"
|
||||
selectAndMove = "Selecteren en bewerken"
|
||||
editSelectDescription = "Klik op een bestaande annotatie om de kleur, dekking, tekst of grootte te bewerken."
|
||||
editStampHint = "Om de afbeelding te wijzigen, verwijder deze stempel en voeg een nieuwe toe."
|
||||
editSwitchToSelect = "Schakel over naar Selecteren en bewerken om deze annotatie te bewerken."
|
||||
undo = "Ongedaan maken"
|
||||
redo = "Opnieuw"
|
||||
applyChanges = "Wijzigingen toepassen"
|
||||
saveChanges = "Wijzigingen opslaan"
|
||||
|
||||
[search]
|
||||
@@ -4297,8 +4112,6 @@ fetchError = "Instellingen laden mislukt"
|
||||
saveError = "Instellingen opslaan mislukt"
|
||||
saved = "Instellingen succesvol opgeslagen"
|
||||
saveSuccess = "Instellingen succesvol opgeslagen"
|
||||
success = "Instellingen succesvol opgeslagen"
|
||||
error = "Opslaan van instellingen mislukt"
|
||||
save = "Wijzigingen opslaan"
|
||||
discard = "Verwerpen"
|
||||
restartRequired = "Herstart vereist"
|
||||
@@ -4422,13 +4235,6 @@ description = "Pad naar WeasyPrint-uitvoerbaar bestand voor HTML-naar-PDF-conver
|
||||
label = "Unoconvert-uitvoerbaar bestand"
|
||||
description = "Pad naar LibreOffice unoconvert voor documentconversies (laat leeg voor standaard: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend-URL"
|
||||
description = "Basis-URL voor frontend (bijv. https://pdf.example.com). Gebruikt voor e-mailuitnodigingslinks en mobiele QR-codeuploads. Laat leeg om de backend-URL te gebruiken."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Klik om plandetails te bekijken"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Beveiliging"
|
||||
description = "Configureer authenticatie, inloggedrag en beveiligingsbeleid."
|
||||
@@ -4565,19 +4371,6 @@ connect = "Verbinden"
|
||||
disconnect = "Verbinding verbreken"
|
||||
disconnected = "Provider succesvol ontkoppeld"
|
||||
disconnectError = "Ontkoppelen van provider mislukt"
|
||||
mobileScannerConvertToPdf = "Afbeeldingen naar PDF converteren"
|
||||
mobileScannerConvertToPdfDesc = "Geüploade afbeeldingen automatisch naar PDF-formaat converteren. Indien uitgeschakeld, blijven afbeeldingen ongewijzigd."
|
||||
mobileScannerImageResolution = "Beeldresolutie"
|
||||
mobileScannerImageResolutionDesc = "Resolutie van geüploade afbeeldingen. \"Verlaagd\" schaalt afbeeldingen naar max 1200px om de bestandsgrootte te verkleinen."
|
||||
imageResolutionFull = "Volledig (oorspronkelijke grootte)"
|
||||
imageResolutionReduced = "Verlaagd (max 1200px)"
|
||||
mobileScannerPageFormat = "Paginaformaat"
|
||||
mobileScannerPageFormatDesc = "PDF-paginaformaat voor geconverteerde afbeeldingen. \"Behouden\" gebruikt oorspronkelijke afbeeldingsafmetingen."
|
||||
pageFormatKeep = "Behouden (oorspronkelijke afmetingen)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Passend maken"
|
||||
mobileScannerStretchToFitDesc = "Rek afbeeldingen op om de hele pagina te vullen. Indien uitgeschakeld, worden afbeeldingen gecentreerd met behoud van de beeldverhouding."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO automatisch inloggen"
|
||||
@@ -4646,122 +4439,6 @@ description = "Automatisch gebruikersaccounts aanmaken bij de eerste SAML2-login
|
||||
label = "Registratie blokkeren"
|
||||
description = "Nieuwe gebruikersregistratie via SAML2 voorkomen"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Uploaden via mobiele telefoon"
|
||||
enable = "QR-code-upload inschakelen"
|
||||
description = "Sta gebruikers toe bestanden te uploaden vanaf mobiele apparaten door een QR-code te scannen"
|
||||
note = "Opmerking: hiervoor moet de Frontend-URL worden geconfigureerd. "
|
||||
link = "Configureren in systeeminstellingen"
|
||||
mobileScannerConvertToPdf = "Afbeeldingen naar PDF converteren"
|
||||
mobileScannerConvertToPdfDesc = "Geüploade afbeeldingen automatisch naar PDF-formaat converteren. Indien uitgeschakeld, blijven afbeeldingen ongewijzigd."
|
||||
mobileScannerImageResolution = "Beeldresolutie"
|
||||
mobileScannerImageResolutionDesc = "Resolutie van geüploade afbeeldingen. \"Verlaagd\" schaalt afbeeldingen naar max 1200px om de bestandsgrootte te verkleinen."
|
||||
imageResolutionFull = "Volledig (oorspronkelijke grootte)"
|
||||
imageResolutionReduced = "Verlaagd (max 1200px)"
|
||||
mobileScannerPageFormat = "Paginaformaat"
|
||||
mobileScannerPageFormatDesc = "PDF-paginaformaat voor geconverteerde afbeeldingen. \"Behouden\" gebruikt oorspronkelijke afbeeldingsafmetingen."
|
||||
pageFormatKeep = "Behouden (oorspronkelijke afmetingen)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Passend maken"
|
||||
mobileScannerStretchToFitDesc = "Rek afbeeldingen op om de hele pagina te vullen. Indien uitgeschakeld, worden afbeeldingen gecentreerd met behoud van de beeldverhouding."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram-bot"
|
||||
description = "Telegram-botconnectiviteit, toegangsbeheer en feedbackgedrag configureren."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Telegram-bot inschakelen"
|
||||
description = "Gebruikers toestaan te werken met Stirling PDF via uw geconfigureerde Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Botgebruikersnaam"
|
||||
description = "De openbare gebruikersnaam van uw Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot-token"
|
||||
description = "API-token geleverd door BotFather voor uw Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Inboxmap"
|
||||
description = "Map onder de pipeline-map waar inkomende Telegram-bestanden worden opgeslagen."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Aangepaste mapachtervoegsel gebruiken"
|
||||
description = "Voeg de chat-ID toe aan mappen met inkomende bestanden om uploads per chat te isoleren."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Toegangsbeheer"
|
||||
description = "Beperk welke gebruikers of kanalen met de bot kunnen communiceren."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Specifieke gebruikers-ID's toestaan"
|
||||
description = "Indien ingeschakeld, kunnen alleen vermelde gebruikers-ID's de bot gebruiken."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Toegestane gebruikers-ID's"
|
||||
description = "Voer Telegram-gebruikers-ID's in die met de bot mogen communiceren."
|
||||
placeholder = "Voeg gebruikers-ID toe en druk op Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Specifieke kanaal-ID's toestaan"
|
||||
description = "Indien ingeschakeld, kunnen alleen vermelde kanaal-ID's de bot gebruiken."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Toegestane kanaal-ID's"
|
||||
description = "Voer Telegram-kanaal-ID's in die met de bot mogen communiceren."
|
||||
placeholder = "Voeg kanaal-ID toe en druk op Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Verwerking"
|
||||
description = "Polling-intervallen en verwerkingstime-outs voor Telegram-uploads beheren."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Verwerkingstime-out (seconden)"
|
||||
description = "Maximale wachttijd voor een verwerkingstaak voordat een fout wordt gemeld."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Polling-interval (ms)"
|
||||
description = "Interval tussen controles op nieuwe Telegram-updates."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Feedbackberichten"
|
||||
description = "Kies wanneer de bot feedback naar gebruikers en kanalen moet sturen."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Feedback inschakelen"
|
||||
description = "Bepaal of de bot überhaupt feedbackberichten verzendt."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Feedbackregels voor kanalen"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "‘Geen geldig document’ weergeven (kanaal)"
|
||||
description = "Onderdruk de ‘geen geldig document’-reactie voor kanaaluploads."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Verwerkingsfouten weergeven (kanaal)"
|
||||
description = "Verzend verwerkingsfoutmeldingen naar kanalen."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Foutmeldingen weergeven (kanaal)"
|
||||
description = "Gedetailleerde foutmeldingen voor kanalen weergeven."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Feedbackregels voor gebruikers"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "‘Geen geldig document’ weergeven (gebruiker)"
|
||||
description = "Onderdruk de ‘geen geldig document’-reactie voor gebruikersuploads."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Verwerkingsfouten weergeven (gebruiker)"
|
||||
description = "Verzend verwerkingsfoutmeldingen naar gebruikers."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Foutmeldingen weergeven (gebruiker)"
|
||||
description = "Gedetailleerde foutmeldingen voor gebruikers weergeven."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
description = "Configureer aangepaste databaseverbindingsinstellingen voor enterprise-implementaties."
|
||||
@@ -4943,10 +4620,6 @@ description = "Sta beheerders toe om gebruikers via e-mail uit te nodigen met au
|
||||
label = "Frontend-URL"
|
||||
description = "Basis-URL voor de frontend (bijv. https://pdf.example.com). Wordt gebruikt voor het genereren van uitnodigingslinks in e-mails. Laat leeg om de back-end-URL te gebruiken."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Opmerking: hiervoor moet de Frontend-URL worden geconfigureerd. "
|
||||
link = "Configureren in systeeminstellingen"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Juridische documenten"
|
||||
description = "Links naar juridische documenten en beleidsregels configureren."
|
||||
@@ -5013,6 +4686,7 @@ title = "Actieve licentie"
|
||||
file = "Bron: licentiebestand ({{path}})"
|
||||
key = "Bron: licentiesleutel"
|
||||
type = "Type: {{type}}"
|
||||
|
||||
noInput = "Geef een licentiesleutel op of upload een certificaatbestand"
|
||||
success = "Succes"
|
||||
|
||||
@@ -5131,9 +4805,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Mijn bestanden"
|
||||
noRecentFiles = "Geen recente bestanden gevonden"
|
||||
googleDriveNotAvailable = "Google Drive-integratie niet beschikbaar"
|
||||
mobileUpload = "Mobiele upload"
|
||||
mobileShort = "Mobiel"
|
||||
mobileUploadNotAvailable = "Mobiele upload niet ingeschakeld"
|
||||
downloadSelected = "Geselecteerde downloaden"
|
||||
saveSelected = "Selectie opslaan"
|
||||
openFiles = "Bestanden openen"
|
||||
@@ -5512,15 +5183,6 @@ impact = "Eventuele applicaties of services die deze sleutels momenteel gebruike
|
||||
confirmPrompt = "Weet u zeker dat u wilt doorgaan?"
|
||||
confirmCta = "Sleutels vernieuwen"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API-sleutelfout"
|
||||
failedToCreateApiKey = "API-sleutel maken mislukt."
|
||||
failedToRetrieveApiKey = "Kan API-sleutel niet uit antwoord ophalen."
|
||||
failedToFetchApiKey = "API-sleutel ophalen mislukt."
|
||||
apiKeyRefreshed = "API-sleutel vernieuwd"
|
||||
apiKeyRefreshedBody = "Uw API-sleutel is succesvol vernieuwd."
|
||||
failedToRefreshApiKey = "Vernieuwen van API-sleutel mislukt."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Bijlagen selecteren"
|
||||
info = "Selecteer bestanden om aan uw PDF toe te voegen. Deze bestanden worden ingesloten en zijn toegankelijk via het bijlagenpaneel van de PDF."
|
||||
@@ -6370,7 +6032,6 @@ description = "Voer de volledige URL van uw self-hosted Stirling PDF-server in"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Voer een server-URL in"
|
||||
invalidUrl = "Ongeldig URL-formaat. Voer een geldige URL in, zoals https://your-server.com"
|
||||
unreachable = "Kan geen verbinding maken met server"
|
||||
testFailed = "Verbindingstest mislukt"
|
||||
configFetch = "Ophalen van serverconfiguratie mislukt. Controleer de URL en probeer het opnieuw."
|
||||
@@ -6389,7 +6050,6 @@ connectingTo = "Verbinden met:"
|
||||
submit = "Inloggen"
|
||||
signInWith = "Inloggen met"
|
||||
oauthPending = "Browser wordt geopend voor authenticatie..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Of ga verder met e-mail"
|
||||
serverRequirement = "Let op: op de server moet inloggen zijn ingeschakeld."
|
||||
showInstructions = "Hoe inschakelen?"
|
||||
@@ -6455,8 +6115,6 @@ reset = "Wijzigingen resetten"
|
||||
downloadJson = "JSON downloaden"
|
||||
generatePdf = "PDF genereren"
|
||||
saveChanges = "Wijzigingen opslaan"
|
||||
applyChanges = "Wijzigingen toepassen"
|
||||
downloadCopy = "Kopie downloaden"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Tekst automatisch schalen zodat deze in vakken past"
|
||||
@@ -6475,24 +6133,6 @@ descriptionInline = "Tip: Houd Ctrl (Cmd) of Shift ingedrukt om meerdere tekstva
|
||||
title = "Bewerkte tekst vastzetten op één PDF‑element"
|
||||
description = "Wanneer ingeschakeld, exporteert de editor elk bewerkt tekstvak als één PDF-tekstelement om overlappende glyphen of gemengde lettertypen te voorkomen."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Geavanceerde instellingen"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Beperkingen van de voorbeeldweergave"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Tekst- en afbeeldingsfocus"
|
||||
text = "Deze werkruimte richt zich op het bewerken van tekst en het herpositioneren van ingesloten afbeeldingen. Complexe pagina-artwork, formulierwidgets en gelaagde graphics blijven behouden voor export maar zijn hier niet volledig bewerkbaar."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Voorbeeldvariaties"
|
||||
text = "Sommige visuals (zoals tabelranden, vormen of weergaven van annotaties) worden mogelijk niet exact weergegeven in het voorbeeld. De geëxporteerde PDF behoudt waar mogelijk de oorspronkelijke tekenopdrachten."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha-viewer"
|
||||
text = "Deze alpha-viewer is nog in ontwikkeling—bepaalde lettertypen, kleuren, transparantie-effecten en details in de lay-out kunnen licht afwijken. Controleer de gegenereerde PDF voordat u deze deelt."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Geselecteerde vakken samenvoegen"
|
||||
merge = "Selectie samenvoegen"
|
||||
@@ -6614,58 +6254,3 @@ title = "Resultaten van tekst toevoegen"
|
||||
|
||||
[addText.error]
|
||||
failed = "Er is een fout opgetreden bij het toevoegen van tekst aan de PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Uploaden vanaf mobiel"
|
||||
description = "Scan om foto's te uploaden. Afbeeldingen worden automatisch naar PDF geconverteerd."
|
||||
descriptionNoConvert = "Scan om foto's vanaf uw mobiele apparaat te uploaden."
|
||||
error = "Verbindingsfout"
|
||||
pollingError = "Fout bij controleren op bestanden"
|
||||
sessionId = "Sessie-ID"
|
||||
sessionCreateError = "Sessie maken mislukt"
|
||||
expiryWarning = "Sessie verloopt binnenkort"
|
||||
expiryWarningMessage = "Deze QR-code verloopt over {{seconds}} seconden. Er wordt automatisch een nieuwe code gegenereerd."
|
||||
filesReceived = "{{count}} bestand(en) ontvangen"
|
||||
connected = "Mobiel apparaat verbonden"
|
||||
instructions = "Scan met de camera van uw telefoon. Afbeeldingen worden automatisch naar PDF geconverteerd."
|
||||
instructionsNoConvert = "Scan met de camera van uw telefoon om bestanden te uploaden."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobiele scanner"
|
||||
noSession = "Ongeldige sessie"
|
||||
noSessionMessage = "Scan een geldige QR-code om deze pagina te openen."
|
||||
validating = "Sessie valideren..."
|
||||
sessionInvalid = "Sessie-fout"
|
||||
sessionExpired = "Deze sessie is verlopen. Vernieuw de pagina en probeer het opnieuw."
|
||||
sessionNotFound = "Sessie niet gevonden. Vernieuw de pagina en probeer het opnieuw."
|
||||
sessionValidationError = "Kan sessie niet verifiëren. Probeer het opnieuw."
|
||||
uploadSuccess = "Uploaden geslaagd!"
|
||||
uploadSuccessMessage = "Uw afbeeldingen zijn overgezet."
|
||||
httpsRequired = "Cameratoegang vereist HTTPS of localhost. Gebruik HTTPS of ga via localhost."
|
||||
uploadFailed = "Uploaden mislukt. Probeer het opnieuw."
|
||||
uploading = "Bezig met uploaden..."
|
||||
connected = "Verbonden"
|
||||
connecting = "Verbinden..."
|
||||
chooseMethod = "Kies uploadmethode"
|
||||
chooseMethodDescription = "Selecteer hoe u documenten wilt scannen en uploaden"
|
||||
camera = "Camera"
|
||||
cameraDescription = "Scan documenten met de camera van uw apparaat met automatische randdetectie"
|
||||
fileUpload = "Bestandsupload"
|
||||
fileDescription = "Upload bestaande foto's of documenten vanaf uw apparaat"
|
||||
cameraAccessDenied = "Cameratoegang geweigerd. Schakel cameratoegang in."
|
||||
back = "Terug"
|
||||
settings = "Instellingen"
|
||||
edgeDetection = "Randdetectie"
|
||||
flashlight = "Zaklamp"
|
||||
flash = "Flitser"
|
||||
processing = "Verwerken..."
|
||||
capture = "Foto maken"
|
||||
selectFilesPrompt = "Selecteer bestanden om te uploaden"
|
||||
selectImage = "Afbeelding selecteren"
|
||||
preview = "Voorbeeld"
|
||||
retake = "Opnieuw maken"
|
||||
addToBatch = "Toevoegen aan batch"
|
||||
upload = "Uploaden"
|
||||
batchImages = "Batch"
|
||||
clearBatch = "Wissen"
|
||||
uploadAll = "Alles uploaden"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Du har ulagrede endringer i PDF-en."
|
||||
pendingRedactionsTitle = "Ikke anvendte sladdinger"
|
||||
pendingRedactions = "Du har ikke anvendte sladdinger som vil gå tapt."
|
||||
areYouSure = "Er du sikker på at du vil forlate?"
|
||||
unsavedChangesTitle = "Ulagrede endringer"
|
||||
keepWorking = "Fortsett å jobbe"
|
||||
discardChanges = "Forkast og forlat"
|
||||
discardRedactions = "Forkast og forlat"
|
||||
applyAndContinue = "Lagre og forlat"
|
||||
exportAndContinue = "Eksporter og fortsett"
|
||||
cancel = "Avbryt"
|
||||
@@ -134,7 +131,7 @@ unsupported = "Ikke støttet"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Velg et verktøy for å komme i gang"
|
||||
alpha = "Alpha"
|
||||
alpha = "Alfa"
|
||||
premiumFeature = "Premium-funksjon:"
|
||||
comingSoon = "Kommer snart:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Avansert"
|
||||
edit = "Vis & Rediger"
|
||||
popular = "Populært"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferanser"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avansert"
|
||||
title = "Sikkerhet og autentisering"
|
||||
security = "Sikkerhet"
|
||||
connections = "Tilkoblinger"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Lisensiering og analyse"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Nåværende versjon"
|
||||
latestVersion = "Siste versjon"
|
||||
checkForUpdates = "Søk etter oppdateringer"
|
||||
viewDetails = "Vis detaljer"
|
||||
serverNeedsUpdate = "Serveren må oppdateres av administrator"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Versjonsinformasjon"
|
||||
description = "Detaljer om skrivebords- og serverversjon"
|
||||
desktop = "Skrivebordsversjon"
|
||||
server = "Serverversjon"
|
||||
|
||||
[settings.security]
|
||||
title = "Sikkerhet"
|
||||
description = "Oppdater passordet ditt for å holde kontoen sikker."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Endre passordet ditt. Du blir logget ut etter oppdatering."
|
||||
required = "Alle felt er obligatoriske."
|
||||
mismatch = "De nye passordene samsvarer ikke."
|
||||
error = "Kan ikke oppdatere passordet. Bekreft gjeldende passord og prøv igjen."
|
||||
success = "Passordet ble oppdatert. Logg inn på nytt."
|
||||
ssoDisabled = "Passordendringer styres av identitetsleverandøren din."
|
||||
current = "Nåværende passord"
|
||||
currentPlaceholder = "Skriv inn nåværende passord"
|
||||
new = "Nytt passord"
|
||||
newPlaceholder = "Skriv inn et nytt passord"
|
||||
confirm = "Bekreft nytt passord"
|
||||
confirmPlaceholder = "Skriv inn det nye passordet på nytt"
|
||||
update = "Oppdater passord"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Tastatursnarveier"
|
||||
@@ -522,16 +488,11 @@ low = "Lav"
|
||||
title = "Endre Legitimasjon"
|
||||
header = "Oppdater Konto Detaljer"
|
||||
changePassword = "Du bruker standard påloggingsdetaljer. Vennligst skriv inn et nytt passord"
|
||||
ssoManaged = "Kontoen din administreres av identitetsleverandøren din."
|
||||
newUsername = "Nytt Brukernavn"
|
||||
oldPassword = "Nåværende Passord"
|
||||
newPassword = "Nytt Passord"
|
||||
confirmNewPassword = "Bekreft Nytt Passord"
|
||||
submit = "Send Endringer"
|
||||
credsUpdated = "Konto oppdatert"
|
||||
description = "Endringer lagret. Logg inn på nytt."
|
||||
error = "Kan ikke oppdatere brukernavn. Bekreft passordet ditt og prøv igjen."
|
||||
changeUsername = "Oppdater brukernavnet ditt. Du blir logget ut etter oppdatering."
|
||||
|
||||
[account]
|
||||
title = "Kontoinnstillinger"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Kontoinnstillinger"
|
||||
adminSettings = "Admin Innstillinger - Vis og Legg til Brukere"
|
||||
userControlSettings = "Brukerkontroll Innstillinger"
|
||||
changeUsername = "Endre Brukernavn"
|
||||
changeUsernameDescription = "Oppdater brukernavnet ditt. Du blir logget ut etter oppdatering."
|
||||
newUsernamePlaceholder = "Skriv inn nytt brukernavn"
|
||||
newUsername = "Nytt Brukernavn"
|
||||
password = "Bekreftelsespassord"
|
||||
oldPassword = "Gammelt Passord"
|
||||
@@ -749,11 +708,6 @@ tags = "signatur,autograf"
|
||||
title = "Signer"
|
||||
desc = "Legger til signatur i PDF ved tegning, tekst eller bilde"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annoter,uthev,tegn"
|
||||
title = "Annoter"
|
||||
desc = "Uthev, tegn, legg til notater og figurer i visningen"
|
||||
|
||||
[home.flatten]
|
||||
tags = "forenkle,fjern,interaktiv"
|
||||
title = "Gjøre flat"
|
||||
@@ -964,8 +918,8 @@ desc = "Legger PDF-er over hverandre"
|
||||
title = "Overlay PDF-er"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "PDF-tekstredigerer"
|
||||
desc = "Gå gjennom og rediger Stirling PDF JSON-eksporter med gruppert tekstredigering og regenerering av PDF"
|
||||
title = "PDF-teksteditor"
|
||||
desc = "Rediger eksisterende tekst og bilder i PDF-filer"
|
||||
|
||||
[home.addText]
|
||||
tags = "tekst,merknad,etikett"
|
||||
@@ -976,7 +930,6 @@ desc = "Legg til egendefinert tekst hvor som helst i PDF-en"
|
||||
addFiles = "Legg til filer"
|
||||
uploadFromComputer = "Last opp fra datamaskin"
|
||||
openFromComputer = "Åpne fra datamaskin"
|
||||
mobileUpload = "Last opp fra mobil"
|
||||
|
||||
[viewPdf]
|
||||
tags = "vis,les,annoter,tekst,bilde"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Alternativer for CBZ til PDF"
|
||||
optimizeForEbook = "Optimaliser PDF for e-boklesere (bruker Ghostscript)"
|
||||
cbzOutputOptions = "Alternativer for PDF til CBZ"
|
||||
cbzDpi = "DPI for bildegjengivelse"
|
||||
cbrOptions = "CBR-alternativer"
|
||||
cbrOutputOptions = "Alternativer for PDF til CBR"
|
||||
cbrDpi = "DPI for bildegjengivelse"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Alternativer for eBook til PDF"
|
||||
ebookOptionsDesc = "Alternativer for å konvertere eBooks til PDF"
|
||||
embedAllFonts = "Bygg inn alle skrifter"
|
||||
embedAllFontsDesc = "Bygg inn alle skrifter fra eBook-en i den genererte PDF-en"
|
||||
includeTableOfContents = "Inkluder innholdsfortegnelse"
|
||||
includeTableOfContentsDesc = "Legg til en generert innholdsfortegnelse i den resulterende PDF-en"
|
||||
includePageNumbers = "Inkluder sidenummer"
|
||||
includePageNumbersDesc = "Legg til sidenummer i den genererte PDF-en"
|
||||
optimizeForEbookPdf = "Optimaliser for eBook-lesere"
|
||||
optimizeForEbookPdfDesc = "Optimaliser PDF-en for eBook-lesing (mindre filstørrelse, bedre gjengivelse på eInk-enheter)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Alternativer for PDF til eBook"
|
||||
epubOptionsDesc = "Alternativer for å konvertere PDF til EPUB/AZW3"
|
||||
detectChapters = "Oppdag kapitler"
|
||||
detectChaptersDesc = "Oppdag overskrifter som ser ut som kapitler og sett inn EPUB-sideskift"
|
||||
targetDevice = "Målenhet"
|
||||
targetDeviceDesc = "Velg en utdata-profil optimalisert for leserenheten"
|
||||
outputFormat = "Utdataformat"
|
||||
outputFormatDesc = "Velg utdataformat for eBook-en"
|
||||
tabletPhone = "Nettbrett/mobil (med bilder)"
|
||||
kindleEink = "Kindle e-Ink (tekstoptimalisert)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konvertering,bilde,jpg,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Legg til vedlegg"
|
||||
remove = "Fjern vedlegg"
|
||||
embed = "Bygg inn vedlegg"
|
||||
convertToPdfA3b = "Konverter til PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Oppretter en arkiv-PDF med innebygde vedlegg"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b er et arkivformat som sikrer langtidsbevaring. Det tillater å bygge inn vilkårlige filformater som vedlegg. Konvertering krever Ghostscript og kan ta lengre tid for store filer."
|
||||
convertToPdfA3bTooltipHeader = "Om PDF/A-3b-konvertering"
|
||||
convertToPdfA3bTooltipTitle = "Hva det gjør"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Lagret"
|
||||
label = "Last opp signaturbilde"
|
||||
placeholder = "Velg bildefil"
|
||||
hint = "Last opp et PNG- eller JPG-bilde av signaturen din"
|
||||
removeBackground = "Fjern hvit bakgrunn (gjør gjennomsiktig)"
|
||||
processing = "Behandler bilde..."
|
||||
backgroundRemovalFailedTitle = "Fjerning av bakgrunn mislyktes"
|
||||
backgroundRemovalFailedMessage = "Kunne ikke fjerne bakgrunnen fra bildet. Bruker originalbildet i stedet."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Slik legger du til signatur"
|
||||
@@ -2434,11 +2351,6 @@ note = "Utflating fjerner interaktive elementer fra PDF-en og gjør dem ikke-red
|
||||
label = "Utjevning av kun skjemaer"
|
||||
desc = "Flat bare ut skjemafelter, og la andre interaktive elementer være intakte"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "Renderings-DPI (valgfritt, anbefalt 150 DPI)"
|
||||
help = "La stå tomt for å bruke systemets standard. Høyere DPI gir skarpere resultat, men øker prosesseringstid og filstørrelse."
|
||||
placeholder = "f.eks. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultater for utflating"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Beskjær PDF"
|
||||
submit = "Send inn"
|
||||
noFileSelected = "Velg en PDF-fil for å begynne beskjæring"
|
||||
reset = "Tilbakestill til full PDF"
|
||||
autoCrop = "Beskjær hvite mellomrom automatisk"
|
||||
|
||||
[crop.preview]
|
||||
title = "Valg av beskjæringsområde"
|
||||
@@ -3244,7 +3155,6 @@ title = "Sladdemetode"
|
||||
mode = "Modus"
|
||||
automatic = "Automatisk"
|
||||
automaticDesc = "Sladd tekst basert på søkeord"
|
||||
automaticDisabledTooltip = "Velg filer i filbehandleren for å sladde flere filer samtidig"
|
||||
manual = "Manuell"
|
||||
manualDesc = "Klikk og dra for å sladde bestemte områder"
|
||||
manualComingSoon = "Manuell sladding kommer snart"
|
||||
@@ -3315,35 +3225,8 @@ text = "Match bare komplette ord, ikke delvise treff. «John» vil ikke matche
|
||||
title = "Konverter til PDF-bilde"
|
||||
text = "Konverterer PDF-en til en bildebassert PDF etter sladding. Dette sikrer at teksten bak sladdeboksene er fullstendig fjernet og ikke kan gjenopprettes."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Manuelle sladdekontroller"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Verktøy for tekstmerking"
|
||||
text = "Velg tekst direkte i PDF-en for å markere den for sladding. Klikk og dra for å utheve tekst du vil sladde."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Verktøy for områdemerking"
|
||||
text = "Tegn rektangulære områder på PDF-en for å markere områder for sladding. Nyttig for å sladde bilder, signaturer eller uregelmessige former."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Bruk sladding"
|
||||
text = "Når innhold er markert, klikk «Bruk» for permanent å sladde alle markerte områder. Antallet som venter viser hvor mange sladdinger som er klare til å bli brukt."
|
||||
bullet1 = "Marker så mange områder som nødvendig før du bruker"
|
||||
bullet2 = "Alle ventende sladdinger brukes samtidig"
|
||||
bullet3 = "Sladding kan ikke angres etter bruk"
|
||||
|
||||
[redact.manual]
|
||||
title = "Sladdeverktøy"
|
||||
instructions = "Velg tekst eller tegn områder på PDF-en for å markere innhold for sladding."
|
||||
markText = "Marker tekst"
|
||||
markArea = "Marker område"
|
||||
pendingLabel = "Venter:"
|
||||
applyWarning = "⚠️ Permanent handling, kan ikke angres og data under blir slettet"
|
||||
apply = "Bruk"
|
||||
noMarks = "Ingen sladdemerker. Bruk verktøyene ovenfor for å markere innhold for sladding."
|
||||
header = "Manuell sladding"
|
||||
controlsTitle = "Manuelle sladdekontroller"
|
||||
textBasedRedaction = "Tekstbasert sladding"
|
||||
pageBasedRedaction = "Sidebasert sladding"
|
||||
convertPDFToImageLabel = "Konverter PDF til PDF-bilde (brukes til å fjerne tekst bak boksen)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Skriv inn antall horisontale delinger"
|
||||
label = "Vertikale delinger"
|
||||
placeholder = "Skriv inn antall vertikale delinger"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Delingsmodus"
|
||||
description = "Velg hvordan sidene skal deles"
|
||||
splitAll = "Del alle sider"
|
||||
splitAllExceptFirst = "Del alle unntatt første"
|
||||
splitAllExceptLast = "Del alle unntatt siste"
|
||||
splitAllExceptFirstAndLast = "Del alle unntatt første og siste"
|
||||
custom = "Egendefinerte sider"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Egendefinerte sidenumre"
|
||||
placeholder = "f.eks. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "stempel,legg til bilde,senter bilde,vannmerke,PDF,embed,tilpass"
|
||||
header = "Stemple PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Filstørrelse"
|
||||
[compress.grayscale]
|
||||
label = "Bruk gråskala for komprimering"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Lineariser PDF for rask webvisning"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Konverter bilder til strektegning"
|
||||
description = "Bruker ImageMagick for å redusere sider til høy-kontrast svart-hvitt for maksimal størrelsesreduksjon."
|
||||
unavailable = "ImageMagick er ikke installert eller aktivert på denne serveren"
|
||||
detailLevel = "Detaljnivå"
|
||||
edgeEmphasis = "Kantvektlegging"
|
||||
edgeLow = "Svak"
|
||||
edgeMedium = "Balansert"
|
||||
edgeHigh = "Sterk"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Oversikt over komprimeringsinnstillinger"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Høyere verdier reduserer filstørrelsen"
|
||||
title = "Gråtoner"
|
||||
text = "Velg dette alternativet for å konvertere alle bilder til svart-hvitt, noe som kan redusere filstørrelsen betydelig, spesielt for skannede PDF-er eller dokumenter med mange bilder."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Strektegning"
|
||||
text = "Konverter sider til høy-kontrast svart-hvitt med ImageMagick. Bruk detaljnivå for å styre hvor mye innhold som blir svart, og kantvektlegging for å styre hvor aggressivt kanter oppdages."
|
||||
|
||||
[compress.error]
|
||||
failed = "Det oppstod en feil under komprimering av PDF-en."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Det oppstod en feil under komprimering av PDF-en."
|
||||
_value = "Komprimeringsinnstillinger"
|
||||
1 = "1-3 PDF-komprimering,</br> 4-6 lett bildekomprimering,</br> 7-9 intens bildekomprimering vil redusere bildekvaliteten kraftig"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Lavere verdier bevarer kvaliteten, men gir større filer"
|
||||
range4to6 = "Middels komprimering med moderat kvalitetsreduksjon"
|
||||
range7to9 = "Høyere verdier reduserer filstørrelsen betydelig, men kan redusere bildeklarheten"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Denne filen er passordbeskyttet. Skriv inn passordet:"
|
||||
cancelled = "Operasjon avbrutt for PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Slett valgte sider"
|
||||
closePdf = "Lukk PDF"
|
||||
exportAll = "Eksporter PDF"
|
||||
downloadSelected = "Last ned valgte filer"
|
||||
annotations = "Merknader"
|
||||
exportSelected = "Eksporter valgte sider"
|
||||
saveChanges = "Lagre endringer"
|
||||
downloadAll = "Last ned alle"
|
||||
saveAll = "Lagre alle"
|
||||
toggleTheme = "Bytt tema"
|
||||
toggleBookmarks = "Veksle bokmerker"
|
||||
language = "Språk"
|
||||
toggleAnnotations = "Vis/skjul merknader"
|
||||
search = "Søk i PDF"
|
||||
panMode = "Panoreringsmodus"
|
||||
applyRedactionsFirst = "Bruk sladding først"
|
||||
rotateLeft = "Roter til venstre"
|
||||
rotateRight = "Roter til høyre"
|
||||
toggleSidebar = "Vis/skjul sidepanel"
|
||||
toggleBookmarks = "Veksle bokmerker"
|
||||
exportSelected = "Eksporter valgte sider"
|
||||
toggleAnnotations = "Vis/skjul merknader"
|
||||
annotationMode = "Veksle merknadsmodus"
|
||||
print = "Skriv ut PDF"
|
||||
draw = "Tegn"
|
||||
redact = "Sladd"
|
||||
exitRedaction = "Avslutt sladdemodus"
|
||||
save = "Lagre"
|
||||
downloadAll = "Last ned alle"
|
||||
saveAll = "Lagre alle"
|
||||
|
||||
[textAlign]
|
||||
left = "Venstre"
|
||||
center = "Sentrert"
|
||||
right = "Høyre"
|
||||
|
||||
[annotation]
|
||||
title = "Annoter"
|
||||
desc = "Bruk utheving, penn, tekst og notater. Endringer er levende—ingen utflating nødvendig."
|
||||
highlight = "Uthev"
|
||||
pen = "Penn"
|
||||
text = "Tekstboks"
|
||||
note = "Notat"
|
||||
rectangle = "Rektangel"
|
||||
ellipse = "Ellipse"
|
||||
select = "Velg"
|
||||
exit = "Avslutt annotasjonsmodus"
|
||||
strokeWidth = "Bredde"
|
||||
opacity = "Opasitet"
|
||||
strokeOpacity = "Strekopasitet"
|
||||
fillOpacity = "Fyllopasitet"
|
||||
fontSize = "Skriftstørrelse"
|
||||
chooseColor = "Velg farge"
|
||||
color = "Farge"
|
||||
strokeColor = "Strekfarge"
|
||||
fillColor = "Fyllfarge"
|
||||
underline = "Understrek"
|
||||
strikeout = "Gjennomstreking"
|
||||
squiggly = "Bølgete"
|
||||
inkHighlighter = "Frihåndsmarkering"
|
||||
freehandHighlighter = "Frihåndsmarkering"
|
||||
square = "Kvadrat"
|
||||
circle = "Sirkel"
|
||||
polygon = "Polygon"
|
||||
line = "Linje"
|
||||
stamp = "Legg til bilde"
|
||||
textMarkup = "Tekstmarkering"
|
||||
drawing = "Tegning"
|
||||
shapes = "Former"
|
||||
notesStamps = "Notater og stempler"
|
||||
settings = "Innstillinger"
|
||||
borderOn = "Kant: På"
|
||||
borderOff = "Kant: Av"
|
||||
editInk = "Rediger penn"
|
||||
editLine = "Rediger linje"
|
||||
editNote = "Rediger notat"
|
||||
editText = "Rediger tekstboks"
|
||||
editTextMarkup = "Rediger tekstmarkering"
|
||||
editSelected = "Rediger merknad"
|
||||
editSquare = "Rediger kvadrat"
|
||||
editCircle = "Rediger sirkel"
|
||||
editPolygon = "Rediger polygon"
|
||||
unsupportedType = "Denne merknadstypen er ikke fullt støttet for redigering."
|
||||
textAlignment = "Tekstjustering"
|
||||
noteIcon = "Notat-ikon"
|
||||
imagePreview = "Forhåndsvisning"
|
||||
contents = "Tekst"
|
||||
backgroundColor = "Bakgrunnsfarge"
|
||||
clearBackground = "Fjern bakgrunn"
|
||||
noBackground = "Ingen bakgrunn"
|
||||
stampSettings = "Stempelinnstillinger"
|
||||
savingCopy = "Forbereder nedlasting..."
|
||||
saveFailed = "Kan ikke lagre kopi"
|
||||
saveReady = "Nedlasting klar"
|
||||
selectAndMove = "Velg og rediger"
|
||||
editSelectDescription = "Klikk en eksisterende merknad for å redigere farge, opasitet, tekst eller størrelse."
|
||||
editStampHint = "For å endre bildet, slett dette stempelet og legg til et nytt."
|
||||
editSwitchToSelect = "Bytt til Velg og rediger for å redigere denne merknaden."
|
||||
undo = "Angre"
|
||||
redo = "Gjør om"
|
||||
applyChanges = "Bruk endringer"
|
||||
saveChanges = "Lagre endringer"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Innst."
|
||||
adminSettings = "Admin Innst."
|
||||
allTools = "All Tools"
|
||||
reader = "Leser"
|
||||
tours = "Omvisninger"
|
||||
showMeAround = "Vis meg rundt"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Se gjennomganger her: Verktøy-omvisning, ny V2-layout-omvisning og admin-omvisning."
|
||||
user = "Se gjennomganger her: Verktøy-omvisning og ny V2-layout-omvisning."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Omvisning i verktøyene"
|
||||
toolsTourDesc = "Lær hva verktøyene kan gjøre"
|
||||
adminTour = "Admin-omvisning"
|
||||
adminTourDesc = "Utforsk admin-innstillinger og funksjoner"
|
||||
whatsNewTour = "Se hva som er nytt i V2"
|
||||
whatsNewTourDesc = "Omvisning i oppdatert layout"
|
||||
|
||||
[admin]
|
||||
error = "Feil"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Kunne ikke laste inn innstillinger"
|
||||
saveError = "Kunne ikke lagre innstillinger"
|
||||
saved = "Innstillinger lagret"
|
||||
saveSuccess = "Innstillinger lagret"
|
||||
success = "Innstillinger lagret"
|
||||
error = "Kunne ikke lagre innstillinger"
|
||||
save = "Lagre endringer"
|
||||
discard = "Forkast"
|
||||
restartRequired = "Omstart kreves"
|
||||
@@ -4422,13 +4185,6 @@ description = "Sti til WeasyPrint-kjørbar for HTML til PDF-konvertering (la st
|
||||
label = "Unoconvert-kjørbar fil"
|
||||
description = "Sti til LibreOffice unoconvert for dokumentkonverteringer (la stå tomt for standard: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Frontend URL"
|
||||
description = "Basis-URL for frontend (f.eks. https://pdf.example.com). Brukes for e-postinvitasjonslenker og mobile QR-kodeopplastinger. La stå tomt for å bruke backend-URL."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Klikk for å se plandetaljer"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Sikkerhet"
|
||||
description = "Konfigurer autentisering, innloggingsatferd og sikkerhetspolicyer."
|
||||
@@ -4505,7 +4261,7 @@ description = "Spor brukerhandlinger og systemhendelser for etterlevelse og sikk
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Revisjonsnivå"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=AV, 1=GRUNNLEGGENDE, 2=STANDARD, 3=DETALJERT"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Bevaring av revisjon (dager)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Koble til"
|
||||
disconnect = "Koble fra"
|
||||
disconnected = "Leverandør koblet fra"
|
||||
disconnectError = "Kunne ikke koble fra leverandør"
|
||||
mobileScannerConvertToPdf = "Konverter bilder til PDF"
|
||||
mobileScannerConvertToPdfDesc = "Konverter automatisk opplastede bilder til PDF-format. Hvis deaktivert, beholdes bildene som de er."
|
||||
mobileScannerImageResolution = "Bildeoppløsning"
|
||||
mobileScannerImageResolutionDesc = "Oppløsning på opplastede bilder. «Redusert» skalerer bilder til maks 1200 px for å redusere filstørrelsen."
|
||||
imageResolutionFull = "Full (original størrelse)"
|
||||
imageResolutionReduced = "Redusert (maks 1200 px)"
|
||||
mobileScannerPageFormat = "Sideformat"
|
||||
mobileScannerPageFormatDesc = "PDF-sidestørrelse for konverterte bilder. «Behold» bruker bildenes opprinnelige dimensjoner."
|
||||
pageFormatKeep = "Behold (opprinnelige dimensjoner)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Strekk for å fylle"
|
||||
mobileScannerStretchToFitDesc = "Strekk bilder for å fylle hele siden. Hvis deaktivert, sentreres bilder med beholdt sideforhold."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "SSO automatisk innlogging"
|
||||
@@ -4646,122 +4389,6 @@ description = "Opprett brukerkontoer automatisk ved første SAML2-innlogging"
|
||||
label = "Blokker registrering"
|
||||
description = "Hindre ny brukerregistrering via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Opplasting fra mobil"
|
||||
enable = "Aktiver QR-kodeopplasting"
|
||||
description = "Tillat brukere å laste opp filer fra mobile enheter ved å skanne en QR-kode"
|
||||
note = "Merk: Krever at Frontend URL er konfigurert. "
|
||||
link = "Konfigurer i systeminnstillinger"
|
||||
mobileScannerConvertToPdf = "Konverter bilder til PDF"
|
||||
mobileScannerConvertToPdfDesc = "Konverter automatisk opplastede bilder til PDF-format. Hvis deaktivert, beholdes bildene som de er."
|
||||
mobileScannerImageResolution = "Bildeoppløsning"
|
||||
mobileScannerImageResolutionDesc = "Oppløsning på opplastede bilder. «Redusert» skalerer bilder til maks 1200 px for å redusere filstørrelsen."
|
||||
imageResolutionFull = "Full (original størrelse)"
|
||||
imageResolutionReduced = "Redusert (maks 1200 px)"
|
||||
mobileScannerPageFormat = "Sideformat"
|
||||
mobileScannerPageFormatDesc = "PDF-sidestørrelse for konverterte bilder. «Behold» bruker bildenes opprinnelige dimensjoner."
|
||||
pageFormatKeep = "Behold (opprinnelige dimensjoner)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Strekk for å fylle"
|
||||
mobileScannerStretchToFitDesc = "Strekk bilder for å fylle hele siden. Hvis deaktivert, sentreres bilder med beholdt sideforhold."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Telegram-bot"
|
||||
description = "Konfigurer Telegram-bottilkobling, tilgangskontroll og tilbakemeldingsatferd."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Aktiver Telegram-bot"
|
||||
description = "La brukere samhandle med Stirling PDF via din konfigurerte Telegram-bot."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Bot-brukernavn"
|
||||
description = "Det offentlige brukernavnet til Telegram-boten."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Bot-token"
|
||||
description = "API-token levert av BotFather for Telegram-boten din."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Innboksmappe"
|
||||
description = "Mappe under pipeline-katalogen der innkommende Telegram-filer lagres."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Bruk egendefinert mappesuffiks"
|
||||
description = "Legg til chat-ID i mapper for innkommende filer for å isolere opplastinger per chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Tilgangskontroll"
|
||||
description = "Begrens hvilke brukere eller kanaler som kan samhandle med boten."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Tillat spesifikke bruker-ID-er"
|
||||
description = "Når aktivert, kan kun listede bruker-ID-er bruke boten."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Tillatte bruker-ID-er"
|
||||
description = "Angi Telegram-bruker-ID-er som kan samhandle med boten."
|
||||
placeholder = "Legg til bruker-ID og trykk enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Tillat spesifikke kanal-ID-er"
|
||||
description = "Når aktivert, kan kun listede kanal-ID-er bruke boten."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Tillatte kanal-ID-er"
|
||||
description = "Angi Telegram-kanal-ID-er som kan samhandle med boten."
|
||||
placeholder = "Legg til kanal-ID og trykk enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Behandling"
|
||||
description = "Kontroller pollingintervaller og tidsavbrudd for behandling av Telegram-opplastinger."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Behandlingstidsavbrudd (sekunder)"
|
||||
description = "Maksimal tid å vente på en behandlingsjobb før en feil rapporteres."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Pollingintervall (ms)"
|
||||
description = "Intervall mellom sjekker av nye Telegram-oppdateringer."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Tilbakemeldinger"
|
||||
description = "Velg når boten skal sende tilbakemeldinger til brukere og kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Aktiver tilbakemeldinger"
|
||||
description = "Styr om boten skal sende tilbakemeldingsmeldinger i det hele tatt."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regler for kanaltilbakemelding"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Vis «Ingen gyldig dokument» (kanal)"
|
||||
description = "Undertrykk svaret «ingen gyldig dokument» for kanalopplastinger."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Vis behandlingsfeil (kanal)"
|
||||
description = "Send behandlingsfeilmeldinger til kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Vis feilmeldinger (kanal)"
|
||||
description = "Vis detaljerte feilmeldinger for kanaler."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regler for brukertilbakemelding"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Vis «Ingen gyldig dokument» (bruker)"
|
||||
description = "Undertrykk svaret «ingen gyldig dokument» for brukeropplastinger."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Vis behandlingsfeil (bruker)"
|
||||
description = "Send behandlingsfeilmeldinger til brukere."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Vis feilmeldinger (bruker)"
|
||||
description = "Vis detaljerte feilmeldinger for brukere."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
description = "Konfigurer egendefinerte databaseinnstillinger for bedriftsdistribusjoner."
|
||||
@@ -4943,10 +4570,6 @@ description = "Tillat administratorer å invitere brukere via e-post med autogen
|
||||
label = "Frontend-URL"
|
||||
description = "Base-URL for frontend (f.eks. https://pdf.example.com). Brukes til å generere invitasjonslenker i e-poster. La stå tomt for å bruke backend-URL."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Merk: Krever at Frontend URL er konfigurert. "
|
||||
link = "Konfigurer i systeminnstillinger"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Juridiske dokumenter"
|
||||
description = "Konfigurer lenker til juridiske dokumenter og retningslinjer."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Mine filer"
|
||||
noRecentFiles = "Ingen nylige filer funnet"
|
||||
googleDriveNotAvailable = "Google Drive-integrasjon er ikke tilgjengelig"
|
||||
mobileUpload = "Mobilopplasting"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "Mobilopplasting er ikke aktivert"
|
||||
downloadSelected = "Last ned valgte"
|
||||
saveSelected = "Lagre valgte"
|
||||
openFiles = "Åpne filer"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Laster..."
|
||||
back = "Tilbake"
|
||||
continue = "Fortsett"
|
||||
error = "Feil"
|
||||
save = "Lagre"
|
||||
|
||||
[config.overview]
|
||||
title = "Programkonfigurasjon"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Eventuelle applikasjoner eller tjenester som bruker disse nøklene nå
|
||||
confirmPrompt = "Er du sikker på at du vil fortsette?"
|
||||
confirmCta = "Oppdater nøkler"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "API-nøkkelfeil"
|
||||
failedToCreateApiKey = "Kunne ikke opprette API-nøkkel."
|
||||
failedToRetrieveApiKey = "Kunne ikke hente API-nøkkel fra respons."
|
||||
failedToFetchApiKey = "Kunne ikke hente API-nøkkel."
|
||||
apiKeyRefreshed = "API-nøkkel fornyet"
|
||||
apiKeyRefreshedBody = "API-nøkkelen er fornyet."
|
||||
failedToRefreshApiKey = "Kunne ikke fornye API-nøkkel."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Velg vedlegg"
|
||||
info = "Velg filer som skal legges ved PDF-en. Disse filene blir innebygd og tilgjengelige via PDF-ens vedleggspanel."
|
||||
@@ -5579,7 +5189,7 @@ title = "Erstatt-Inverter-Farge"
|
||||
|
||||
[replace-color.options]
|
||||
fill = "Fyllfarge"
|
||||
gradient = "Gradient"
|
||||
gradient = "Fargeovergang"
|
||||
|
||||
[replace-color.selectText]
|
||||
1 = "Erstatt eller Inverter farge alternativer"
|
||||
@@ -5625,16 +5235,6 @@ finish = "Fullfør"
|
||||
startTour = "Start omvisning"
|
||||
startTourDescription = "Ta en guidet tur gjennom Stirling PDF sine nøkkelfunksjoner"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Start i <strong>Hurtigtilgang</strong>-panelet for å hoppe mellom Leser, Automatiser, filene dine og alle omvisningene."
|
||||
leftPanel = "Det venstre <strong>Verktøy</strong>-panelet viser alt du kan gjøre. Bla i kategorier eller søk for å finne et verktøy raskt."
|
||||
fileUpload = "Bruk <strong>Filer</strong>-knappen for å laste opp eller velge en nylig PDF. Vi laster et eksempel så du kan se arbeidsområdet."
|
||||
rightRail = "I <strong>Høyre panel</strong> finner du hurtighandlinger for å velge filer, endre tema eller språk, og laste ned resultater."
|
||||
topBar = "Toppfeltet lar deg bytte mellom <strong>Viser</strong>, <strong>Sideeditor</strong> og <strong>Aktive filer</strong>."
|
||||
pageEditorView = "Bytt til sideeditoren for å endre rekkefølge, rotere eller slette sider."
|
||||
activeFilesView = "Bruk Aktive filer for å se alt du har åpent og velge hva du vil jobbe med."
|
||||
wrapUp = "Det er det som er nytt i V2. Åpne <strong>Omvisninger</strong>-menyen når som helst for å spille av denne, verktøyomvisningen eller admin-omvisningen."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Velkommen til Stirling PDF!"
|
||||
description = "Vil du ta en rask 1-minutts omvisning for å lære nøkkelfunksjonene og hvordan du kommer i gang?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Last ned →"
|
||||
showMeAround = "Vis meg rundt"
|
||||
skipTheTour = "Hopp over omvisningen"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Omvisningsoversikt"
|
||||
body = "Stirling PDF V2 leveres med dusinvis av verktøy og et fornyet grensesnitt. Ta en rask omvisning for å se hva som er endret og hvor du finner funksjonene du trenger."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Hopp over nå"
|
||||
seePlans = "Se planer →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Oppgrader nå →"
|
||||
freeTitle = "Serverlisens"
|
||||
overLimitTitle = "Serverlisens kreves"
|
||||
overLimitBody = "Lisensieringen vår tillater opptil <strong>{{freeTierLimit}}</strong> brukere gratis per server. Du har <strong>{{overLimitUserCopy}}</strong> Stirling-brukere. For å fortsette uten avbrudd, oppgrader til Stirling Server-planen – <strong>ubegrensede plasser</strong>, PDF-tekstredigering og full admin-kontroll for $99/server/mnd."
|
||||
freeBody = "Vår <strong>Open-Core</strong>-lisensiering tillater opptil <strong>{{freeTierLimit}}</strong> brukere gratis per server. For å skalere uten avbrudd og få tidlig tilgang til vårt nye <strong>PDF-tekstredigeringsverktøy</strong>, anbefaler vi Stirling Server-planen – full redigering og <strong>ubegrensede plasser</strong> for $99/server/mnd."
|
||||
freeBody = "Vår <strong>Open-Core</strong>-lisensiering tillater opptil <strong>{{freeTierLimit}}</strong> brukere gratis per server. For å skalere uten avbrudd anbefaler vi Stirling Server-planen - <strong>ubegrensede plasser</strong> og <strong>SSO-støtte</strong> for $99/server/mnd."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Last ned"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Kontakt salg"
|
||||
contactToUpgrade = "Kontakt oss for å oppgradere eller tilpasse planen din"
|
||||
maxUsers = "Maks brukere"
|
||||
upTo = "Opptil"
|
||||
getLicense = "Skaff serverlisens"
|
||||
upgradeToEnterprise = "Oppgrader til Enterprise"
|
||||
selectPeriod = "Velg fakturaperiode"
|
||||
monthlyBilling = "Månedlig fakturering"
|
||||
yearlyBilling = "Årlig fakturering"
|
||||
checkoutOpened = "Kassen åpnet"
|
||||
checkoutInstructions = "Fullfør kjøpet i Stripe-fanen. Etter betaling, kom tilbake hit og oppdater siden for å aktivere lisensen. Du får også en e-post med lisensnøkkelen din."
|
||||
activateLicense = "Aktiver lisensen din"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Kassen åpnet i ny fane"
|
||||
instructions = "Fullfør kjøpet i Stripe-fanen. Når betalingen er fullført, mottar du en e-post med lisensnøkkelen din."
|
||||
enterKey = "Skriv inn lisensnøkkelen nedenfor for å aktivere planen:"
|
||||
keyDescription = "Lim inn lisensnøkkelen fra e-posten din"
|
||||
activate = "Aktiver lisens"
|
||||
doLater = "Jeg gjør dette senere"
|
||||
success = "Lisens aktivert!"
|
||||
successMessage = "Lisensen din er aktivert. Du kan nå lukke dette vinduet."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "E-postverifisering kreves"
|
||||
message = "Du må verifisere e-postadressen din i Stripe-faktureringsportalen. Sjekk e-posten din for en påloggingslenke."
|
||||
|
||||
[plan.period]
|
||||
month = "måned"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Revisjonssystemet er ikke tilgjengelig"
|
||||
notAvailableMessage = "Revisjonssystemet er ikke konfigurert eller ikke tilgjengelig."
|
||||
disabled = "Revisjonslogging er deaktivert"
|
||||
disabledMessage = "Aktiver revisjonslogging i programkonfigurasjonen for å spore systemhendelser."
|
||||
enterpriseRequired = "Enterprise-lisens kreves"
|
||||
enterpriseRequiredMessage = "Revisjonsloggsystemet er en Enterprise-funksjon. Oppgrader til en Enterprise-lisens for å få tilgang til revisjonslogger og analyse."
|
||||
|
||||
[audit.error]
|
||||
title = "Feil ved innlasting av revisjonssystemet"
|
||||
@@ -6370,7 +5942,6 @@ description = "Skriv inn full URL til din selvhostede Stirling PDF-server"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Skriv inn en server-URL"
|
||||
invalidUrl = "Ugyldig URL-format. Angi en gyldig URL som https://your-server.com"
|
||||
unreachable = "Kunne ikke koble til server"
|
||||
testFailed = "Tilkoblingstest mislyktes"
|
||||
configFetch = "Kunne ikke hente serverkonfigurasjon. Kontroller URL-en og prøv igjen."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Kobler til:"
|
||||
submit = "Logg inn"
|
||||
signInWith = "Logg inn med"
|
||||
oauthPending = "Åpner nettleser for autentisering..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Eller fortsett med e-post"
|
||||
serverRequirement = "Merk: Serveren må ha pålogging aktivert."
|
||||
showInstructions = "Hvordan aktivere?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Avsnittsside"
|
||||
sparse = "Sparsom tekst"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automatisk"
|
||||
paragraph = "Avsnitt"
|
||||
singleLine = "Én linje"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Tilbakestill endringer"
|
||||
downloadJson = "Last ned JSON"
|
||||
generatePdf = "Generer PDF"
|
||||
saveChanges = "Lagre endringer"
|
||||
applyChanges = "Bruk endringer"
|
||||
downloadCopy = "Last ned kopi"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoskalere tekst til å passe i bokser"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Tips: Hold Ctrl (Cmd) eller Shift for å multivelge tekstbo
|
||||
title = "Lås redigert tekst til ett PDF-element"
|
||||
description = "Når aktivert, eksporterer editoren hver redigerte tekstboks som ett PDF-tekstelement for å unngå overlappende glyfer eller blandede skrifttyper."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Avanserte innstillinger"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Forhåndsvisningsbegrensninger"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus på tekst og bilder"
|
||||
text = "Dette arbeidsområdet fokuserer på å redigere tekst og reposisjonere innebygde bilder. Kompleks sidegrafikk, skjemawidgets og lagdelte grafikk bevares for eksport, men er ikke fullt redigerbare her."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Forhåndsvisningsavvik"
|
||||
text = "Noen visuelle elementer (som tabellkanter, former eller hvordan annotasjoner vises) kan avvike i forhåndsvisningen. Den eksporterte PDF-en beholder de opprinnelige tegnekommandoene der det er mulig."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Alpha-visning"
|
||||
text = "Denne alpha-visningen er fortsatt under utvikling—visse skrifter, farger, gjennomsiktighetseffekter og layoutdetaljer kan endres litt. Dobbeltsjekk generert PDF før du deler."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Slå sammen valgte bokser"
|
||||
merge = "Slå sammen utvalg"
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultater for Legg til tekst"
|
||||
|
||||
[addText.error]
|
||||
failed = "Det oppsto en feil da tekst skulle legges til i PDF-en."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Last opp fra mobil"
|
||||
description = "Skann for å laste opp bilder. Bilder konverteres automatisk til PDF."
|
||||
descriptionNoConvert = "Skann for å laste opp bilder fra mobilenheten din."
|
||||
error = "Tilkoblingsfeil"
|
||||
pollingError = "Feil ved kontroll av filer"
|
||||
sessionId = "Økt-ID"
|
||||
sessionCreateError = "Kunne ikke opprette økt"
|
||||
expiryWarning = "Økten utløper snart"
|
||||
expiryWarningMessage = "Denne QR-koden utløper om {{seconds}} sekunder. En ny kode genereres automatisk."
|
||||
filesReceived = "{{count}} fil(er) mottatt"
|
||||
connected = "Mobilenhet tilkoblet"
|
||||
instructions = "Skann med telefonkameraet ditt. Bilder konverteres automatisk til PDF."
|
||||
instructionsNoConvert = "Skann med telefonkameraet for å laste opp filer."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Mobilskanner"
|
||||
noSession = "Ugyldig økt"
|
||||
noSessionMessage = "Vennligst skann en gyldig QR-kode for å få tilgang til denne siden."
|
||||
validating = "Validerer økt..."
|
||||
sessionInvalid = "Øktfeil"
|
||||
sessionExpired = "Denne økten er utløpt. Oppdater og prøv igjen."
|
||||
sessionNotFound = "Økt ikke funnet. Oppdater og prøv igjen."
|
||||
sessionValidationError = "Kan ikke verifisere økten. Prøv igjen."
|
||||
uploadSuccess = "Opplasting vellykket!"
|
||||
uploadSuccessMessage = "Bildene dine er overført."
|
||||
httpsRequired = "Kameratilgang krever HTTPS eller localhost. Bruk HTTPS eller få tilgang via localhost."
|
||||
uploadFailed = "Opplasting mislyktes. Prøv igjen."
|
||||
uploading = "Laster opp..."
|
||||
connected = "Tilkoblet"
|
||||
connecting = "Kobler til..."
|
||||
chooseMethod = "Velg opplastingsmetode"
|
||||
chooseMethodDescription = "Velg hvordan du vil skanne og laste opp dokumenter"
|
||||
camera = "Kamera"
|
||||
cameraDescription = "Skann dokumenter med enhetens kamera med automatisk kantgjenkjenning"
|
||||
fileUpload = "Filopplasting"
|
||||
fileDescription = "Last opp eksisterende bilder eller dokumenter fra enheten din"
|
||||
cameraAccessDenied = "Kameratilgang nektet. Aktiver kameratilgang."
|
||||
back = "Tilbake"
|
||||
settings = "Innstillinger"
|
||||
edgeDetection = "Kantgjenkjenning"
|
||||
flashlight = "Lommelykt"
|
||||
flash = "Blits"
|
||||
processing = "Behandler..."
|
||||
capture = "Ta bilde"
|
||||
selectFilesPrompt = "Velg filer som skal lastes opp"
|
||||
selectImage = "Velg bilde"
|
||||
preview = "Forhåndsvis"
|
||||
retake = "Ta på nytt"
|
||||
addToBatch = "Legg til i bunt"
|
||||
upload = "Last opp"
|
||||
batchImages = "Bunt"
|
||||
clearBatch = "Tøm"
|
||||
uploadAll = "Last opp alt"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Masz niezapisane zmiany w swoim PDF."
|
||||
pendingRedactionsTitle = "Niezastosowane zaczernienia"
|
||||
pendingRedactions = "Masz niezastosowane zaczernienia, które zostaną utracone."
|
||||
areYouSure = "Na pewno chcesz wyjść?"
|
||||
unsavedChangesTitle = "Niezapisane zmiany"
|
||||
keepWorking = "Kontynuuj pracę"
|
||||
discardChanges = "Odrzuć i wyjdź"
|
||||
discardRedactions = "Odrzuć i wyjdź"
|
||||
applyAndContinue = "Zapisz i wyjdź"
|
||||
exportAndContinue = "Eksportuj i kontynuuj"
|
||||
cancel = "Anuluj"
|
||||
@@ -134,7 +131,7 @@ unsupported = "Nieobsługiwane"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Wybierz narzędzie, aby zacząć"
|
||||
alpha = "Alpha"
|
||||
alpha = "Alfa"
|
||||
premiumFeature = "Funkcja premium:"
|
||||
comingSoon = "Wkrótce:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Zaawansowane"
|
||||
edit = "Podgląd i edycja"
|
||||
popular = "Popularne"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferencje"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Zaawansowane"
|
||||
title = "Bezpieczeństwo i uwierzytelnianie"
|
||||
security = "Bezpieczeństwo"
|
||||
connections = "Połączenia"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licencje i analityka"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Bieżąca wersja"
|
||||
latestVersion = "Najnowsza wersja"
|
||||
checkForUpdates = "Sprawdź aktualizacje"
|
||||
viewDetails = "Pokaż szczegóły"
|
||||
serverNeedsUpdate = "Serwer wymaga aktualizacji przez administratora"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informacje o wersji"
|
||||
description = "Szczegóły wersji aplikacji desktopowej i serwera"
|
||||
desktop = "Wersja desktopowa"
|
||||
server = "Wersja serwera"
|
||||
|
||||
[settings.security]
|
||||
title = "Bezpieczeństwo"
|
||||
description = "Zmień hasło, aby zachować bezpieczeństwo konta."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Zmień swoje hasło. Zostaniesz wylogowany po aktualizacji."
|
||||
required = "Wszystkie pola są wymagane."
|
||||
mismatch = "Nowe hasła nie są takie same."
|
||||
error = "Nie można zaktualizować hasła. Zweryfikuj obecne hasło i spróbuj ponownie."
|
||||
success = "Hasło pomyślnie zaktualizowano. Zaloguj się ponownie."
|
||||
ssoDisabled = "Zmiany hasła są zarządzane przez dostawcę tożsamości."
|
||||
current = "Bieżące hasło"
|
||||
currentPlaceholder = "Wpisz bieżące hasło"
|
||||
new = "Nowe hasło"
|
||||
newPlaceholder = "Wpisz nowe hasło"
|
||||
confirm = "Potwierdź nowe hasło"
|
||||
confirmPlaceholder = "Wpisz ponownie nowe hasło"
|
||||
update = "Zaktualizuj hasło"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Skróty klawiaturowe"
|
||||
@@ -522,16 +488,11 @@ low = "Niski"
|
||||
title = "Zmień dane logowania"
|
||||
header = "Zmień dane konta"
|
||||
changePassword = "Musisz zmienić domyślne dane logowania"
|
||||
ssoManaged = "Twoje konto jest zarządzane przez dostawcę tożsamości."
|
||||
newUsername = "Nowa nazwa użytkownika"
|
||||
oldPassword = "Obecne hasło"
|
||||
newPassword = "Nowe hasło"
|
||||
confirmNewPassword = "Potwierdź obecne hasło"
|
||||
submit = "Zapisz zmiany"
|
||||
credsUpdated = "Konto zaktualizowane"
|
||||
description = "Zmiany zapisane. Zaloguj się ponownie."
|
||||
error = "Nie można zaktualizować nazwy użytkownika. Zweryfikuj hasło i spróbuj ponownie."
|
||||
changeUsername = "Zaktualizuj nazwę użytkownika. Zostaniesz wylogowany po aktualizacji."
|
||||
|
||||
[account]
|
||||
title = "Ustawienia konta"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Ustawienia konta"
|
||||
adminSettings = "Admin - kontrola kont"
|
||||
userControlSettings = "Kontrola praw użytkownika"
|
||||
changeUsername = "Zmień nazwę użytkownika"
|
||||
changeUsernameDescription = "Zaktualizuj nazwę użytkownika. Zostaniesz wylogowany po aktualizacji."
|
||||
newUsernamePlaceholder = "Wpisz nową nazwę użytkownika"
|
||||
newUsername = "Nowa nazwa użytkownika"
|
||||
password = "Potwierdź hasło"
|
||||
oldPassword = "Poprzednie hasło"
|
||||
@@ -609,7 +568,7 @@ loading = "Ładowanie..."
|
||||
failedToLoad = "Nie udało się załadować danych punktów końcowych. Spróbuj odświeżyć."
|
||||
home = "Strona główna"
|
||||
login = "Logowanie"
|
||||
top = "Top"
|
||||
top = "Najlepsze"
|
||||
numberOfVisits = "Liczba wizyt"
|
||||
visitsTooltip = "Wizyty: {0} ({1}% całości)"
|
||||
retry = "Spróbuj ponownie"
|
||||
@@ -749,11 +708,6 @@ tags = "podpis,autograf"
|
||||
title = "Podpis"
|
||||
desc = "Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu"
|
||||
|
||||
[home.annotate]
|
||||
tags = "adnotuj,podświetlaj,rysuj"
|
||||
title = "Adnotuj"
|
||||
desc = "Podświetlaj, rysuj, dodawaj notatki i kształty w przeglądarce"
|
||||
|
||||
[home.flatten]
|
||||
tags = "spłaszcz,usuń,interaktywne"
|
||||
title = "Spłaszcz"
|
||||
@@ -965,7 +919,7 @@ title = "Nałóż PDFa"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Edytor tekstu PDF"
|
||||
desc = "Przeglądaj i edytuj eksporty JSON z Stirling PDF z grupową edycją tekstu i ponowną generacją PDF"
|
||||
desc = "Edytuj istniejący tekst i obrazy w plikach PDF"
|
||||
|
||||
[home.addText]
|
||||
tags = "tekst,adnotacja,etykieta"
|
||||
@@ -976,7 +930,6 @@ desc = "Dodaj własny tekst w dowolnym miejscu w PDF"
|
||||
addFiles = "Dodaj pliki"
|
||||
uploadFromComputer = "Prześlij z komputera"
|
||||
openFromComputer = "Otwórz z komputera"
|
||||
mobileUpload = "Prześlij z telefonu"
|
||||
|
||||
[viewPdf]
|
||||
tags = "wyświetl,czytaj,adnotuj,tekst,obraz"
|
||||
@@ -1272,7 +1225,7 @@ odtExt = "Tekst OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Prezentacja OpenDocument (.odp)"
|
||||
txtExt = "Tekst niesformatowany (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Format RTF (.rtf)"
|
||||
selectedFiles = "Wybrane pliki"
|
||||
noFileSelected = "Nie wybrano pliku. Użyj panelu plików, aby dodać pliki."
|
||||
convertFiles = "Konwertuj pliki"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opcje CBZ do PDF"
|
||||
optimizeForEbook = "Optymalizuj PDF dla czytników e-booków (używa Ghostscript)"
|
||||
cbzOutputOptions = "Opcje PDF do CBZ"
|
||||
cbzDpi = "DPI renderowania obrazu"
|
||||
cbrOptions = "Opcje CBR"
|
||||
cbrOutputOptions = "Opcje konwersji PDF do CBR"
|
||||
cbrDpi = "DPI renderowania obrazu"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opcje konwersji eBook do PDF"
|
||||
ebookOptionsDesc = "Opcje konwersji eBooków do PDF"
|
||||
embedAllFonts = "Osadź wszystkie czcionki"
|
||||
embedAllFontsDesc = "Osadź wszystkie czcionki z eBooka w generowanym PDF"
|
||||
includeTableOfContents = "Dołącz spis treści"
|
||||
includeTableOfContentsDesc = "Dodaj wygenerowany spis treści do wynikowego PDF"
|
||||
includePageNumbers = "Dodaj numery stron"
|
||||
includePageNumbersDesc = "Dodaj numery stron do generowanego PDF"
|
||||
optimizeForEbookPdf = "Optymalizuj dla czytników eBooków"
|
||||
optimizeForEbookPdfDesc = "Optymalizuj PDF do czytania na eBookach (mniejszy rozmiar pliku, lepsze renderowanie na urządzeniach eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opcje konwersji PDF do eBook"
|
||||
epubOptionsDesc = "Opcje konwersji PDF do EPUB/AZW3"
|
||||
detectChapters = "Wykrywaj rozdziały"
|
||||
detectChaptersDesc = "Wykrywaj nagłówki wyglądające jak rozdziały i wstawiaj podziały stron EPUB"
|
||||
targetDevice = "Urządzenie docelowe"
|
||||
targetDeviceDesc = "Wybierz profil wyjściowy zoptymalizowany dla urządzenia czytnika"
|
||||
outputFormat = "Format wyjściowy"
|
||||
outputFormatDesc = "Wybierz format wyjściowy dla eBooka"
|
||||
tabletPhone = "Tablet/Telefon (z obrazami)"
|
||||
kindleEink = "Kindle e-Ink (tekst zoptymalizowany)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "konwersja,img,jpg,obraz,zdjęcie"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Dodaj załącznik"
|
||||
remove = "Usuń załącznik"
|
||||
embed = "Osadź załącznik"
|
||||
convertToPdfA3b = "Konwertuj do PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Tworzy archiwalny PDF z osadzonymi załącznikami"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b to format archiwalny zapewniający długoterminową archiwizację. Umożliwia osadzanie dowolnych formatów plików jako załączników. Konwersja wymaga Ghostscript i może potrwać dłużej dla dużych plików."
|
||||
convertToPdfA3bTooltipHeader = "O konwersji PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Co robi"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Zapisane"
|
||||
label = "Prześlij obraz podpisu"
|
||||
placeholder = "Wybierz plik obrazu"
|
||||
hint = "Prześlij obraz podpisu w formacie PNG lub JPG"
|
||||
removeBackground = "Usuń białe tło (uczyń przezroczystym)"
|
||||
processing = "Przetwarzanie obrazu..."
|
||||
backgroundRemovalFailedTitle = "Nie udało się usunąć tła"
|
||||
backgroundRemovalFailedMessage = "Nie można usunąć tła z obrazu. Użyto oryginalnego obrazu."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Jak dodać podpis"
|
||||
@@ -2434,11 +2351,6 @@ note = "Spłaszczanie usuwa elementy interaktywne z PDF, czyniąc je nieedytowal
|
||||
label = "Spłaszcz tylko formularze"
|
||||
desc = "Spłaszczaj tylko pola formularzy, pozostawiając inne elementy interaktywne bez zmian"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI renderowania (opcjonalnie, zalecane 150 DPI)"
|
||||
help = "Pozostaw puste, aby użyć domyślnych ustawień systemu. Wyższe DPI wyostrza wynik, ale zwiększa czas przetwarzania i rozmiar pliku."
|
||||
placeholder = "np. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Wyniki spłaszczania"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Przytnij dokument PDF"
|
||||
submit = "Wyślij"
|
||||
noFileSelected = "Wybierz plik PDF, aby rozpocząć przycinanie"
|
||||
reset = "Resetuj do pełnego PDF"
|
||||
autoCrop = "Automatycznie przytnij białe obszary"
|
||||
|
||||
[crop.preview]
|
||||
title = "Wybór obszaru przycięcia"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metoda redakcji"
|
||||
mode = "Tryb"
|
||||
automatic = "Automatyczna"
|
||||
automaticDesc = "Redaguj tekst na podstawie wyszukiwanych haseł"
|
||||
automaticDisabledTooltip = "Wybierz pliki w menedżerze plików, aby zaczernić wiele plików naraz"
|
||||
manual = "Ręczna"
|
||||
manualDesc = "Kliknij i przeciągnij, aby zredagować określone obszary"
|
||||
manualComingSoon = "Ręczna redakcja wkrótce"
|
||||
@@ -3315,35 +3225,8 @@ text = "Dopasowuj wyłącznie pełne słowa, bez częściowych trafień. 'John'
|
||||
title = "Konwertuj do PDF-Image"
|
||||
text = "Konwertuje PDF do PDF opartego na obrazie po redakcji. Zapewnia to całkowite usunięcie i brak możliwości odzyskania tekstu pod polami redakcji."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Ręczne narzędzia zaczerniania"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Narzędzie zaznaczania tekstu"
|
||||
text = "Zaznaczaj tekst bezpośrednio w PDF, aby oznaczyć go do zaczernienia. Kliknij i przeciągnij, aby podświetlić konkretny tekst, który chcesz zaczernić."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Narzędzie zaznaczania obszaru"
|
||||
text = "Rysuj prostokątne obszary w PDF, aby oznaczać regiony do zaczernienia. Przydatne do zaczerniania obrazów, podpisów lub nieregularnych kształtów."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Zastosuj zaczernienia"
|
||||
text = "Po oznaczeniu treści kliknij „Zastosuj”, aby trwale zaczernić wszystkie zaznaczone obszary. Licznik oczekujących pokazuje, ile zaczernień jest gotowych do zastosowania."
|
||||
bullet1 = "Oznacz tyle obszarów, ile potrzeba, przed zastosowaniem"
|
||||
bullet2 = "Wszystkie oczekujące zaczernienia są stosowane jednocześnie"
|
||||
bullet3 = "Zaczernienia nie można cofnąć po zastosowaniu"
|
||||
|
||||
[redact.manual]
|
||||
title = "Narzędzia zaczerniania"
|
||||
instructions = "Zaznacz tekst lub narysuj obszary w PDF, aby oznaczyć zawartość do zaczernienia."
|
||||
markText = "Zaznacz tekst"
|
||||
markArea = "Zaznacz obszar"
|
||||
pendingLabel = "Oczekujące:"
|
||||
applyWarning = "⚠️ Zastosowanie jest trwałe, nie można cofnąć, a dane pod spodem zostaną usunięte"
|
||||
apply = "Zastosuj"
|
||||
noMarks = "Brak oznaczeń zaczernienia. Użyj powyższych narzędzi, aby oznaczyć zawartość do zaczernienia."
|
||||
header = "Ręczna redakcja"
|
||||
controlsTitle = "Ręczne narzędzia zaczerniania"
|
||||
textBasedRedaction = "Redakcja oparta na tekście"
|
||||
pageBasedRedaction = "Redakcja na poziomie stron"
|
||||
convertPDFToImageLabel = "Konwertuj PDF do PDF-Image (używane do usunięcia tekstu pod polem)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Podaj ilość podziałów pionowych"
|
||||
label = "Podział poziomy"
|
||||
placeholder = "Podaj ilość podziałów poziomych"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Tryb dzielenia"
|
||||
description = "Wybierz, jak podzielić strony"
|
||||
splitAll = "Podziel wszystkie strony"
|
||||
splitAllExceptFirst = "Podziel wszystkie oprócz pierwszej"
|
||||
splitAllExceptLast = "Podziel wszystkie oprócz ostatniej"
|
||||
splitAllExceptFirstAndLast = "Podziel wszystkie oprócz pierwszej i ostatniej"
|
||||
custom = "Własne strony"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Niestandardowe numery stron"
|
||||
placeholder = "np. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Stempel, dodawanie obrazu, wyśrodkowanie obrazu, znak wodny, PDF, osadzanie, dostosowywanie"
|
||||
header = "Pieczęć PDF"
|
||||
@@ -3767,7 +3637,7 @@ title = "PDF do pojedyńczej strony"
|
||||
header = "PDF do pojedyńczej strony"
|
||||
submit = "Zapisz dokument jako PDF z jedną stroną"
|
||||
description = "To narzędzie scali wszystkie strony Twojego PDF w jedną dużą stronę. Szerokość pozostanie taka jak w oryginalnych stronach, a wysokość będzie sumą wysokości wszystkich stron."
|
||||
filenamePrefix = "single_page"
|
||||
filenamePrefix = "pojedyncza_strona"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Wybierz plik PDF w widoku głównym, aby rozpocząć"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Rozmiar pliku"
|
||||
[compress.grayscale]
|
||||
label = "Zastosuj skalę szarości do kompresji"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearyzuj PDF dla szybkiego przeglądania w sieci"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Konwertuj obrazy na grafikę liniową"
|
||||
description = "Używa ImageMagick do redukcji stron do czarno-białych o wysokim kontraście w celu maksymalnego zmniejszenia rozmiaru."
|
||||
unavailable = "ImageMagick nie jest zainstalowany ani włączony na tym serwerze"
|
||||
detailLevel = "Poziom szczegółów"
|
||||
edgeEmphasis = "Wzmocnienie krawędzi"
|
||||
edgeLow = "Łagodne"
|
||||
edgeMedium = "Zrównoważone"
|
||||
edgeHigh = "Silne"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Przegląd ustawień kompresji"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Wyższe wartości zmniejszają rozmiar pliku"
|
||||
title = "Skala szarości"
|
||||
text = "Zaznacz tę opcję, aby przekonwertować wszystkie obrazy na czarno‑białe, co może znacząco zmniejszyć rozmiar pliku, zwłaszcza dla skanów PDF lub dokumentów z wieloma obrazami."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Grafika liniowa"
|
||||
text = "Konwertuj strony do czarno-białych o wysokim kontraście za pomocą ImageMagick. Użyj poziomu szczegółów, aby kontrolować, jak dużo treści stanie się czarna, oraz wzmocnienia krawędzi, aby określić agresywność wykrywania krawędzi."
|
||||
|
||||
[compress.error]
|
||||
failed = "Wystąpił błąd podczas kompresowania PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Wystąpił błąd podczas kompresowania PDF."
|
||||
_value = "Ustawienia kompresji"
|
||||
1 = "1-3 kompresja PDF,</br> 4-6 lekka kompresja obrazów,</br> 7-9 intensywna kompresja obrazów </br> Znacznie obniży jakość obrazu"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Niższe wartości zachowują jakość, ale skutkują większymi plikami"
|
||||
range4to6 = "Średnia kompresja z umiarkowaną utratą jakości"
|
||||
range7to9 = "Wyższe wartości znacznie zmniejszają rozmiar pliku, ale mogą zmniejszyć klarowność obrazu"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Ten plik jest chroniony hasłem. Wprowadź hasło:"
|
||||
cancelled = "Operacja anulowana dla PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Usuń wybrane strony"
|
||||
closePdf = "Zamknij PDF"
|
||||
exportAll = "Eksportuj PDF"
|
||||
downloadSelected = "Pobierz wybrane pliki"
|
||||
annotations = "Adnotacje"
|
||||
exportSelected = "Eksportuj wybrane strony"
|
||||
saveChanges = "Zapisz zmiany"
|
||||
downloadAll = "Pobierz wszystko"
|
||||
saveAll = "Zapisz wszystko"
|
||||
toggleTheme = "Przełącz motyw"
|
||||
toggleBookmarks = "Przełącz zakładki"
|
||||
language = "Język"
|
||||
toggleAnnotations = "Przełącz widoczność adnotacji"
|
||||
search = "Szukaj w PDF"
|
||||
panMode = "Tryb przesuwania"
|
||||
applyRedactionsFirst = "Najpierw zastosuj zaczernienia"
|
||||
rotateLeft = "Obróć w lewo"
|
||||
rotateRight = "Obróć w prawo"
|
||||
toggleSidebar = "Przełącz panel boczny"
|
||||
toggleBookmarks = "Przełącz zakładki"
|
||||
exportSelected = "Eksportuj wybrane strony"
|
||||
toggleAnnotations = "Przełącz widoczność adnotacji"
|
||||
annotationMode = "Przełącz tryb adnotacji"
|
||||
print = "Drukuj PDF"
|
||||
draw = "Rysuj"
|
||||
redact = "Zaczernij"
|
||||
exitRedaction = "Wyjdź z trybu zaczerniania"
|
||||
save = "Zapisz"
|
||||
downloadAll = "Pobierz wszystko"
|
||||
saveAll = "Zapisz wszystko"
|
||||
|
||||
[textAlign]
|
||||
left = "Do lewej"
|
||||
center = "Do środka"
|
||||
right = "Do prawej"
|
||||
|
||||
[annotation]
|
||||
title = "Adnotuj"
|
||||
desc = "Używaj podświetlania, pióra, tekstu i notatek. Zmiany są na żywo — bez potrzeby spłaszczania."
|
||||
highlight = "Podświetl"
|
||||
pen = "Pióro"
|
||||
text = "Pole tekstowe"
|
||||
note = "Notatka"
|
||||
rectangle = "Prostokąt"
|
||||
ellipse = "Elipsa"
|
||||
select = "Zaznacz"
|
||||
exit = "Wyjdź z trybu adnotacji"
|
||||
strokeWidth = "Szerokość"
|
||||
opacity = "Przezroczystość"
|
||||
strokeOpacity = "Przezroczystość obrysu"
|
||||
fillOpacity = "Przezroczystość wypełnienia"
|
||||
fontSize = "Rozmiar czcionki"
|
||||
chooseColor = "Wybierz kolor"
|
||||
color = "Kolor"
|
||||
strokeColor = "Kolor obrysu"
|
||||
fillColor = "Kolor wypełnienia"
|
||||
underline = "Podkreślenie"
|
||||
strikeout = "Przekreślenie"
|
||||
squiggly = "Faliste podkreślenie"
|
||||
inkHighlighter = "Podświetlacz odręczny"
|
||||
freehandHighlighter = "Podświetlacz odręczny"
|
||||
square = "Kwadrat"
|
||||
circle = "Okrąg"
|
||||
polygon = "Wielokąt"
|
||||
line = "Linia"
|
||||
stamp = "Dodaj obraz"
|
||||
textMarkup = "Oznaczenia tekstu"
|
||||
drawing = "Rysowanie"
|
||||
shapes = "Kształty"
|
||||
notesStamps = "Notatki i stemple"
|
||||
settings = "Ustawienia"
|
||||
borderOn = "Obramowanie: włączone"
|
||||
borderOff = "Obramowanie: wyłączone"
|
||||
editInk = "Edytuj pióro"
|
||||
editLine = "Edytuj linię"
|
||||
editNote = "Edytuj notatkę"
|
||||
editText = "Edytuj pole tekstowe"
|
||||
editTextMarkup = "Edytuj oznaczenie tekstu"
|
||||
editSelected = "Edytuj adnotację"
|
||||
editSquare = "Edytuj kwadrat"
|
||||
editCircle = "Edytuj okrąg"
|
||||
editPolygon = "Edytuj wielokąt"
|
||||
unsupportedType = "Ten typ adnotacji nie jest w pełni obsługiwany do edycji."
|
||||
textAlignment = "Wyrównanie tekstu"
|
||||
noteIcon = "Ikona notatki"
|
||||
imagePreview = "Podgląd"
|
||||
contents = "Tekst"
|
||||
backgroundColor = "Kolor tła"
|
||||
clearBackground = "Usuń tło"
|
||||
noBackground = "Brak tła"
|
||||
stampSettings = "Ustawienia stempla"
|
||||
savingCopy = "Przygotowywanie pobierania..."
|
||||
saveFailed = "Nie można zapisać kopii"
|
||||
saveReady = "Pobieranie gotowe"
|
||||
selectAndMove = "Zaznacz i edytuj"
|
||||
editSelectDescription = "Kliknij istniejącą adnotację, aby edytować jej kolor, przezroczystość, tekst lub rozmiar."
|
||||
editStampHint = "Aby zmienić obraz, usuń ten stempel i dodaj nowy."
|
||||
editSwitchToSelect = "Przełącz na Zaznacz i Edytuj, aby edytować tę adnotację."
|
||||
undo = "Cofnij"
|
||||
redo = "Ponów"
|
||||
applyChanges = "Zastosuj zmiany"
|
||||
saveChanges = "Zapisz zmiany"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Ustaw."
|
||||
adminSettings = "Ustaw. admina"
|
||||
allTools = "All Tools"
|
||||
reader = "Czytnik"
|
||||
tours = "Przewodniki"
|
||||
showMeAround = "Pokaż mi, jak to działa"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Obejrzyj tutaj: przegląd narzędzi, przewodnik po nowym układzie V2 i przewodnik administratora."
|
||||
user = "Obejrzyj tutaj: przegląd narzędzi i przewodnik po nowym układzie V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Przegląd narzędzi"
|
||||
toolsTourDesc = "Dowiedz się, co potrafią narzędzia"
|
||||
adminTour = "Przewodnik administratora"
|
||||
adminTourDesc = "Poznaj ustawienia i funkcje administratora"
|
||||
whatsNewTour = "Zobacz, co nowego w V2"
|
||||
whatsNewTourDesc = "Przejdź przez zaktualizowany układ"
|
||||
|
||||
[admin]
|
||||
error = "Błąd"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Nie udało się wczytać ustawień"
|
||||
saveError = "Nie udało się zapisać ustawień"
|
||||
saved = "Ustawienia zapisano pomyślnie"
|
||||
saveSuccess = "Ustawienia zapisano pomyślnie"
|
||||
success = "Pomyślnie zapisano ustawienia"
|
||||
error = "Nie udało się zapisać ustawień"
|
||||
save = "Zapisz zmiany"
|
||||
discard = "Odrzuć"
|
||||
restartRequired = "Wymagane ponowne uruchomienie"
|
||||
@@ -4422,13 +4185,6 @@ description = "Ścieżka do pliku wykonywalnego WeasyPrint dla konwersji HTML do
|
||||
label = "Plik wykonywalny Unoconvert"
|
||||
description = "Ścieżka do LibreOffice unoconvert do konwersji dokumentów (pozostaw puste, aby użyć domyślnej: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "Adres URL frontendu"
|
||||
description = "Bazowy adres URL frontendu (np. https://pdf.example.com). Używany dla linków w zaproszeniach e-mail i mobilnych przesłań przez kod QR. Pozostaw puste, aby użyć adresu URL backendu."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Kliknij, aby zobaczyć szczegóły planu"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Bezpieczeństwo"
|
||||
description = "Skonfiguruj uwierzytelnianie, zachowanie logowania i polityki bezpieczeństwa."
|
||||
@@ -4505,7 +4261,7 @@ description = "Śledź działania użytkowników i zdarzenia systemowe na potrze
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Poziom audytu"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=WYŁ., 1=PODSTAWOWY, 2=STANDARDOWY, 3=SZCZEGÓŁOWY"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Przechowywanie audytu (dni)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Połącz"
|
||||
disconnect = "Odłącz"
|
||||
disconnected = "Pomyślnie odłączono dostawcę"
|
||||
disconnectError = "Nie udało się odłączyć dostawcy"
|
||||
mobileScannerConvertToPdf = "Konwertuj obrazy do PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatycznie konwertuj przesłane obrazy do formatu PDF. Jeśli wyłączone, obrazy zostaną pozostawione bez zmian."
|
||||
mobileScannerImageResolution = "Rozdzielczość obrazu"
|
||||
mobileScannerImageResolutionDesc = "Rozdzielczość przesyłanych obrazów. „Zredukowana” skaluje obrazy do maks. 1200 px, aby zmniejszyć rozmiar pliku."
|
||||
imageResolutionFull = "Pełna (oryginalny rozmiar)"
|
||||
imageResolutionReduced = "Zredukowana (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Format strony"
|
||||
mobileScannerPageFormatDesc = "Rozmiar strony PDF dla skonwertowanych obrazów. „Zachowaj” używa oryginalnych wymiarów obrazu."
|
||||
pageFormatKeep = "Zachowaj (oryginalne wymiary)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 in)"
|
||||
mobileScannerStretchToFit = "Rozciągnij do dopasowania"
|
||||
mobileScannerStretchToFitDesc = "Rozciągnij obrazy, aby wypełnić całą stronę. Jeśli wyłączone, obrazy są wyśrodkowane z zachowaniem proporcji."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Automatyczne logowanie SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Automatycznie twórz konta użytkowników przy pierwszym logowani
|
||||
label = "Blokuj rejestrację"
|
||||
description = "Zablokuj rejestrację nowych użytkowników przez SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Przesyłanie z telefonu"
|
||||
enable = "Włącz przesyłanie kodem QR"
|
||||
description = "Pozwól użytkownikom przesyłać pliki z urządzeń mobilnych poprzez skanowanie kodu QR"
|
||||
note = "Uwaga: Wymaga skonfigurowanego adresu URL frontendu. "
|
||||
link = "Skonfiguruj w Ustawieniach systemu"
|
||||
mobileScannerConvertToPdf = "Konwertuj obrazy do PDF"
|
||||
mobileScannerConvertToPdfDesc = "Automatycznie konwertuj przesłane obrazy do formatu PDF. Jeśli wyłączone, obrazy zostaną pozostawione bez zmian."
|
||||
mobileScannerImageResolution = "Rozdzielczość obrazu"
|
||||
mobileScannerImageResolutionDesc = "Rozdzielczość przesyłanych obrazów. „Zredukowana” skaluje obrazy do maks. 1200 px, aby zmniejszyć rozmiar pliku."
|
||||
imageResolutionFull = "Pełna (oryginalny rozmiar)"
|
||||
imageResolutionReduced = "Zredukowana (maks. 1200 px)"
|
||||
mobileScannerPageFormat = "Format strony"
|
||||
mobileScannerPageFormatDesc = "Rozmiar strony PDF dla skonwertowanych obrazów. „Zachowaj” używa oryginalnych wymiarów obrazu."
|
||||
pageFormatKeep = "Zachowaj (oryginalne wymiary)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Letter (8,5×11 in)"
|
||||
mobileScannerStretchToFit = "Rozciągnij do dopasowania"
|
||||
mobileScannerStretchToFitDesc = "Rozciągnij obrazy, aby wypełnić całą stronę. Jeśli wyłączone, obrazy są wyśrodkowane z zachowaniem proporcji."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot Telegram"
|
||||
description = "Skonfiguruj łączność bota Telegram, kontrolę dostępu i zachowanie komunikatów zwrotnych."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Włącz bota Telegram"
|
||||
description = "Pozwól użytkownikom korzystać ze Stirling PDF przez skonfigurowanego bota Telegram."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nazwa użytkownika bota"
|
||||
description = "Publiczna nazwa użytkownika twojego bota Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token bota"
|
||||
description = "Token API dostarczony przez BotFather dla twojego bota Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Folder skrzynki odbiorczej"
|
||||
description = "Folder w katalogu pipeline, w którym przechowywane są przychodzące pliki z Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Użyj niestandardowego sufiksu folderu"
|
||||
description = "Dołącz ID czatu do folderów plików przychodzących, aby izolować przesyłania na czat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Kontrola dostępu"
|
||||
description = "Ogranicz, którzy użytkownicy lub kanały mogą wchodzić w interakcję z botem."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Zezwalaj na określone ID użytkowników"
|
||||
description = "Po włączeniu tylko wymienione ID użytkowników mogą używać bota."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "Dozwolone ID użytkowników"
|
||||
description = "Wprowadź ID użytkowników Telegram, którzy mogą używać bota."
|
||||
placeholder = "Dodaj ID użytkownika i naciśnij Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Zezwalaj na określone ID kanałów"
|
||||
description = "Po włączeniu tylko wymienione ID kanałów mogą używać bota."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "Dozwolone ID kanałów"
|
||||
description = "Wprowadź ID kanałów Telegram dozwolonych do interakcji z botem."
|
||||
placeholder = "Dodaj ID kanału i naciśnij Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Przetwarzanie"
|
||||
description = "Kontroluj interwały odpytywania i limity czasu przetwarzania dla przesyłań z Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Limit przetwarzania (sekundy)"
|
||||
description = "Maksymalny czas oczekiwania na zadanie przetwarzania przed zgłoszeniem błędu."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interwał odpytywania (ms)"
|
||||
description = "Odstęp między sprawdzeniami nowych aktualizacji Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Komunikaty zwrotne"
|
||||
description = "Wybierz, kiedy bot powinien wysyłać informacje zwrotne do użytkowników i kanałów."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Włącz komunikaty zwrotne"
|
||||
description = "Kontroluj, czy bot w ogóle wysyła komunikaty zwrotne."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Zasady komunikatów dla kanałów"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Pokaż „Brak prawidłowego dokumentu” (Kanał)"
|
||||
description = "Wyłącz odpowiedź „brak prawidłowego dokumentu” dla przesłań kanałowych."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Pokaż błędy przetwarzania (Kanał)"
|
||||
description = "Wysyłaj komunikaty o błędach przetwarzania do kanałów."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Pokaż komunikaty o błędach (Kanał)"
|
||||
description = "Pokazuj szczegółowe komunikaty o błędach dla kanałów."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Zasady komunikatów dla użytkowników"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Pokaż „Brak prawidłowego dokumentu” (Użytkownik)"
|
||||
description = "Wyłącz odpowiedź „brak prawidłowego dokumentu” dla przesłań od użytkowników."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Pokaż błędy przetwarzania (Użytkownik)"
|
||||
description = "Wysyłaj komunikaty o błędach przetwarzania do użytkowników."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Pokaż komunikaty o błędach (Użytkownik)"
|
||||
description = "Pokazuj szczegółowe komunikaty o błędach dla użytkowników."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Baza danych"
|
||||
description = "Skonfiguruj niestandardowe ustawienia połączenia z bazą danych dla wdrożeń korporacyjnych."
|
||||
@@ -4943,10 +4570,6 @@ description = "Zezwól administratorom zapraszać użytkowników e-mailem z auto
|
||||
label = "URL frontendu"
|
||||
description = "Bazowy URL frontendu (np. https://pdf.example.com). Używany do generowania linków zaproszeń w e-mailach. Pozostaw puste, aby użyć URL backendu."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Uwaga: Wymaga skonfigurowanego adresu URL frontendu. "
|
||||
link = "Skonfiguruj w Ustawieniach systemu"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Dokumenty prawne"
|
||||
description = "Skonfiguruj linki do dokumentów i polityk prawnych."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Dysk"
|
||||
myFiles = "Moje pliki"
|
||||
noRecentFiles = "Nie znaleziono ostatnich plików"
|
||||
googleDriveNotAvailable = "Integracja z Google Drive niedostępna"
|
||||
mobileUpload = "Przesyłanie z telefonu"
|
||||
mobileShort = "Mobilne"
|
||||
mobileUploadNotAvailable = "Przesyłanie z telefonu nie jest włączone"
|
||||
downloadSelected = "Pobierz wybrane"
|
||||
saveSelected = "Zapisz wybrane"
|
||||
openFiles = "Otwórz pliki"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Wczytywanie..."
|
||||
back = "Wstecz"
|
||||
continue = "Kontynuuj"
|
||||
error = "Błąd"
|
||||
save = "Zapisz"
|
||||
|
||||
[config.overview]
|
||||
title = "Konfiguracja aplikacji"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Wszystkie aplikacje lub usługi obecnie używające tych kluczy przest
|
||||
confirmPrompt = "Czy na pewno chcesz kontynuować?"
|
||||
confirmCta = "Odśwież klucze"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Błąd klucza API"
|
||||
failedToCreateApiKey = "Nie udało się utworzyć klucza API."
|
||||
failedToRetrieveApiKey = "Nie udało się pobrać klucza API z odpowiedzi."
|
||||
failedToFetchApiKey = "Nie udało się pobrać klucza API."
|
||||
apiKeyRefreshed = "Odświeżono klucz API"
|
||||
apiKeyRefreshedBody = "Twój klucz API został pomyślnie odświeżony."
|
||||
failedToRefreshApiKey = "Nie udało się odświeżyć klucza API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Wybierz załączniki"
|
||||
info = "Wybierz pliki do dołączenia do PDF. Zostaną osadzone i dostępne w panelu załączników PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Zakończ"
|
||||
startTour = "Rozpocznij przewodnik"
|
||||
startTourDescription = "Przewodnik po kluczowych funkcjach Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Zacznij od panelu <strong>Szybki dostęp</strong>, aby przełączać się między Czytnikiem, Automatyzacją, plikami i wszystkimi przewodnikami."
|
||||
leftPanel = "Lewy panel <strong>Narzędzia</strong> zawiera wszystko, co możesz zrobić. Przeglądaj kategorie lub wyszukaj, aby szybko znaleźć narzędzie."
|
||||
fileUpload = "Użyj przycisku <strong>Pliki</strong>, aby przesłać lub wybrać ostatni PDF. Załadujemy przykład, aby pokazać obszar roboczy."
|
||||
rightRail = "<strong>Prawy panel</strong> zawiera szybkie akcje do wybierania plików, zmiany motywu lub języka oraz pobierania wyników."
|
||||
topBar = "Górny pasek pozwala przełączać się między <strong>Przeglądarką</strong>, <strong>Edytorem stron</strong> i <strong>Aktywnymi plikami</strong>."
|
||||
pageEditorView = "Przełącz na Edytor stron, aby zmieniać kolejność, obracać lub usuwać strony."
|
||||
activeFilesView = "Użyj Aktywnych plików, aby zobaczyć wszystko, co masz otwarte, i wybrać, nad czym pracować."
|
||||
wrapUp = "To wszystko, co nowe w V2. Otwórz menu <strong>Przewodniki</strong> w dowolnym momencie, aby odtworzyć ten, przegląd narzędzi lub przewodnik administratora."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Witamy w Stirling PDF!"
|
||||
description = "Chcesz odbyć krótką, minutową wycieczkę, aby poznać kluczowe funkcje i jak zacząć?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Pobierz →"
|
||||
showMeAround = "Pokaż, co nowego"
|
||||
skipTheTour = "Pomiń przewodnik"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Przegląd przewodnika"
|
||||
body = "Stirling PDF V2 zawiera dziesiątki narzędzi i odświeżony układ. Zrób szybki przegląd, aby zobaczyć, co się zmieniło i gdzie znaleźć potrzebne funkcje."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Pomiń na razie"
|
||||
seePlans = "Zobacz plany →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Ulepsz teraz →"
|
||||
freeTitle = "Licencja serwera"
|
||||
overLimitTitle = "Wymagana licencja serwera"
|
||||
overLimitBody = "Nasza licencja pozwala na maks. <strong>{{freeTierLimit}}</strong> użytkowników bez opłat na serwer. Masz <strong>{{overLimitUserCopy}}</strong> użytkowników Stirling. Aby kontynuować bez przerw, przejdź na plan Stirling Server – <strong>nielimitowane miejsca</strong>, edycja tekstu PDF i pełna kontrola administracyjna za 99 USD/serwer/mies."
|
||||
freeBody = "Nasza licencja <strong>Open-Core</strong> pozwala na maks. <strong>{{freeTierLimit}}</strong> użytkowników bez opłat na serwer. Aby skalować bez przerw i uzyskać wczesny dostęp do nowego <strong>narzędzia edycji tekstu PDF</strong>, polecamy plan Stirling Server – pełna edycja i <strong>nielimitowane miejsca</strong> za 99 USD/serwer/mies."
|
||||
freeBody = "Nasza licencja <strong>Open-Core</strong> pozwala na maksymalnie <strong>{{freeTierLimit}}</strong> użytkowników bezpłatnie na serwer. Aby skalować bez zakłóceń, zalecamy plan Stirling Server - <strong>nielimitowana liczba miejsc</strong> i <strong>obsługa SSO</strong> za $99/serwer/mies."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Pobierz"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Skontaktuj się ze sprzedażą"
|
||||
contactToUpgrade = "Skontaktuj się z nami, aby uaktualnić lub dostosować plan"
|
||||
maxUsers = "Maks. liczba użytkowników"
|
||||
upTo = "Do"
|
||||
getLicense = "Uzyskaj licencję serwera"
|
||||
upgradeToEnterprise = "Przejdź na Enterprise"
|
||||
selectPeriod = "Wybierz okres rozliczeniowy"
|
||||
monthlyBilling = "Rozliczenie miesięczne"
|
||||
yearlyBilling = "Rozliczenie roczne"
|
||||
checkoutOpened = "Otworzono stronę płatności"
|
||||
checkoutInstructions = "Dokończ zakup w karcie Stripe. Po płatności wróć tutaj i odśwież stronę, aby aktywować licencję. Otrzymasz także e-mail z kluczem licencyjnym."
|
||||
activateLicense = "Aktywuj licencję"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Strona płatności otwarta w nowej karcie"
|
||||
instructions = "Dokończ zakup w karcie Stripe. Po zakończeniu płatności otrzymasz e-mail z kluczem licencyjnym."
|
||||
enterKey = "Wpisz poniżej klucz licencyjny, aby aktywować plan:"
|
||||
keyDescription = "Wklej klucz licencyjny z e-maila"
|
||||
activate = "Aktywuj licencję"
|
||||
doLater = "Zrobię to później"
|
||||
success = "Licencja aktywowana!"
|
||||
successMessage = "Twoja licencja została pomyślnie aktywowana. Możesz zamknąć to okno."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Wymagana weryfikacja e-mail"
|
||||
message = "Musisz zweryfikować adres e-mail w portalu rozliczeń Stripe. Sprawdź wiadomość z linkiem logowania."
|
||||
|
||||
[plan.period]
|
||||
month = "miesiąc"
|
||||
@@ -6122,7 +5696,7 @@ emailInvalid = "Wpisz poprawny adres e‑mail"
|
||||
title = "Podaj e‑mail"
|
||||
description = "Użyjemy go do wysłania klucza licencyjnego i rachunków."
|
||||
emailLabel = "Adres e‑mail"
|
||||
emailPlaceholder = "your@email.com"
|
||||
emailPlaceholder = "twoj@email.com"
|
||||
continue = "Kontynuuj"
|
||||
modalTitle = "Zaczynamy – {{planName}}"
|
||||
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "System audytu niedostępny"
|
||||
notAvailableMessage = "System audytu nie jest skonfigurowany lub jest niedostępny."
|
||||
disabled = "Rejestrowanie audytu jest wyłączone"
|
||||
disabledMessage = "Włącz rejestrowanie audytu w konfiguracji aplikacji, aby śledzić zdarzenia systemowe."
|
||||
enterpriseRequired = "Wymagana licencja Enterprise"
|
||||
enterpriseRequiredMessage = "System rejestrowania zdarzeń to funkcja Enterprise. Uaktualnij do licencji Enterprise, aby uzyskać dostęp do dzienników i analityki."
|
||||
|
||||
[audit.error]
|
||||
title = "Błąd podczas ładowania systemu audytu"
|
||||
@@ -6370,7 +5942,6 @@ description = "Wpisz pełny URL własnego serwera Stirling PDF"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Wpisz URL serwera"
|
||||
invalidUrl = "Nieprawidłowy format URL. Wprowadź prawidłowy adres jak https://your-server.com"
|
||||
unreachable = "Nie można połączyć z serwerem"
|
||||
testFailed = "Test połączenia nie powiódł się"
|
||||
configFetch = "Nie udało się pobrać konfiguracji serwera. Sprawdź URL i spróbuj ponownie."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Łączenie z:"
|
||||
submit = "Zaloguj"
|
||||
signInWith = "Zaloguj przez"
|
||||
oauthPending = "Otwieranie przeglądarki do uwierzytelnienia..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Lub kontynuuj e‑mailem"
|
||||
serverRequirement = "Uwaga: Na serwerze musi być włączone logowanie."
|
||||
showInstructions = "Jak włączyć?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Strona akapitowa"
|
||||
sparse = "Rzadki tekst"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automatycznie"
|
||||
paragraph = "Akapit"
|
||||
singleLine = "Pojedyncza linia"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Resetuj zmiany"
|
||||
downloadJson = "Pobierz JSON"
|
||||
generatePdf = "Generuj PDF"
|
||||
saveChanges = "Zapisz zmiany"
|
||||
applyChanges = "Zastosuj zmiany"
|
||||
downloadCopy = "Pobierz kopię"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automatycznie skaluj tekst do pól"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Wskazówka: Przytrzymaj Ctrl (Cmd) lub Shift, aby zaznaczy
|
||||
title = "Zablokuj edytowany tekst do pojedynczego elementu PDF"
|
||||
description = "Po włączeniu edytor eksportuje każde edytowane pole tekstowe jako jeden element tekstowy PDF, aby uniknąć nakładających się glifów lub mieszanych czcionek."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Ustawienia zaawansowane"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Ograniczenia podglądu"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Fokus tekstu i obrazów"
|
||||
text = "To środowisko koncentruje się na edycji tekstu i przestawianiu osadzonych obrazów. Złożona grafika strony, kontrolki formularzy i warstwowa grafika są zachowane do eksportu, ale nie są tutaj w pełni edytowalne."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Różnice w podglądzie"
|
||||
text = "Niektóre elementy (takie jak obramowania tabel, kształty lub wygląd adnotacji) mogą nie wyświetlać się dokładnie w podglądzie. Eksportowany PDF zachowuje oryginalne polecenia rysowania, gdy to możliwe."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Wersja alfa przeglądarki"
|
||||
text = "Ten widok alfa wciąż się rozwija — niektóre czcionki, kolory, efekty przezroczystości i szczegóły układu mogą się nieznacznie zmieniać. Przed udostępnieniem prosimy o ponowne sprawdzenie wygenerowanego PDF."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Scal zaznaczone pola"
|
||||
merge = "Scal zaznaczenie"
|
||||
@@ -6614,58 +6164,3 @@ title = "Wyniki dodawania tekstu"
|
||||
|
||||
[addText.error]
|
||||
failed = "Wystąpił błąd podczas dodawania tekstu do PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Prześlij z telefonu"
|
||||
description = "Zeskanuj, aby przesłać zdjęcia. Obrazy są automatycznie konwertowane do PDF."
|
||||
descriptionNoConvert = "Zeskanuj, aby przesłać zdjęcia z urządzenia mobilnego."
|
||||
error = "Błąd połączenia"
|
||||
pollingError = "Błąd sprawdzania plików"
|
||||
sessionId = "ID sesji"
|
||||
sessionCreateError = "Nie udało się utworzyć sesji"
|
||||
expiryWarning = "Sesja wkrótce wygaśnie"
|
||||
expiryWarningMessage = "Ten QR wygaśnie za {{seconds}} sekund. Nowy kod zostanie wygenerowany automatycznie."
|
||||
filesReceived = "{{count}} plik(ów) odebrano"
|
||||
connected = "Urządzenie mobilne połączone"
|
||||
instructions = "Zeskanuj aparatem w telefonie. Obrazy konwertują się do PDF automatycznie."
|
||||
instructionsNoConvert = "Zeskanuj aparatem w telefonie, aby przesłać pliki."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Skaner mobilny"
|
||||
noSession = "Nieprawidłowa sesja"
|
||||
noSessionMessage = "Zeskanuj prawidłowy kod QR, aby uzyskać dostęp do tej strony."
|
||||
validating = "Weryfikowanie sesji..."
|
||||
sessionInvalid = "Błąd sesji"
|
||||
sessionExpired = "Ta sesja wygasła. Odśwież i spróbuj ponownie."
|
||||
sessionNotFound = "Nie znaleziono sesji. Odśwież i spróbuj ponownie."
|
||||
sessionValidationError = "Nie można zweryfikować sesji. Spróbuj ponownie."
|
||||
uploadSuccess = "Przesyłanie zakończone!"
|
||||
uploadSuccessMessage = "Twoje obrazy zostały przesłane."
|
||||
httpsRequired = "Dostęp do kamery wymaga HTTPS lub localhost. Użyj HTTPS lub uzyskaj dostęp przez localhost."
|
||||
uploadFailed = "Przesyłanie nie powiodło się. Spróbuj ponownie."
|
||||
uploading = "Przesyłanie..."
|
||||
connected = "Połączono"
|
||||
connecting = "Łączenie..."
|
||||
chooseMethod = "Wybierz metodę przesyłania"
|
||||
chooseMethodDescription = "Wybierz, jak chcesz zeskanować i przesłać dokumenty"
|
||||
camera = "Aparat"
|
||||
cameraDescription = "Skanuj dokumenty aparatem urządzenia z automatycznym wykrywaniem krawędzi"
|
||||
fileUpload = "Przesyłanie plików"
|
||||
fileDescription = "Prześlij istniejące zdjęcia lub dokumenty z urządzenia"
|
||||
cameraAccessDenied = "Dostęp do kamery zablokowany. Włącz dostęp do kamery."
|
||||
back = "Wstecz"
|
||||
settings = "Ustawienia"
|
||||
edgeDetection = "Wykrywanie krawędzi"
|
||||
flashlight = "Latarka"
|
||||
flash = "Lampa błyskowa"
|
||||
processing = "Przetwarzanie..."
|
||||
capture = "Zrób zdjęcie"
|
||||
selectFilesPrompt = "Wybierz pliki do przesłania"
|
||||
selectImage = "Wybierz obraz"
|
||||
preview = "Podgląd"
|
||||
retake = "Zrób ponownie"
|
||||
addToBatch = "Dodaj do partii"
|
||||
upload = "Prześlij"
|
||||
batchImages = "Partia"
|
||||
clearBatch = "Wyczyść"
|
||||
uploadAll = "Prześlij wszystkie"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Você tem alterações não salvas no seu PDF. O que você gostaria de fazer?"
|
||||
pendingRedactionsTitle = "Redações não aplicadas"
|
||||
pendingRedactions = "Você tem redações não aplicadas que serão perdidas."
|
||||
areYouSure = "Tem certeza de que deseja sair?"
|
||||
unsavedChangesTitle = "Alterações não salvas"
|
||||
keepWorking = "Continuar trabalhando"
|
||||
discardChanges = "Descartar alterações"
|
||||
discardRedactions = "Descartar e sair"
|
||||
applyAndContinue = "Aplicar e continuar"
|
||||
exportAndContinue = "Exportar e continuar"
|
||||
cancel = "Cancelar"
|
||||
@@ -134,7 +131,7 @@ unsupported = "Não suportado"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Escolha uma ferramenta para começar"
|
||||
alpha = "Alpha"
|
||||
alpha = "Alfa"
|
||||
premiumFeature = "Recurso premium:"
|
||||
comingSoon = "Em breve:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Avançado"
|
||||
edit = "Visualizar & Editar"
|
||||
popular = "Populares"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferências"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avançado"
|
||||
title = "Segurança & Autenticação"
|
||||
security = "Segurança"
|
||||
connections = "Conexões"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licenciamento & Análises"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versão atual"
|
||||
latestVersion = "Última versão"
|
||||
checkForUpdates = "Verificar atualizações"
|
||||
viewDetails = "Ver detalhes"
|
||||
serverNeedsUpdate = "O servidor precisa ser atualizado pelo administrador"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informações da versão"
|
||||
description = "Detalhes das versões desktop e do servidor"
|
||||
desktop = "Versão desktop"
|
||||
server = "Versão do servidor"
|
||||
|
||||
[settings.security]
|
||||
title = "Segurança"
|
||||
description = "Atualize sua senha para manter sua conta segura."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Altere sua senha. Você será desconectado após a atualização."
|
||||
required = "Todos os campos são obrigatórios."
|
||||
mismatch = "As novas senhas não coincidem."
|
||||
error = "Não foi possível atualizar a senha. Verifique sua senha atual e tente novamente."
|
||||
success = "Senha atualizada com sucesso. Faça login novamente."
|
||||
ssoDisabled = "As alterações de senha são gerenciadas pelo seu provedor de identidade."
|
||||
current = "Senha atual"
|
||||
currentPlaceholder = "Digite sua senha atual"
|
||||
new = "Nova senha"
|
||||
newPlaceholder = "Digite uma nova senha"
|
||||
confirm = "Confirmar nova senha"
|
||||
confirmPlaceholder = "Redigite sua nova senha"
|
||||
update = "Atualizar senha"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Atalhos de teclado"
|
||||
@@ -522,16 +488,11 @@ low = "Baixa"
|
||||
title = "Alterar Credenciais"
|
||||
header = "Atualizar Detalhes da Conta"
|
||||
changePassword = "Você está usando as credenciais padrões. Por favor, insira uma nova senha"
|
||||
ssoManaged = "Sua conta é gerenciada pelo seu provedor de identidade."
|
||||
newUsername = "Novo Usuário"
|
||||
oldPassword = "Senha Atual"
|
||||
newPassword = "Senha Nova"
|
||||
confirmNewPassword = "Confirme a Nova Senha"
|
||||
submit = "Enviar Alterações"
|
||||
credsUpdated = "Conta atualizada"
|
||||
description = "Alterações salvas. Faça login novamente."
|
||||
error = "Não foi possível atualizar o nome de usuário. Verifique sua senha e tente novamente."
|
||||
changeUsername = "Atualize seu nome de usuário. Você será desconectado após a atualização."
|
||||
|
||||
[account]
|
||||
title = "Configurações da Conta"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Configurações da Conta"
|
||||
adminSettings = "Configurações de Administrador – Visualizar e Adicionar Usuários"
|
||||
userControlSettings = "Configurações de Controle de Usuário"
|
||||
changeUsername = "Alterar Usuário"
|
||||
changeUsernameDescription = "Atualize seu nome de usuário. Você será desconectado após a atualização."
|
||||
newUsernamePlaceholder = "Digite seu novo nome de usuário"
|
||||
newUsername = "Novo Usuário"
|
||||
password = "Senha de Confirmação"
|
||||
oldPassword = "Senha Antiga"
|
||||
@@ -749,11 +708,6 @@ tags = "assinatura,autógrafo"
|
||||
title = "Assinar"
|
||||
desc = "Adicionar assinatura ao PDF por desenho, texto ou imagem."
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotar,realçar,desenhar"
|
||||
title = "Anotar"
|
||||
desc = "Realce, desenhe, adicione notas e formas no visualizador"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplificar,remover,interativo"
|
||||
title = "Achatar"
|
||||
@@ -964,8 +918,8 @@ desc = "Sobrepor um PDF sobre outro"
|
||||
title = "Sobrepor PDFs"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor de texto de PDF"
|
||||
desc = "Revise e edite exportações JSON do Stirling PDF com edição de texto agrupada e regeneração do PDF"
|
||||
title = "Editor de Texto em PDF"
|
||||
desc = "Edite texto e imagens existentes em PDFs"
|
||||
|
||||
[home.addText]
|
||||
tags = "texto,anotação,rótulo"
|
||||
@@ -976,7 +930,6 @@ desc = "Adicione texto personalizado em qualquer lugar do seu PDF"
|
||||
addFiles = "Adicionar arquivos"
|
||||
uploadFromComputer = "Fazer upload do computador"
|
||||
openFromComputer = "Abrir do computador"
|
||||
mobileUpload = "Enviar do celular"
|
||||
|
||||
[viewPdf]
|
||||
tags = "visualizar,ler,anotar,texto,imagem"
|
||||
@@ -1272,7 +1225,7 @@ odtExt = "Texto OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Apresentação OpenDocument (.odp)"
|
||||
txtExt = "Texto simples (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Formato Rich Text (.rtf)"
|
||||
selectedFiles = "Arquivos selecionados"
|
||||
noFileSelected = "Nenhum arquivo selecionado. Use o painel de arquivos para adicionar arquivos."
|
||||
convertFiles = "Converter arquivos"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opções de CBZ para PDF"
|
||||
optimizeForEbook = "Otimizar PDF para leitores de e-book (usa Ghostscript)"
|
||||
cbzOutputOptions = "Opções de PDF para CBZ"
|
||||
cbzDpi = "DPI para renderização de imagem"
|
||||
cbrOptions = "Opções de CBR"
|
||||
cbrOutputOptions = "Opções de PDF para CBR"
|
||||
cbrDpi = "DPI para renderização de imagem"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opções de eBook para PDF"
|
||||
ebookOptionsDesc = "Opções para converter eBooks em PDF"
|
||||
embedAllFonts = "Incorporar todas as fontes"
|
||||
embedAllFontsDesc = "Incorporar todas as fontes do eBook no PDF gerado"
|
||||
includeTableOfContents = "Incluir sumário"
|
||||
includeTableOfContentsDesc = "Adicionar um sumário gerado ao PDF resultante"
|
||||
includePageNumbers = "Incluir números de página"
|
||||
includePageNumbersDesc = "Adicionar números de página ao PDF gerado"
|
||||
optimizeForEbookPdf = "Otimizar para leitores de eBook"
|
||||
optimizeForEbookPdfDesc = "Otimizar o PDF para leitura em eBook (arquivo menor, melhor renderização em dispositivos eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opções de PDF para eBook"
|
||||
epubOptionsDesc = "Opções para converter PDF em EPUB/AZW3"
|
||||
detectChapters = "Detectar capítulos"
|
||||
detectChaptersDesc = "Detectar títulos que parecem capítulos e inserir quebras de página no EPUB"
|
||||
targetDevice = "Dispositivo de destino"
|
||||
targetDeviceDesc = "Escolha um perfil de saída otimizado para o dispositivo leitor"
|
||||
outputFormat = "Formato de saída"
|
||||
outputFormatDesc = "Escolha o formato de saída para o eBook"
|
||||
tabletPhone = "Tablet/Celular (com imagens)"
|
||||
kindleEink = "Kindle e-Ink (texto otimizado)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversão,img,jpg,imagem,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Adicionar anexo"
|
||||
remove = "Remover anexo"
|
||||
embed = "Incorporar anexo"
|
||||
convertToPdfA3b = "Converter para PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Cria um PDF de arquivamento com anexos incorporados"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b é um formato de arquivamento que garante preservação de longo prazo. Permite incorporar formatos de arquivo arbitrários como anexos. A conversão requer Ghostscript e pode demorar mais para arquivos grandes."
|
||||
convertToPdfA3bTooltipHeader = "Sobre a conversão para PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "O que faz"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -2385,10 +2306,6 @@ saved = "Salvas"
|
||||
label = "Enviar imagem da assinatura"
|
||||
placeholder = "Selecionar arquivo de imagem"
|
||||
hint = "Envie uma imagem PNG ou JPG da sua assinatura"
|
||||
removeBackground = "Remover fundo branco (tornar transparente)"
|
||||
processing = "Processando imagem..."
|
||||
backgroundRemovalFailedTitle = "Falha ao remover o fundo"
|
||||
backgroundRemovalFailedMessage = "Não foi possível remover o fundo da imagem. Usando a imagem original."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Como adicionar assinatura"
|
||||
@@ -2434,11 +2351,6 @@ note = "Achatar remove elementos interativos do PDF, tornando-os não editáveis
|
||||
label = "Achatar apenas formulários"
|
||||
desc = "Achatar apenas campos de formulário, mantendo outros elementos interativos"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de renderização (opcional, recomendado 150 DPI)"
|
||||
help = "Deixe em branco para usar o padrão do sistema. Um DPI mais alto melhora a nitidez, mas aumenta o tempo de processamento e o tamanho do arquivo."
|
||||
placeholder = "ex.: 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultados do achatamento"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Recortar"
|
||||
submit = "Enviar"
|
||||
noFileSelected = "Selecione um arquivo PDF para iniciar o corte"
|
||||
reset = "Redefinir para o PDF completo"
|
||||
autoCrop = "Cortar automaticamente espaços em branco"
|
||||
|
||||
[crop.preview]
|
||||
title = "Seleção da área de corte"
|
||||
@@ -3244,7 +3155,6 @@ title = "Método de ocultação"
|
||||
mode = "Modo"
|
||||
automatic = "Automático"
|
||||
automaticDesc = "Oculte texto com base em termos de busca"
|
||||
automaticDisabledTooltip = "Selecione arquivos no gerenciador de arquivos para redigir vários arquivos de uma vez"
|
||||
manual = "Manual"
|
||||
manualDesc = "Clique e arraste para ocultar áreas específicas"
|
||||
manualComingSoon = "Ocultação manual em breve"
|
||||
@@ -3315,35 +3225,8 @@ text = "Corresponde apenas palavras completas, não correspondências parciais.
|
||||
title = "Converter para PDF-imagem"
|
||||
text = "Converte o PDF para um PDF baseado em imagem após a ocultação. Isso garante que o texto atrás das caixas seja completamente removido e irrecuperável."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controles de redação manual"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Ferramenta Marcar texto"
|
||||
text = "Selecione o texto diretamente no PDF para marcá-lo para redação. Clique e arraste para realçar o texto específico que você deseja redigir."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Ferramenta Marcar área"
|
||||
text = "Desenhe áreas retangulares no PDF para marcar regiões para redação. Útil para redigir imagens, assinaturas ou formas irregulares."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplicar redações"
|
||||
text = "Após marcar o conteúdo, clique em 'Aplicar' para redigir permanentemente todas as áreas marcadas. A contagem de pendências mostra quantas redações estão prontas para aplicar."
|
||||
bullet1 = "Marque quantas áreas forem necessárias antes de aplicar"
|
||||
bullet2 = "Todas as redações pendentes são aplicadas de uma vez"
|
||||
bullet3 = "As redações não podem ser desfeitas após aplicar"
|
||||
|
||||
[redact.manual]
|
||||
title = "Ferramentas de redação"
|
||||
instructions = "Selecione texto ou desenhe áreas no PDF para marcar conteúdo para redação."
|
||||
markText = "Marcar texto"
|
||||
markArea = "Marcar área"
|
||||
pendingLabel = "Pendentes:"
|
||||
applyWarning = "⚠️ Aplicação permanente, não pode ser desfeita e os dados subjacentes serão excluídos"
|
||||
apply = "Aplicar"
|
||||
noMarks = "Nenhuma marca de redação. Use as ferramentas acima para marcar conteúdo para redação."
|
||||
header = "Ocultação manual"
|
||||
controlsTitle = "Controles de redação manual"
|
||||
textBasedRedaction = "Ocultação baseada em texto"
|
||||
pageBasedRedaction = "Ocultação baseada em página"
|
||||
convertPDFToImageLabel = "Converter PDF para PDF-imagem (usado para remover texto atrás da caixa)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Insira o número de divisões horizontais"
|
||||
label = "Divisões Verticais:"
|
||||
placeholder = "Insira o número de divisões verticais"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Modo de divisão"
|
||||
description = "Escolha como dividir as páginas"
|
||||
splitAll = "Dividir todas as páginas"
|
||||
splitAllExceptFirst = "Dividir todas exceto a primeira"
|
||||
splitAllExceptLast = "Dividir todas exceto a última"
|
||||
splitAllExceptFirstAndLast = "Dividir todas exceto a primeira e a última"
|
||||
custom = "Páginas personalizadas"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Números de página personalizados"
|
||||
placeholder = "ex.: 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Carimbo,Adicionar imagem,centralizar imagem,Marca d'água,PDF,Incorporar,Personalizar"
|
||||
header = "Adicionar Carimbo ao PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Tamanho do Arquivo"
|
||||
[compress.grayscale]
|
||||
label = "Aplicar escala de cinza para compressão"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearizar PDF para visualização rápida na web"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Converter imagens em traço"
|
||||
description = "Usa ImageMagick para reduzir as páginas a preto e branco de alto contraste para máxima redução de tamanho."
|
||||
unavailable = "ImageMagick não está instalado ou habilitado neste servidor"
|
||||
detailLevel = "Nível de detalhe"
|
||||
edgeEmphasis = "Ênfase nas bordas"
|
||||
edgeLow = "Suave"
|
||||
edgeMedium = "Equilibrado"
|
||||
edgeHigh = "Forte"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Visão geral das configurações de compressão"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Valores maiores reduzem o tamanho do arquivo"
|
||||
title = "Tons de cinza"
|
||||
text = "Selecione esta opção para converter todas as imagens para preto e branco, o que pode reduzir significativamente o tamanho do arquivo, especialmente para PDFs digitalizados ou documentos com muitas imagens."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Traço"
|
||||
text = "Converta páginas para preto e branco de alto contraste usando ImageMagick. Use o nível de detalhe para controlar quanto conteúdo fica preto e a ênfase nas bordas para controlar quão agressiva é a detecção das bordas."
|
||||
|
||||
[compress.error]
|
||||
failed = "Ocorreu um erro ao comprimir o PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Ocorreu um erro ao comprimir o PDF."
|
||||
_value = "Configurações de Compressão:"
|
||||
1 = "1-3: Compressão do PDF,</br> 4-6: Compressão leve de Imagem,</br> 7-9: Compressão alta de Imagem. Redução considerável de qualidade da imagem."
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valores menores preservam a qualidade, mas resultam em arquivos maiores"
|
||||
range4to6 = "Compressão média com redução moderada de qualidade"
|
||||
range7to9 = "Valores mais altos reduzem significativamente o tamanho do arquivo, mas podem reduzir a clareza das imagens"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Este arquivo está protegido por senha. Insira a senha:"
|
||||
cancelled = "Operação cancelada para PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Excluir páginas selecionadas"
|
||||
closePdf = "Fechar PDF"
|
||||
exportAll = "Exportar PDF"
|
||||
downloadSelected = "Baixar arquivos selecionados"
|
||||
annotations = "Anotações"
|
||||
exportSelected = "Exportar páginas selecionadas"
|
||||
saveChanges = "Salvar alterações"
|
||||
downloadAll = "Baixar tudo"
|
||||
saveAll = "Salvar tudo"
|
||||
toggleTheme = "Alternar tema"
|
||||
toggleBookmarks = "Alternar marcadores"
|
||||
language = "Idioma"
|
||||
toggleAnnotations = "Alternar visibilidade das anotações"
|
||||
search = "Pesquisar PDF"
|
||||
panMode = "Modo de panorâmica"
|
||||
applyRedactionsFirst = "Aplicar redações primeiro"
|
||||
rotateLeft = "Girar à esquerda"
|
||||
rotateRight = "Girar à direita"
|
||||
toggleSidebar = "Alternar barra lateral"
|
||||
toggleBookmarks = "Alternar marcadores"
|
||||
exportSelected = "Exportar páginas selecionadas"
|
||||
toggleAnnotations = "Alternar visibilidade das anotações"
|
||||
annotationMode = "Alternar modo de anotação"
|
||||
print = "Imprimir PDF"
|
||||
draw = "Desenhar"
|
||||
redact = "Redigir"
|
||||
exitRedaction = "Sair do modo de redação"
|
||||
save = "Salvar"
|
||||
downloadAll = "Baixar tudo"
|
||||
saveAll = "Salvar tudo"
|
||||
|
||||
[textAlign]
|
||||
left = "Esquerda"
|
||||
center = "Centro"
|
||||
right = "Direita"
|
||||
|
||||
[annotation]
|
||||
title = "Anotar"
|
||||
desc = "Use realce, caneta, texto e notas. As alterações permanecem ativas — sem necessidade de achatar."
|
||||
highlight = "Realçar"
|
||||
pen = "Caneta"
|
||||
text = "Caixa de texto"
|
||||
note = "Nota"
|
||||
rectangle = "Retângulo"
|
||||
ellipse = "Elipse"
|
||||
select = "Selecionar"
|
||||
exit = "Sair do modo de anotação"
|
||||
strokeWidth = "Largura"
|
||||
opacity = "Opacidade"
|
||||
strokeOpacity = "Opacidade do contorno"
|
||||
fillOpacity = "Opacidade do preenchimento"
|
||||
fontSize = "Tamanho da fonte"
|
||||
chooseColor = "Escolher cor"
|
||||
color = "Cor"
|
||||
strokeColor = "Cor do contorno"
|
||||
fillColor = "Cor de preenchimento"
|
||||
underline = "Sublinhar"
|
||||
strikeout = "Tachar"
|
||||
squiggly = "Ondulado"
|
||||
inkHighlighter = "Marca-texto à mão livre"
|
||||
freehandHighlighter = "Marca-texto à mão livre"
|
||||
square = "Quadrado"
|
||||
circle = "Círculo"
|
||||
polygon = "Polígono"
|
||||
line = "Linha"
|
||||
stamp = "Adicionar imagem"
|
||||
textMarkup = "Marcação de texto"
|
||||
drawing = "Desenho"
|
||||
shapes = "Formas"
|
||||
notesStamps = "Notas e carimbos"
|
||||
settings = "Configurações"
|
||||
borderOn = "Borda: ativada"
|
||||
borderOff = "Borda: desativada"
|
||||
editInk = "Editar caneta"
|
||||
editLine = "Editar linha"
|
||||
editNote = "Editar nota"
|
||||
editText = "Editar caixa de texto"
|
||||
editTextMarkup = "Editar marcação de texto"
|
||||
editSelected = "Editar anotação"
|
||||
editSquare = "Editar quadrado"
|
||||
editCircle = "Editar círculo"
|
||||
editPolygon = "Editar polígono"
|
||||
unsupportedType = "Este tipo de anotação não é totalmente compatível para edição."
|
||||
textAlignment = "Alinhamento do texto"
|
||||
noteIcon = "Ícone da nota"
|
||||
imagePreview = "Prévia"
|
||||
contents = "Texto"
|
||||
backgroundColor = "Cor de fundo"
|
||||
clearBackground = "Remover fundo"
|
||||
noBackground = "Sem fundo"
|
||||
stampSettings = "Configurações de carimbo"
|
||||
savingCopy = "Preparando download..."
|
||||
saveFailed = "Não foi possível salvar a cópia"
|
||||
saveReady = "Download pronto"
|
||||
selectAndMove = "Selecionar e editar"
|
||||
editSelectDescription = "Clique em uma anotação existente para editar sua cor, opacidade, texto ou tamanho."
|
||||
editStampHint = "Para alterar a imagem, exclua este carimbo e adicione um novo."
|
||||
editSwitchToSelect = "Mude para Selecionar e Editar para editar esta anotação."
|
||||
undo = "Desfazer"
|
||||
redo = "Refazer"
|
||||
applyChanges = "Aplicar alterações"
|
||||
saveChanges = "Salvar alterações"
|
||||
|
||||
[search]
|
||||
@@ -4260,25 +4033,17 @@ files = "Arquivos"
|
||||
activity = "Ativ."
|
||||
help = "Ajuda"
|
||||
account = "Conta"
|
||||
config = "Config"
|
||||
config = "Configurações"
|
||||
settings = "Ajustes"
|
||||
adminSettings = "Ajustes admin"
|
||||
allTools = "Ferram."
|
||||
reader = "Leitor"
|
||||
tours = "Tours"
|
||||
showMeAround = "Faça um tour"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Assista aos tutoriais aqui: tour das Ferramentas, tour do novo layout V2 e o tour do Admin."
|
||||
user = "Assista aos tutoriais aqui: tour das Ferramentas e tour do novo layout V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tour das ferramentas"
|
||||
toolsTourDesc = "Saiba o que as ferramentas podem fazer"
|
||||
adminTour = "Tour do administrador"
|
||||
adminTourDesc = "Explore configurações e recursos de administrador"
|
||||
whatsNewTour = "Veja as novidades na V2"
|
||||
whatsNewTourDesc = "Faça um tour pelo layout atualizado"
|
||||
|
||||
[admin]
|
||||
error = "Erro"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Falha ao carregar configurações"
|
||||
saveError = "Falha ao salvar configurações"
|
||||
saved = "Configurações salvas com sucesso"
|
||||
saveSuccess = "Configurações salvas com sucesso"
|
||||
success = "Configurações salvas com sucesso"
|
||||
error = "Falha ao salvar as configurações"
|
||||
save = "Salvar alterações"
|
||||
discard = "Descartar"
|
||||
restartRequired = "Reinicialização necessária"
|
||||
@@ -4422,13 +4185,6 @@ description = "Caminho para o executável WeasyPrint para conversão de HTML par
|
||||
label = "Executável do unoconvert"
|
||||
description = "Caminho para o unoconvert do LibreOffice para conversões de documentos (deixe em branco para padrão: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "URL do frontend"
|
||||
description = "URL base do frontend (ex.: https://pdf.example.com). Usada para links de convite por e-mail e uploads por QR code no celular. Deixe vazio para usar a URL do backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Clique para ver detalhes do plano"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Segurança"
|
||||
description = "Configurar autenticação, comportamento de login e políticas de segurança."
|
||||
@@ -4505,7 +4261,7 @@ description = "Rastrear ações do usuário e eventos do sistema para conformida
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Nível de auditoria"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=DESLIGADO, 1=BÁSICO, 2=PADRÃO, 3=DETALHADO"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Retenção de auditoria (dias)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Conectar"
|
||||
disconnect = "Desconectar"
|
||||
disconnected = "Provedor desconectado com sucesso"
|
||||
disconnectError = "Falha ao desconectar provedor"
|
||||
mobileScannerConvertToPdf = "Converter imagens em PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converter automaticamente as imagens enviadas para o formato PDF. Se desativado, as imagens serão mantidas como estão."
|
||||
mobileScannerImageResolution = "Resolução da imagem"
|
||||
mobileScannerImageResolutionDesc = "Resolução das imagens enviadas. \"Reduzida\" redimensiona as imagens para no máximo 1200 px para reduzir o tamanho do arquivo."
|
||||
imageResolutionFull = "Completa (tamanho original)"
|
||||
imageResolutionReduced = "Reduzida (máx. 1200 px)"
|
||||
mobileScannerPageFormat = "Formato da página"
|
||||
mobileScannerPageFormatDesc = "Tamanho da página do PDF para imagens convertidas. \"Manter\" usa as dimensões originais da imagem."
|
||||
pageFormatKeep = "Manter (dimensões originais)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Carta (8,5×11 pol)"
|
||||
mobileScannerStretchToFit = "Ajustar para preencher"
|
||||
mobileScannerStretchToFitDesc = "Esticar imagens para preencher toda a página. Se desativado, as imagens são centralizadas mantendo a proporção."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Login automático SSO"
|
||||
@@ -4600,11 +4343,11 @@ label = "URL do emissor"
|
||||
description = "A URL do emissor do provedor OAuth2"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "ID do cliente"
|
||||
description = "O Client ID do OAuth2 do seu provedor"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "Segredo do cliente"
|
||||
description = "O Client Secret do OAuth2 do seu provedor"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4646,122 +4389,6 @@ description = "Criar automaticamente contas de usuário no primeiro login via SA
|
||||
label = "Bloquear registro"
|
||||
description = "Impedir novo registro de usuários via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Envio pelo celular"
|
||||
enable = "Habilitar envio via QR Code"
|
||||
description = "Permitir que usuários enviem arquivos de dispositivos móveis escaneando um QR code"
|
||||
note = "Observação: requer que a URL do frontend esteja configurada. "
|
||||
link = "Configurar nas Configurações do Sistema"
|
||||
mobileScannerConvertToPdf = "Converter imagens em PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converter automaticamente as imagens enviadas para o formato PDF. Se desativado, as imagens serão mantidas como estão."
|
||||
mobileScannerImageResolution = "Resolução da imagem"
|
||||
mobileScannerImageResolutionDesc = "Resolução das imagens enviadas. \"Reduzida\" redimensiona as imagens para no máximo 1200 px para reduzir o tamanho do arquivo."
|
||||
imageResolutionFull = "Completa (tamanho original)"
|
||||
imageResolutionReduced = "Reduzida (máx. 1200 px)"
|
||||
mobileScannerPageFormat = "Formato da página"
|
||||
mobileScannerPageFormatDesc = "Tamanho da página do PDF para imagens convertidas. \"Manter\" usa as dimensões originais da imagem."
|
||||
pageFormatKeep = "Manter (dimensões originais)"
|
||||
pageFormatA4 = "A4 (210×297 mm)"
|
||||
pageFormatLetter = "Carta (8,5×11 pol)"
|
||||
mobileScannerStretchToFit = "Ajustar para preencher"
|
||||
mobileScannerStretchToFitDesc = "Esticar imagens para preencher toda a página. Se desativado, as imagens são centralizadas mantendo a proporção."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot do Telegram"
|
||||
description = "Configure a conectividade do bot do Telegram, controles de acesso e comportamento de feedback."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Habilitar bot do Telegram"
|
||||
description = "Permitir que usuários interajam com o Stirling PDF por meio do seu bot do Telegram configurado."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nome de usuário do bot"
|
||||
description = "O nome de usuário público do seu bot do Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token do bot"
|
||||
description = "Token de API fornecido pelo BotFather para seu bot do Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Pasta de entrada"
|
||||
description = "Pasta no diretório de pipeline onde os arquivos do Telegram são armazenados."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Usar sufixo de pasta personalizado"
|
||||
description = "Acrescentar o ID do chat às pastas de arquivos recebidos para isolar envios por chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Controle de acesso"
|
||||
description = "Restringir quais usuários ou canais podem interagir com o bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Permitir IDs de usuário específicos"
|
||||
description = "Quando habilitado, somente os IDs de usuário listados podem usar o bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "IDs de usuário permitidos"
|
||||
description = "Insira os IDs de usuário do Telegram autorizados a interagir com o bot."
|
||||
placeholder = "Adicione o ID do usuário e pressione Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Permitir IDs de canal específicos"
|
||||
description = "Quando habilitado, somente os IDs de canal listados podem usar o bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "IDs de canal permitidos"
|
||||
description = "Insira os IDs de canal do Telegram autorizados a interagir com o bot."
|
||||
placeholder = "Adicione o ID do canal e pressione Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Processamento"
|
||||
description = "Controle intervalos de polling e tempos limite de processamento para uploads do Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Tempo limite de processamento (segundos)"
|
||||
description = "Tempo máximo de espera por um trabalho de processamento antes de informar um erro."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Intervalo de polling (ms)"
|
||||
description = "Intervalo entre verificações por novas atualizações do Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Mensagens de feedback"
|
||||
description = "Escolha quando o bot deve enviar feedback para usuários e canais."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Habilitar feedback"
|
||||
description = "Controla se o bot envia mensagens de feedback ou não."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regras de feedback para canais"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Mostrar \"Nenhum documento válido\" (Canal)"
|
||||
description = "Suprimir a resposta de nenhum documento válido para envios em canal."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Mostrar erros de processamento (Canal)"
|
||||
description = "Enviar mensagens de erro de processamento para canais."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Mostrar mensagens de erro (Canal)"
|
||||
description = "Mostrar mensagens de erro detalhadas para canais."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regras de feedback para usuários"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Mostrar \"Nenhum documento válido\" (Usuário)"
|
||||
description = "Suprimir a resposta de nenhum documento válido para envios de usuários."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Mostrar erros de processamento (Usuário)"
|
||||
description = "Enviar mensagens de erro de processamento para usuários."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Mostrar mensagens de erro (Usuário)"
|
||||
description = "Mostrar mensagens de erro detalhadas para usuários."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Banco de dados"
|
||||
description = "Configurar definições personalizadas de conexão com banco de dados para implantações corporativas."
|
||||
@@ -4943,10 +4570,6 @@ description = "Permitir que administradores convidem usuários por email com sen
|
||||
label = "URL do frontend"
|
||||
description = "URL base do frontend (ex.: https://pdf.example.com). Usada para gerar links de convite em emails. Deixe em branco para usar a URL do backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Observação: requer que a URL do frontend esteja configurada. "
|
||||
link = "Configurar nas Configurações do Sistema"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documentos legais"
|
||||
description = "Configurar links para documentos e políticas legais."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Meus arquivos"
|
||||
noRecentFiles = "Nenhum arquivo recente encontrado"
|
||||
googleDriveNotAvailable = "Integração com Google Drive indisponível"
|
||||
mobileUpload = "Envio pelo celular"
|
||||
mobileShort = "Celular"
|
||||
mobileUploadNotAvailable = "Envio pelo celular não habilitado"
|
||||
downloadSelected = "Baixar selecionados"
|
||||
saveSelected = "Salvar selecionados"
|
||||
openFiles = "Abrir arquivos"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Carregando..."
|
||||
back = "Voltar"
|
||||
continue = "Continuar"
|
||||
error = "Erro"
|
||||
save = "Salvar"
|
||||
|
||||
[config.overview]
|
||||
title = "Configuração do aplicativo"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Quaisquer aplicativos ou serviços que estejam usando essas chaves dei
|
||||
confirmPrompt = "Tem certeza de que deseja continuar?"
|
||||
confirmCta = "Atualizar chaves"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Erro de chave de API"
|
||||
failedToCreateApiKey = "Falha ao criar chave de API."
|
||||
failedToRetrieveApiKey = "Falha ao recuperar a chave de API da resposta."
|
||||
failedToFetchApiKey = "Falha ao buscar a chave de API."
|
||||
apiKeyRefreshed = "Chave de API atualizada"
|
||||
apiKeyRefreshedBody = "Sua chave de API foi atualizada com sucesso."
|
||||
failedToRefreshApiKey = "Falha ao atualizar a chave de API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Selecionar anexos"
|
||||
info = "Selecione arquivos para anexar ao seu PDF. Esses arquivos serão incorporados e acessíveis pelo painel de anexos do PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Concluir"
|
||||
startTour = "Iniciar tour"
|
||||
startTourDescription = "Faça um tour guiado pelos principais recursos do Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Comece no trilho de <strong>Acesso Rápido</strong> para alternar entre Leitor, Automatizar, seus arquivos e todos os tours."
|
||||
leftPanel = "O painel esquerdo de <strong>Ferramentas</strong> lista tudo o que você pode fazer. Navegue pelas categorias ou pesquise para encontrar uma ferramenta rapidamente."
|
||||
fileUpload = "Use o botão <strong>Arquivos</strong> para enviar ou escolher um PDF recente. Carregaremos um exemplo para que você veja o espaço de trabalho."
|
||||
rightRail = "O <strong>Trilho Direito</strong> contém ações rápidas para selecionar arquivos, alterar tema ou idioma e baixar resultados."
|
||||
topBar = "A barra superior permite alternar entre <strong>Visualizador</strong>, <strong>Editor de páginas</strong> e <strong>Arquivos ativos</strong>."
|
||||
pageEditorView = "Mude para o Editor de páginas para reordenar, girar ou excluir páginas."
|
||||
activeFilesView = "Use Arquivos ativos para ver tudo o que você tem aberto e escolher em que trabalhar."
|
||||
wrapUp = "Isso é o que há de novo na V2. Abra o menu <strong>Tours</strong> a qualquer momento para rever este, o tour de Ferramentas ou o tour de Admin."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Bem-vindo ao Stirling PDF!"
|
||||
description = "Gostaria de fazer um tour rápido de 1 minuto para aprender os recursos principais e como começar?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Baixar →"
|
||||
showMeAround = "Me mostre por aí"
|
||||
skipTheTour = "Pular o tour"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Visão geral do tour"
|
||||
body = "O Stirling PDF V2 vem com dezenas de ferramentas e um layout renovado. Faça um tour rápido para ver o que mudou e onde encontrar os recursos de que você precisa."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Pular por enquanto"
|
||||
seePlans = "Ver planos →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Fazer upgrade agora →"
|
||||
freeTitle = "Licença do servidor"
|
||||
overLimitTitle = "Necessária licença do servidor"
|
||||
overLimitBody = "Nossa licença permite até <strong>{{freeTierLimit}}</strong> usuários grátis por servidor. Você tem <strong>{{overLimitUserCopy}}</strong> usuários do Stirling. Para continuar sem interrupções, faça upgrade para o plano Stirling Server - <strong>assentos ilimitados</strong>, edição de texto em PDF e controle total de admin por US$ 99/servidor/mês."
|
||||
freeBody = "Nossa licença <strong>Open-Core</strong> permite até <strong>{{freeTierLimit}}</strong> usuários grátis por servidor. Para escalar sem interrupções e ter acesso antecipado à nova <strong>ferramenta de edição de texto em PDF</strong>, recomendamos o plano Stirling Server - edição completa e <strong>assentos ilimitados</strong> por US$ 99/servidor/mês."
|
||||
freeBody = "Nossa licença <strong>Open-Core</strong> permite até <strong>{{freeTierLimit}}</strong> usuários gratuitos por servidor. Para escalar sem interrupções, recomendamos o plano Stirling Server - <strong>assentos ilimitados</strong> e <strong>suporte a SSO</strong> por US$ 99/servidor/mês."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5712,7 +5308,7 @@ active = "Ativo"
|
||||
disabled = "Desativado"
|
||||
activeSession = "Sessão ativa"
|
||||
member = "Membro"
|
||||
admin = "Admin"
|
||||
admin = "Administrador"
|
||||
editRole = "Editar função"
|
||||
enable = "Ativar"
|
||||
disable = "Desativar"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Falar com Vendas"
|
||||
contactToUpgrade = "Entre em contato para fazer upgrade ou personalizar seu plano"
|
||||
maxUsers = "Máximo de usuários"
|
||||
upTo = "Até"
|
||||
getLicense = "Obter licença do servidor"
|
||||
upgradeToEnterprise = "Atualizar para Enterprise"
|
||||
selectPeriod = "Selecionar período de cobrança"
|
||||
monthlyBilling = "Cobrança mensal"
|
||||
yearlyBilling = "Cobrança anual"
|
||||
checkoutOpened = "Checkout aberto"
|
||||
checkoutInstructions = "Conclua sua compra na aba do Stripe. Após o pagamento, volte aqui e atualize a página para ativar sua licença. Você também receberá um e-mail com sua chave de licença."
|
||||
activateLicense = "Ative sua licença"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout aberto em nova aba"
|
||||
instructions = "Conclua sua compra na aba do Stripe. Após a conclusão do pagamento, você receberá um e-mail com sua chave de licença."
|
||||
enterKey = "Digite sua chave de licença abaixo para ativar seu plano:"
|
||||
keyDescription = "Cole a chave de licença do seu e-mail"
|
||||
activate = "Ativar licença"
|
||||
doLater = "Farei isso depois"
|
||||
success = "Licença ativada!"
|
||||
successMessage = "Sua licença foi ativada com sucesso. Agora você pode fechar esta janela."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Verificação de e-mail necessária"
|
||||
message = "Você precisará verificar seu endereço de e-mail no portal de cobrança da Stripe. Verifique seu e-mail para um link de login."
|
||||
|
||||
[plan.period]
|
||||
month = "mês"
|
||||
@@ -6122,7 +5696,7 @@ emailInvalid = "Digite um endereço de e-mail válido"
|
||||
title = "Informe seu e-mail"
|
||||
description = "Usaremos isso para enviar sua chave de licença e recibos."
|
||||
emailLabel = "Endereço de e-mail"
|
||||
emailPlaceholder = "your@email.com"
|
||||
emailPlaceholder = "seu@email.com"
|
||||
continue = "Continuar"
|
||||
modalTitle = "Começar - {{planName}}"
|
||||
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistema de auditoria não disponível"
|
||||
notAvailableMessage = "O sistema de auditoria não está configurado ou não está disponível."
|
||||
disabled = "O registro de auditoria está desativado"
|
||||
disabledMessage = "Habilite o registro de auditoria na configuração do seu aplicativo para rastrear eventos do sistema."
|
||||
enterpriseRequired = "Licença Enterprise necessária"
|
||||
enterpriseRequiredMessage = "O sistema de registro de auditoria é um recurso Enterprise. Atualize para uma licença Enterprise para acessar logs e análises de auditoria."
|
||||
|
||||
[audit.error]
|
||||
title = "Erro ao carregar o sistema de auditoria"
|
||||
@@ -6370,7 +5942,6 @@ description = "Informe a URL completa do seu servidor self-hosted Stirling PDF"
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Informe uma URL de servidor"
|
||||
invalidUrl = "Formato de URL inválido. Insira uma URL válida como https://seu-servidor.com"
|
||||
unreachable = "Não foi possível conectar ao servidor"
|
||||
testFailed = "Falha no teste de conexão"
|
||||
configFetch = "Falha ao buscar a configuração do servidor. Verifique a URL e tente novamente."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Conectando a:"
|
||||
submit = "Login"
|
||||
signInWith = "Entrar com"
|
||||
oauthPending = "Abrindo o navegador para autenticação..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Ou continue com e-mail"
|
||||
serverRequirement = "Observação: o servidor deve ter o login ativado."
|
||||
showInstructions = "Como ativar?"
|
||||
@@ -6404,7 +5974,7 @@ label = "Usuário"
|
||||
placeholder = "Digite seu usuário"
|
||||
|
||||
[setup.login.email]
|
||||
label = "Email"
|
||||
label = "E-mail"
|
||||
placeholder = "Digite seu e-mail"
|
||||
|
||||
[setup.login.password]
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Página de parágrafos"
|
||||
sparse = "Texto esparso"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automático"
|
||||
paragraph = "Parágrafo"
|
||||
singleLine = "Linha única"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Reverter alterações"
|
||||
downloadJson = "Baixar JSON"
|
||||
generatePdf = "Gerar PDF"
|
||||
saveChanges = "Salvar alterações"
|
||||
applyChanges = "Aplicar alterações"
|
||||
downloadCopy = "Baixar cópia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Dimensionar texto automaticamente para caber nas caixas"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Dica: Segure Ctrl (Cmd) ou Shift para selecionar várias ca
|
||||
title = "Fixar texto editado em um único elemento PDF"
|
||||
description = "Quando ativado, o editor exporta cada caixa de texto editada como um único elemento de texto PDF para evitar sobreposição de glifos ou fontes misturadas."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Configurações avançadas"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitações da prévia"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Foco em texto e imagem"
|
||||
text = "Este espaço de trabalho foca na edição de texto e no reposicionamento de imagens incorporadas. Elementos gráficos complexos da página, widgets de formulário e gráficos em camadas são preservados para exportação, mas não são totalmente editáveis aqui."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variação da prévia"
|
||||
text = "Alguns visuais (como bordas de tabelas, formas ou aparências de anotações) podem não ser exibidos exatamente na prévia. O PDF exportado mantém os comandos de desenho originais sempre que possível."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visualizador alfa"
|
||||
text = "Este visualizador alfa ainda está evoluindo — certas fontes, cores, efeitos de transparência e detalhes de layout podem mudar levemente. Verifique o PDF gerado antes de compartilhar."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Mesclar caixas selecionadas"
|
||||
merge = "Mesclar seleção"
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultados de adicionar texto"
|
||||
|
||||
[addText.error]
|
||||
failed = "Ocorreu um erro ao adicionar texto ao PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Enviar do celular"
|
||||
description = "Escaneie para enviar fotos. As imagens convertem automaticamente para PDF."
|
||||
descriptionNoConvert = "Escaneie para enviar fotos do seu dispositivo móvel."
|
||||
error = "Erro de conexão"
|
||||
pollingError = "Erro ao verificar arquivos"
|
||||
sessionId = "ID da sessão"
|
||||
sessionCreateError = "Falha ao criar sessão"
|
||||
expiryWarning = "Sessão expirando em breve"
|
||||
expiryWarningMessage = "Este QR code expirará em {{seconds}} segundos. Um novo código será gerado automaticamente."
|
||||
filesReceived = "{{count}} arquivo(s) recebido(s)"
|
||||
connected = "Dispositivo móvel conectado"
|
||||
instructions = "Escaneie com a câmera do seu celular. As imagens convertem para PDF automaticamente."
|
||||
instructionsNoConvert = "Escaneie com a câmera do seu celular para enviar arquivos."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Scanner móvel"
|
||||
noSession = "Sessão inválida"
|
||||
noSessionMessage = "Escaneie um QR code válido para acessar esta página."
|
||||
validating = "Validando sessão..."
|
||||
sessionInvalid = "Erro de sessão"
|
||||
sessionExpired = "Esta sessão expirou. Atualize e tente novamente."
|
||||
sessionNotFound = "Sessão não encontrada. Atualize e tente novamente."
|
||||
sessionValidationError = "Não foi possível verificar a sessão. Tente novamente."
|
||||
uploadSuccess = "Envio concluído!"
|
||||
uploadSuccessMessage = "Suas imagens foram transferidas."
|
||||
httpsRequired = "O acesso à câmera requer HTTPS ou localhost. Use HTTPS ou acesse via localhost."
|
||||
uploadFailed = "Falha no envio. Tente novamente."
|
||||
uploading = "Enviando..."
|
||||
connected = "Conectado"
|
||||
connecting = "Conectando..."
|
||||
chooseMethod = "Escolha o método de envio"
|
||||
chooseMethodDescription = "Selecione como você deseja escanear e enviar documentos"
|
||||
camera = "Câmera"
|
||||
cameraDescription = "Escaneie documentos usando a câmera do seu dispositivo com detecção automática de bordas"
|
||||
fileUpload = "Envio de arquivo"
|
||||
fileDescription = "Enviar fotos ou documentos existentes do seu dispositivo"
|
||||
cameraAccessDenied = "Acesso à câmera negado. Habilite o acesso à câmera."
|
||||
back = "Voltar"
|
||||
settings = "Configurações"
|
||||
edgeDetection = "Detecção de bordas"
|
||||
flashlight = "Lanterna"
|
||||
flash = "Flash"
|
||||
processing = "Processando..."
|
||||
capture = "Capturar foto"
|
||||
selectFilesPrompt = "Selecione arquivos para enviar"
|
||||
selectImage = "Selecionar imagem"
|
||||
preview = "Prévia"
|
||||
retake = "Refazer foto"
|
||||
addToBatch = "Adicionar ao lote"
|
||||
upload = "Enviar"
|
||||
batchImages = "Lote"
|
||||
clearBatch = "Limpar"
|
||||
uploadAll = "Enviar tudo"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Tem alterações não guardadas no seu PDF."
|
||||
pendingRedactionsTitle = "Ocultações não aplicadas"
|
||||
pendingRedactions = "Tem ocultações não aplicadas que serão perdidas."
|
||||
areYouSure = "Tem a certeza de que pretende sair?"
|
||||
unsavedChangesTitle = "Alterações não guardadas"
|
||||
keepWorking = "Continuar a trabalhar"
|
||||
discardChanges = "Descartar e sair"
|
||||
discardRedactions = "Descartar e sair"
|
||||
applyAndContinue = "Guardar e sair"
|
||||
exportAndContinue = "Exportar e continuar"
|
||||
cancel = "Cancelar"
|
||||
@@ -134,7 +131,7 @@ unsupported = "Não suportado"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Escolha uma ferramenta para começar"
|
||||
alpha = "Alpha"
|
||||
alpha = "Alfa"
|
||||
premiumFeature = "Funcionalidade premium:"
|
||||
comingSoon = "Em breve:"
|
||||
|
||||
@@ -343,10 +340,6 @@ advance = "Avançado"
|
||||
edit = "Ver & Editar"
|
||||
popular = "Popular"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferências"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avançado"
|
||||
title = "Segurança e Autenticação"
|
||||
security = "Segurança"
|
||||
connections = "Ligações"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licenciamento e Análises"
|
||||
@@ -377,12 +369,12 @@ usageAnalytics = "Análise de utilização"
|
||||
|
||||
[settings.policiesPrivacy]
|
||||
title = "Políticas e Privacidade"
|
||||
legal = "Legal"
|
||||
legal = "Jurídico"
|
||||
privacy = "Privacidade"
|
||||
|
||||
[settings.developer]
|
||||
title = "Programador"
|
||||
apiKeys = "API Keys"
|
||||
apiKeys = "Chaves de API"
|
||||
|
||||
[settings.tooltips]
|
||||
enableLoginFirst = "Ative primeiro o modo de login"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versão atual"
|
||||
latestVersion = "Última versão"
|
||||
checkForUpdates = "Procurar atualizações"
|
||||
viewDetails = "Ver detalhes"
|
||||
serverNeedsUpdate = "O servidor precisa de ser atualizado pelo administrador"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informações da versão"
|
||||
description = "Detalhes das versões de desktop e servidor"
|
||||
desktop = "Versão de desktop"
|
||||
server = "Versão do servidor"
|
||||
|
||||
[settings.security]
|
||||
title = "Segurança"
|
||||
description = "Atualize a sua palavra-passe para manter a sua conta segura."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Altere a sua palavra-passe. Será terminada a sua sessão após a atualização."
|
||||
required = "Todos os campos são obrigatórios."
|
||||
mismatch = "As novas palavras-passe não coincidem."
|
||||
error = "Não foi possível atualizar a palavra-passe. Verifique a sua palavra-passe atual e tente novamente."
|
||||
success = "Palavra-passe atualizada com sucesso. Inicie sessão novamente."
|
||||
ssoDisabled = "As alterações de palavra-passe são geridas pelo seu fornecedor de identidade."
|
||||
current = "Palavra-passe atual"
|
||||
currentPlaceholder = "Introduza a sua palavra-passe atual"
|
||||
new = "Nova palavra-passe"
|
||||
newPlaceholder = "Introduza uma nova palavra-passe"
|
||||
confirm = "Confirmar nova palavra-passe"
|
||||
confirmPlaceholder = "Volte a introduzir a sua nova palavra-passe"
|
||||
update = "Atualizar palavra-passe"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Atalhos de teclado"
|
||||
@@ -522,16 +488,11 @@ low = "Baixa"
|
||||
title = "Alterar Credenciais"
|
||||
header = "Atualizar os Detalhes da sua Conta"
|
||||
changePassword = "Está a usar credenciais de login padrão. Por favor insira uma nova palavra-passe"
|
||||
ssoManaged = "A sua conta é gerida pelo seu fornecedor de identidade."
|
||||
newUsername = "Novo Nome de Utilizador"
|
||||
oldPassword = "Palavra-passe Atual"
|
||||
newPassword = "Nova Palavra-passe"
|
||||
confirmNewPassword = "Confirmar Nova Palavra-passe"
|
||||
submit = "Submeter Alterações"
|
||||
credsUpdated = "Conta atualizada"
|
||||
description = "Alterações guardadas. Inicie sessão novamente."
|
||||
error = "Não foi possível atualizar o nome de utilizador. Verifique a sua palavra-passe e tente novamente."
|
||||
changeUsername = "Atualize o seu nome de utilizador. Será terminada a sua sessão após a atualização."
|
||||
|
||||
[account]
|
||||
title = "Definições de Conta"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Definições de Conta"
|
||||
adminSettings = "Definições de Administrador - Ver e Adicionar Utilizadores"
|
||||
userControlSettings = "Definições de Controlo de Utilizador"
|
||||
changeUsername = "Alterar Nome de Utilizador"
|
||||
changeUsernameDescription = "Atualize o seu nome de utilizador. Será terminada a sua sessão após a atualização."
|
||||
newUsernamePlaceholder = "Introduza o seu novo nome de utilizador"
|
||||
newUsername = "Novo Nome de Utilizador"
|
||||
password = "Palavra-passe de Confirmação"
|
||||
oldPassword = "Palavra-passe antiga"
|
||||
@@ -749,11 +708,6 @@ tags = "assinatura,autógrafo"
|
||||
title = "Assinar"
|
||||
desc = "Adiciona assinatura ao PDF por desenho, texto ou imagem"
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotar,realçar,desenhar"
|
||||
title = "Anotar"
|
||||
desc = "Realçar, desenhar, adicionar notas e formas no visualizador"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplificar,remover,interativo"
|
||||
title = "Achatar"
|
||||
@@ -964,8 +918,8 @@ desc = "Sobrepõe PDFs em cima de outro PDF"
|
||||
title = "Sobrepor PDFs"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor de texto PDF"
|
||||
desc = "Revise e edite exportações JSON do Stirling PDF com edição de texto agrupado e regeneração de PDF"
|
||||
title = "Editor de texto de PDF"
|
||||
desc = "Edite texto e imagens existentes dentro de PDFs"
|
||||
|
||||
[home.addText]
|
||||
tags = "texto,anotação,etiqueta"
|
||||
@@ -976,7 +930,6 @@ desc = "Adicione texto personalizado em qualquer lugar do seu PDF"
|
||||
addFiles = "Adicionar ficheiros"
|
||||
uploadFromComputer = "Carregar do computador"
|
||||
openFromComputer = "Abrir do computador"
|
||||
mobileUpload = "Carregar do telemóvel"
|
||||
|
||||
[viewPdf]
|
||||
tags = "ver,ler,anotar,texto,imagem"
|
||||
@@ -1272,7 +1225,7 @@ odtExt = "Texto OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Apresentação OpenDocument (.odp)"
|
||||
txtExt = "Texto simples (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Formato de Texto Enriquecido (.rtf)"
|
||||
selectedFiles = "Ficheiros selecionados"
|
||||
noFileSelected = "Nenhum ficheiro selecionado. Use o painel de ficheiros para adicionar ficheiros."
|
||||
convertFiles = "Converter ficheiros"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opções de CBZ para PDF"
|
||||
optimizeForEbook = "Otimizar PDF para leitores de e-books (usa Ghostscript)"
|
||||
cbzOutputOptions = "Opções de PDF para CBZ"
|
||||
cbzDpi = "DPI para renderização de imagem"
|
||||
cbrOptions = "Opções de CBR"
|
||||
cbrOutputOptions = "Opções de PDF para CBR"
|
||||
cbrDpi = "DPI para renderização de imagem"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opções de eBook para PDF"
|
||||
ebookOptionsDesc = "Opções para converter eBooks em PDF"
|
||||
embedAllFonts = "Incorporar todas as fontes"
|
||||
embedAllFontsDesc = "Incorporar todas as fontes do eBook no PDF gerado"
|
||||
includeTableOfContents = "Incluir índice"
|
||||
includeTableOfContentsDesc = "Adicionar um índice gerado ao PDF resultante"
|
||||
includePageNumbers = "Incluir números de página"
|
||||
includePageNumbersDesc = "Adicionar números de página ao PDF gerado"
|
||||
optimizeForEbookPdf = "Otimizar para leitores de eBook"
|
||||
optimizeForEbookPdfDesc = "Otimizar o PDF para leitura em eBook (ficheiro mais pequeno, melhor renderização em dispositivos eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opções de PDF para eBook"
|
||||
epubOptionsDesc = "Opções para converter PDF em EPUB/AZW3"
|
||||
detectChapters = "Detetar capítulos"
|
||||
detectChaptersDesc = "Detetar títulos que parecem capítulos e inserir quebras de página EPUB"
|
||||
targetDevice = "Dispositivo de destino"
|
||||
targetDeviceDesc = "Escolha um perfil de saída otimizado para o dispositivo de leitura"
|
||||
outputFormat = "Formato de saída"
|
||||
outputFormatDesc = "Escolha o formato de saída para o eBook"
|
||||
tabletPhone = "Tablet/Telemóvel (com imagens)"
|
||||
kindleEink = "Kindle e-Ink (texto otimizado)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversão,img,jpg,imagem,foto"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Adicionar anexo"
|
||||
remove = "Remover anexo"
|
||||
embed = "Incorporar anexo"
|
||||
convertToPdfA3b = "Converter para PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Cria um PDF de arquivo com anexos incorporados"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b é um formato de arquivo que garante preservação a longo prazo. Permite incorporar formatos de ficheiro arbitrários como anexos. A conversão requer Ghostscript e pode demorar mais para ficheiros grandes."
|
||||
convertToPdfA3bTooltipHeader = "Sobre a conversão PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "O que faz"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1447,7 +1368,7 @@ title = "Adicionar Marca de Água"
|
||||
desc = "Adicionar marcas de água de texto ou imagem a ficheiros PDF"
|
||||
completed = "Marca de água adicionada"
|
||||
submit = "Adicionar Marca de Água"
|
||||
filenamePrefix = "watermarked"
|
||||
filenamePrefix = "com-marca-de-água"
|
||||
|
||||
[watermark.error]
|
||||
failed = "Ocorreu um erro ao adicionar a marca de água ao PDF."
|
||||
@@ -2385,10 +2306,6 @@ saved = "Guardadas"
|
||||
label = "Carregar imagem da assinatura"
|
||||
placeholder = "Selecione ficheiro de imagem"
|
||||
hint = "Carregue uma imagem PNG ou JPG da sua assinatura"
|
||||
removeBackground = "Remover fundo branco (tornar transparente)"
|
||||
processing = "A processar imagem..."
|
||||
backgroundRemovalFailedTitle = "Falha na remoção do fundo"
|
||||
backgroundRemovalFailedMessage = "Não foi possível remover o fundo da imagem. A usar a imagem original."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Como adicionar a assinatura"
|
||||
@@ -2434,11 +2351,6 @@ note = "O aplanamento remove elementos interativos do PDF, tornando‑os não ed
|
||||
label = "Achatar apenas formulários"
|
||||
desc = "Apenas aplanar campos de formulário, deixando outros elementos interativos intactos"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de renderização (opcional, recomendado 150 DPI)"
|
||||
help = "Deixe em branco para usar o padrão do sistema. Um DPI mais alto torna a saída mais nítida, mas aumenta o tempo de processamento e o tamanho do ficheiro."
|
||||
placeholder = "ex.: 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Resultados do Aplanamento"
|
||||
|
||||
@@ -2945,7 +2857,7 @@ label = "Fator de escala"
|
||||
[adjustPageScale.pageSize]
|
||||
label = "Tamanho da página de destino"
|
||||
keep = "Manter tamanho original"
|
||||
letter = "Letter"
|
||||
letter = "Carta"
|
||||
legal = "Legal"
|
||||
|
||||
[adjustPageScale.error]
|
||||
@@ -3013,7 +2925,6 @@ header = "Recortar PDF"
|
||||
submit = "Submeter"
|
||||
noFileSelected = "Selecione um ficheiro PDF para começar a recortar"
|
||||
reset = "Repor para PDF completo"
|
||||
autoCrop = "Recortar automaticamente espaços em branco"
|
||||
|
||||
[crop.preview]
|
||||
title = "Seleção da área de recorte"
|
||||
@@ -3244,7 +3155,6 @@ title = "Método de ocultação"
|
||||
mode = "Modo"
|
||||
automatic = "Automático"
|
||||
automaticDesc = "Oculta texto com base em termos de pesquisa"
|
||||
automaticDisabledTooltip = "Selecione ficheiros no gestor de ficheiros para ocultar vários ficheiros de uma vez"
|
||||
manual = "Manual"
|
||||
manualDesc = "Clique e arraste para ocultar áreas específicas"
|
||||
manualComingSoon = "Ocultação manual em breve"
|
||||
@@ -3315,35 +3225,8 @@ text = "Apenas corresponde a palavras completas, não correspondências parciais
|
||||
title = "Converter para PDF-Imagem"
|
||||
text = "Converte o PDF para um PDF baseado em imagem após a ocultação. Isso garante que o texto por detrás das caixas de ocultação seja completamente removido e irrecuperável."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controlos de ocultação manual"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Ferramenta Marcar texto"
|
||||
text = "Selecione texto diretamente no PDF para o marcar para ocultação. Clique e arraste para realçar texto específico que pretende ocultar."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Ferramenta Marcar área"
|
||||
text = "Desenhe áreas retangulares no PDF para marcar regiões para ocultação. Útil para ocultar imagens, assinaturas ou formas irregulares."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplicar ocultações"
|
||||
text = "Depois de marcar o conteúdo, clique em 'Aplicar' para ocultar permanentemente todas as áreas marcadas. A contagem pendente mostra quantas ocultações estão prontas para aplicar."
|
||||
bullet1 = "Marque quantas áreas forem necessárias antes de aplicar"
|
||||
bullet2 = "Todas as ocultações pendentes são aplicadas de uma vez"
|
||||
bullet3 = "As ocultações não podem ser anuladas após aplicar"
|
||||
|
||||
[redact.manual]
|
||||
title = "Ferramentas de ocultação"
|
||||
instructions = "Selecione texto ou desenhe áreas no PDF para marcar conteúdo para ocultação."
|
||||
markText = "Marcar texto"
|
||||
markArea = "Marcar área"
|
||||
pendingLabel = "Pendente:"
|
||||
applyWarning = "⚠️ Aplicação permanente, não pode ser anulada e os dados subjacentes serão eliminados"
|
||||
apply = "Aplicar"
|
||||
noMarks = "Sem marcas de ocultação. Utilize as ferramentas acima para marcar conteúdo para ocultação."
|
||||
header = "Ocultação manual"
|
||||
controlsTitle = "Controlos de ocultação manual"
|
||||
textBasedRedaction = "Ocultação baseada em texto"
|
||||
pageBasedRedaction = "Ocultação baseada em página"
|
||||
convertPDFToImageLabel = "Converter PDF para PDF-Imagem (usado para remover o texto por detrás da caixa)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Introduza número de divisões horizontais"
|
||||
label = "Divisões Verticais"
|
||||
placeholder = "Introduza número de divisões verticais"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Modo de divisão"
|
||||
description = "Escolha como dividir as páginas"
|
||||
splitAll = "Dividir todas as páginas"
|
||||
splitAllExceptFirst = "Dividir todas exceto a primeira"
|
||||
splitAllExceptLast = "Dividir todas exceto a última"
|
||||
splitAllExceptFirstAndLast = "Dividir todas exceto a primeira e a última"
|
||||
custom = "Páginas personalizadas"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Números de página personalizados"
|
||||
placeholder = "ex.: 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Carimbo, Adicionar imagem, imagem central, Marca de água, PDF, Incorporar, Personalizar"
|
||||
header = "Carimbar PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Tamanho do Ficheiro"
|
||||
[compress.grayscale]
|
||||
label = "Aplicar escala de cinzentos para compressão"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearizar PDF para visualização rápida na Web"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Converter imagens em arte linear"
|
||||
description = "Usa o ImageMagick para reduzir páginas a preto e branco de alto contraste para máxima redução de tamanho."
|
||||
unavailable = "O ImageMagick não está instalado ou ativado neste servidor"
|
||||
detailLevel = "Nível de detalhe"
|
||||
edgeEmphasis = "Ênfase nos contornos"
|
||||
edgeLow = "Suave"
|
||||
edgeMedium = "Equilibrada"
|
||||
edgeHigh = "Forte"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Visão geral das definições de compressão"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Valores mais altos reduzem o tamanho do ficheiro"
|
||||
title = "Tons de cinzento"
|
||||
text = "Selecione esta opção para converter todas as imagens para preto e branco, o que pode reduzir significativamente o tamanho do ficheiro, especialmente para PDFs digitalizados ou documentos com muitas imagens."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Arte linear"
|
||||
text = "Converter páginas em preto e branco de alto contraste usando o ImageMagick. Use o nível de detalhe para controlar quanto conteúdo se torna preto e a ênfase nos contornos para controlar quão agressiva é a deteção de arestas."
|
||||
|
||||
[compress.error]
|
||||
failed = "Ocorreu um erro ao comprimir o PDF."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "Ocorreu um erro ao comprimir o PDF."
|
||||
_value = "Definições de compressão"
|
||||
1 = "1-3 compressão de PDF,</br> 4-6 compressão leve de imagem,</br> 7-9 compressão intensa de imagem irá reduzir drasticamente a qualidade da imagem"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valores mais baixos preservam a qualidade, mas resultam em ficheiros maiores"
|
||||
range4to6 = "Compressão média com redução moderada da qualidade"
|
||||
range7to9 = "Valores mais altos reduzem significativamente o tamanho do ficheiro, mas podem reduzir a clareza das imagens"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Este ficheiro está protegido por palavra-passe. Por favor introduza a palavra-passe:"
|
||||
cancelled = "Operação cancelada para PDF: {0}"
|
||||
@@ -4123,97 +3971,22 @@ deleteSelected = "Eliminar páginas selecionadas"
|
||||
closePdf = "Fechar PDF"
|
||||
exportAll = "Exportar PDF"
|
||||
downloadSelected = "Transferir ficheiros selecionados"
|
||||
annotations = "Anotações"
|
||||
exportSelected = "Exportar páginas selecionadas"
|
||||
saveChanges = "Guardar alterações"
|
||||
downloadAll = "Transferir tudo"
|
||||
saveAll = "Guardar tudo"
|
||||
toggleTheme = "Alternar tema"
|
||||
toggleBookmarks = "Alternar marcadores"
|
||||
language = "Idioma"
|
||||
toggleAnnotations = "Alternar visibilidade das anotações"
|
||||
search = "Pesquisar PDF"
|
||||
panMode = "Modo de deslocamento"
|
||||
applyRedactionsFirst = "Aplique as ocultações primeiro"
|
||||
rotateLeft = "Rodar à esquerda"
|
||||
rotateRight = "Rodar à direita"
|
||||
toggleSidebar = "Alternar barra lateral"
|
||||
toggleBookmarks = "Alternar marcadores"
|
||||
exportSelected = "Exportar páginas selecionadas"
|
||||
toggleAnnotations = "Alternar visibilidade das anotações"
|
||||
annotationMode = "Alternar modo de anotação"
|
||||
print = "Imprimir PDF"
|
||||
draw = "Desenhar"
|
||||
redact = "Ocultar"
|
||||
exitRedaction = "Sair do modo de ocultação"
|
||||
save = "Guardar"
|
||||
downloadAll = "Transferir tudo"
|
||||
saveAll = "Guardar tudo"
|
||||
|
||||
[textAlign]
|
||||
left = "Esquerda"
|
||||
center = "Centro"
|
||||
right = "Direita"
|
||||
|
||||
[annotation]
|
||||
title = "Anotar"
|
||||
desc = "Use realce, caneta, texto e notas. As alterações permanecem ativas — não é necessário achatar."
|
||||
highlight = "Realçar"
|
||||
pen = "Caneta"
|
||||
text = "Caixa de texto"
|
||||
note = "Nota"
|
||||
rectangle = "Retângulo"
|
||||
ellipse = "Elipse"
|
||||
select = "Selecionar"
|
||||
exit = "Sair do modo de anotação"
|
||||
strokeWidth = "Largura"
|
||||
opacity = "Opacidade"
|
||||
strokeOpacity = "Opacidade do contorno"
|
||||
fillOpacity = "Opacidade do preenchimento"
|
||||
fontSize = "Tamanho da letra"
|
||||
chooseColor = "Escolher cor"
|
||||
color = "Cor"
|
||||
strokeColor = "Cor do contorno"
|
||||
fillColor = "Cor de preenchimento"
|
||||
underline = "Sublinhar"
|
||||
strikeout = "Tachado"
|
||||
squiggly = "Ondulado"
|
||||
inkHighlighter = "Realce à mão livre"
|
||||
freehandHighlighter = "Realce à mão livre"
|
||||
square = "Quadrado"
|
||||
circle = "Círculo"
|
||||
polygon = "Polígono"
|
||||
line = "Linha"
|
||||
stamp = "Adicionar imagem"
|
||||
textMarkup = "Marcação de texto"
|
||||
drawing = "Desenho"
|
||||
shapes = "Formas"
|
||||
notesStamps = "Notas e carimbos"
|
||||
settings = "Definições"
|
||||
borderOn = "Contorno: Ativado"
|
||||
borderOff = "Contorno: Desativado"
|
||||
editInk = "Editar caneta"
|
||||
editLine = "Editar linha"
|
||||
editNote = "Editar nota"
|
||||
editText = "Editar caixa de texto"
|
||||
editTextMarkup = "Editar marcação de texto"
|
||||
editSelected = "Editar anotação"
|
||||
editSquare = "Editar quadrado"
|
||||
editCircle = "Editar círculo"
|
||||
editPolygon = "Editar polígono"
|
||||
unsupportedType = "Este tipo de anotação não é totalmente suportado para edição."
|
||||
textAlignment = "Alinhamento do texto"
|
||||
noteIcon = "Ícone da nota"
|
||||
imagePreview = "Pré-visualização"
|
||||
contents = "Texto"
|
||||
backgroundColor = "Cor de fundo"
|
||||
clearBackground = "Remover fundo"
|
||||
noBackground = "Sem fundo"
|
||||
stampSettings = "Definições do carimbo"
|
||||
savingCopy = "A preparar transferência..."
|
||||
saveFailed = "Não foi possível guardar a cópia"
|
||||
saveReady = "Transferência pronta"
|
||||
selectAndMove = "Selecionar e editar"
|
||||
editSelectDescription = "Clique numa anotação existente para editar a cor, opacidade, texto ou tamanho."
|
||||
editStampHint = "Para alterar a imagem, elimine este carimbo e adicione um novo."
|
||||
editSwitchToSelect = "Mude para Selecionar e Editar para editar esta anotação."
|
||||
undo = "Anular"
|
||||
redo = "Refazer"
|
||||
applyChanges = "Aplicar alterações"
|
||||
saveChanges = "Guardar alterações"
|
||||
|
||||
[search]
|
||||
@@ -4265,20 +4038,12 @@ settings = "Ajustes"
|
||||
adminSettings = "Ajustes admin"
|
||||
allTools = "All Tools"
|
||||
reader = "Leitor"
|
||||
tours = "Visitas guiadas"
|
||||
showMeAround = "Faz-me uma visita guiada"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Veja aqui as visitas guiadas: visita às Ferramentas, visita ao novo layout V2 e visita de Administração."
|
||||
user = "Veja aqui as visitas guiadas: visita às Ferramentas e visita ao novo layout V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Visita guiada às ferramentas"
|
||||
toolsTourDesc = "Saiba o que as ferramentas podem fazer"
|
||||
adminTour = "Visita guiada de administração"
|
||||
adminTourDesc = "Explore definições e funcionalidades de administração"
|
||||
whatsNewTour = "Veja o que há de novo no V2"
|
||||
whatsNewTourDesc = "Visite o layout atualizado"
|
||||
|
||||
[admin]
|
||||
error = "Erro"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Falha ao carregar definições"
|
||||
saveError = "Falha ao guardar definições"
|
||||
saved = "Definições guardadas com êxito"
|
||||
saveSuccess = "Definições guardadas com êxito"
|
||||
success = "Definições guardadas com sucesso"
|
||||
error = "Falha ao guardar as definições"
|
||||
save = "Guardar alterações"
|
||||
discard = "Descartar"
|
||||
restartRequired = "É necessário reiniciar"
|
||||
@@ -4422,13 +4185,6 @@ description = "Caminho para o executável WeasyPrint para conversão de HTML par
|
||||
label = "Executável Unoconvert"
|
||||
description = "Caminho para o LibreOffice unoconvert para conversões de documentos (deixe vazio para predefinição: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "URL do frontend"
|
||||
description = "URL base para o frontend (por exemplo, https://pdf.example.com). Usado para links de convite por e-mail e carregamentos por código QR no telemóvel. Deixe vazio para usar o URL do backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Clique para ver os detalhes do plano"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Segurança"
|
||||
description = "Configurar autenticação, comportamento de início de sessão e políticas de segurança."
|
||||
@@ -4565,19 +4321,6 @@ connect = "Ligar"
|
||||
disconnect = "Desligar"
|
||||
disconnected = "Fornecedor desligado com sucesso"
|
||||
disconnectError = "Falha ao desligar fornecedor"
|
||||
mobileScannerConvertToPdf = "Converter imagens em PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converter automaticamente as imagens carregadas para o formato PDF. Se desativado, as imagens serão mantidas como estão."
|
||||
mobileScannerImageResolution = "Resolução da imagem"
|
||||
mobileScannerImageResolutionDesc = "Resolução das imagens carregadas. \"Reduzida\" redimensiona as imagens até 1200 px para reduzir o tamanho do ficheiro."
|
||||
imageResolutionFull = "Completa (tamanho original)"
|
||||
imageResolutionReduced = "Reduzida (máx. 1200 px)"
|
||||
mobileScannerPageFormat = "Formato de página"
|
||||
mobileScannerPageFormatDesc = "Tamanho da página PDF para imagens convertidas. \"Manter\" usa as dimensões originais da imagem."
|
||||
pageFormatKeep = "Manter (dimensões originais)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Esticar para ajustar"
|
||||
mobileScannerStretchToFitDesc = "Esticar as imagens para preencher toda a página. Se desativado, as imagens são centradas com proporção preservada."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Início de sessão automático SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Criar automaticamente contas de utilizador no primeiro início de
|
||||
label = "Bloquear registo"
|
||||
description = "Impedir novo registo de utilizador via SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Carregamento por telemóvel"
|
||||
enable = "Ativar carregamento por código QR"
|
||||
description = "Permitir que os utilizadores carreguem ficheiros de dispositivos móveis ao digitalizar um código QR"
|
||||
note = "Nota: Requer configuração do URL do frontend. "
|
||||
link = "Configurar nas Definições do Sistema"
|
||||
mobileScannerConvertToPdf = "Converter imagens em PDF"
|
||||
mobileScannerConvertToPdfDesc = "Converter automaticamente as imagens carregadas para o formato PDF. Se desativado, as imagens serão mantidas como estão."
|
||||
mobileScannerImageResolution = "Resolução da imagem"
|
||||
mobileScannerImageResolutionDesc = "Resolução das imagens carregadas. \"Reduzida\" redimensiona as imagens até 1200 px para reduzir o tamanho do ficheiro."
|
||||
imageResolutionFull = "Completa (tamanho original)"
|
||||
imageResolutionReduced = "Reduzida (máx. 1200 px)"
|
||||
mobileScannerPageFormat = "Formato de página"
|
||||
mobileScannerPageFormatDesc = "Tamanho da página PDF para imagens convertidas. \"Manter\" usa as dimensões originais da imagem."
|
||||
pageFormatKeep = "Manter (dimensões originais)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Esticar para ajustar"
|
||||
mobileScannerStretchToFitDesc = "Esticar as imagens para preencher toda a página. Se desativado, as imagens são centradas com proporção preservada."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot do Telegram"
|
||||
description = "Configurar a conectividade do bot Telegram, controlos de acesso e comportamento de feedback."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Ativar bot do Telegram"
|
||||
description = "Permitir que os utilizadores interajam com o Stirling PDF através do seu bot Telegram configurado."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nome de utilizador do bot"
|
||||
description = "O nome de utilizador público do seu bot Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token do bot"
|
||||
description = "Token de API fornecido pelo BotFather para o seu bot Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Pasta de entrada"
|
||||
description = "Pasta no diretório da pipeline onde são guardados os ficheiros recebidos do Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Usar sufixo de pasta personalizado"
|
||||
description = "Anexar o ID do chat às pastas de ficheiros recebidos para isolar carregamentos por chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Controlo de acesso"
|
||||
description = "Restringir que utilizadores ou canais podem interagir com o bot."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Permitir IDs de utilizador específicos"
|
||||
description = "Quando ativado, apenas os IDs de utilizador listados podem usar o bot."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "IDs de utilizador permitidos"
|
||||
description = "Introduza os IDs de utilizador do Telegram autorizados a interagir com o bot."
|
||||
placeholder = "Adicione o ID do utilizador e prima Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Permitir IDs de canal específicos"
|
||||
description = "Quando ativado, apenas os IDs de canal listados podem usar o bot."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "IDs de canal permitidos"
|
||||
description = "Introduza os IDs de canal do Telegram autorizados a interagir com o bot."
|
||||
placeholder = "Adicione o ID do canal e prima Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Processamento"
|
||||
description = "Controlar intervalos de polling e tempos limite de processamento para carregamentos do Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Tempo limite de processamento (segundos)"
|
||||
description = "Tempo máximo de espera por um trabalho de processamento antes de reportar um erro."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Intervalo de polling (ms)"
|
||||
description = "Intervalo entre verificações de novas atualizações do Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Mensagens de feedback"
|
||||
description = "Escolha quando o bot deve enviar feedback para utilizadores e canais."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Ativar feedback"
|
||||
description = "Controlar se o bot envia mensagens de feedback."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Regras de feedback para canais"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Mostrar \"Nenhum documento válido\" (Canal)"
|
||||
description = "Suprimir a resposta de nenhum documento válido para carregamentos em canais."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Mostrar erros de processamento (Canal)"
|
||||
description = "Enviar mensagens de erro de processamento para canais."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Mostrar mensagens de erro (Canal)"
|
||||
description = "Mostrar mensagens de erro detalhadas para canais."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Regras de feedback para utilizadores"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Mostrar \"Nenhum documento válido\" (Utilizador)"
|
||||
description = "Suprimir a resposta de nenhum documento válido para carregamentos de utilizadores."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Mostrar erros de processamento (Utilizador)"
|
||||
description = "Enviar mensagens de erro de processamento para utilizadores."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Mostrar mensagens de erro (Utilizador)"
|
||||
description = "Mostrar mensagens de erro detalhadas para utilizadores."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Base de dados"
|
||||
description = "Configurar definições personalizadas de ligação a base de dados para implementações empresariais."
|
||||
@@ -4943,10 +4570,6 @@ description = "Permitir que os administradores convidem utilizadores por email c
|
||||
label = "URL do frontend"
|
||||
description = "URL base do frontend (por ex. https://pdf.example.com). Usado para gerar ligações de convite nos emails. Deixe vazio para usar o URL do backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Nota: Requer configuração do URL do frontend. "
|
||||
link = "Configurar nas Definições do Sistema"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documentos legais"
|
||||
description = "Configurar ligações para documentos e políticas legais."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Os meus ficheiros"
|
||||
noRecentFiles = "Nenhum ficheiro recente encontrado"
|
||||
googleDriveNotAvailable = "Integração com Google Drive não disponível"
|
||||
mobileUpload = "Carregamento por telemóvel"
|
||||
mobileShort = "Telemóvel"
|
||||
mobileUploadNotAvailable = "Carregamento por telemóvel não ativado"
|
||||
downloadSelected = "Transferir selecionados"
|
||||
saveSelected = "Guardar selecionados"
|
||||
openFiles = "Abrir ficheiros"
|
||||
@@ -5449,7 +5069,6 @@ loading = "A carregar..."
|
||||
back = "Voltar"
|
||||
continue = "Continuar"
|
||||
error = "Erro"
|
||||
save = "Guardar"
|
||||
|
||||
[config.overview]
|
||||
title = "Configuração da aplicação"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Quaisquer aplicações ou serviços que estejam a usar estas chaves de
|
||||
confirmPrompt = "Tem a certeza de que pretende continuar?"
|
||||
confirmCta = "Atualizar chaves"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Erro de chave de API"
|
||||
failedToCreateApiKey = "Falha ao criar a chave de API."
|
||||
failedToRetrieveApiKey = "Falha ao obter a chave de API da resposta."
|
||||
failedToFetchApiKey = "Falha ao obter a chave de API."
|
||||
apiKeyRefreshed = "Chave de API atualizada"
|
||||
apiKeyRefreshedBody = "A sua chave de API foi atualizada com sucesso."
|
||||
failedToRefreshApiKey = "Falha ao atualizar a chave de API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Selecionar anexos"
|
||||
info = "Selecione ficheiros para anexar ao seu PDF. Estes ficheiros serão incorporados e acessíveis através do painel de anexos do PDF."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Concluir"
|
||||
startTour = "Iniciar visita"
|
||||
startTourDescription = "Faça uma visita guiada às principais funcionalidades do Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Comece na barra de <strong>Acesso Rápido</strong> para alternar entre o Leitor, Automatizar, os seus ficheiros e todas as visitas guiadas."
|
||||
leftPanel = "O painel esquerdo de <strong>Ferramentas</strong> lista tudo o que pode fazer. Navegue pelas categorias ou pesquise para encontrar rapidamente uma ferramenta."
|
||||
fileUpload = "Use o botão <strong>Ficheiros</strong> para carregar ou escolher um PDF recente. Carregamos um exemplo para que possa ver o espaço de trabalho."
|
||||
rightRail = "A <strong>barra direita</strong> contém ações rápidas para selecionar ficheiros, alterar o tema ou idioma e transferir resultados."
|
||||
topBar = "A barra superior permite alternar entre <strong>Visualizador</strong>, <strong>Editor de Páginas</strong> e <strong>Ficheiros Ativos</strong>."
|
||||
pageEditorView = "Mude para o Editor de Páginas para reordenar, rodar ou eliminar páginas."
|
||||
activeFilesView = "Use Ficheiros Ativos para ver tudo o que tem aberto e escolher em que trabalhar."
|
||||
wrapUp = "Isto é o que há de novo no V2. Abra o menu <strong>Visitas guiadas</strong> a qualquer momento para rever esta, a visita das Ferramentas ou a visita de Administração."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Bem-vindo ao Stirling PDF!"
|
||||
description = "Gostaria de fazer uma visita guiada de 1 minuto para conhecer as principais funcionalidades e como começar?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Transferir →"
|
||||
showMeAround = "Mostre-me"
|
||||
skipTheTour = "Saltar a visita guiada"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Visão geral da visita guiada"
|
||||
body = "O Stirling PDF V2 inclui dezenas de ferramentas e um layout renovado. Faça uma visita rápida para ver o que mudou e onde encontrar as funcionalidades de que precisa."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Saltar por agora"
|
||||
seePlans = "Ver planos →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Atualizar agora →"
|
||||
freeTitle = "Licença do servidor"
|
||||
overLimitTitle = "É necessária licença de servidor"
|
||||
overLimitBody = "A nossa licença permite até <strong>{{freeTierLimit}}</strong> utilizadores gratuitos por servidor. Tem <strong>{{overLimitUserCopy}}</strong> utilizadores Stirling. Para continuar sem interrupções, atualize para o plano Stirling Server - <strong>lugares ilimitados</strong>, edição de texto em PDF e controlo total de administração por $99/servidor/mês."
|
||||
freeBody = "A nossa licença <strong>Open-Core</strong> permite até <strong>{{freeTierLimit}}</strong> utilizadores gratuitos por servidor. Para escalar sem interrupções e obter acesso antecipado à nossa nova <strong>ferramenta de edição de texto PDF</strong>, recomendamos o plano Stirling Server - edição completa e <strong>lugares ilimitados</strong> por $99/servidor/mês."
|
||||
freeBody = "O nosso licenciamento <strong>Open-Core</strong> permite até <strong>{{freeTierLimit}}</strong> utilizadores gratuitos por servidor. Para escalar sem interrupções, recomendamos o plano Stirling Server - <strong>lugares ilimitados</strong> e <strong>suporte SSO</strong> por $99/servidor/mês."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Transferir"
|
||||
@@ -5841,7 +5437,7 @@ submit = "Gerar link de convite"
|
||||
[workspace.people.inviteMode]
|
||||
username = "Nome de utilizador"
|
||||
email = "Email"
|
||||
link = "Link"
|
||||
link = "Ligação"
|
||||
emailDisabled = "Convites por email requerem configuração de SMTP e mail.enableInvites=true nas definições"
|
||||
|
||||
[workspace.people.license]
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contactar Vendas"
|
||||
contactToUpgrade = "Contacte-nos para atualizar ou personalizar o seu plano"
|
||||
maxUsers = "Máximo de utilizadores"
|
||||
upTo = "Até"
|
||||
getLicense = "Obter licença do servidor"
|
||||
upgradeToEnterprise = "Atualizar para Enterprise"
|
||||
selectPeriod = "Selecionar período de faturação"
|
||||
monthlyBilling = "Faturação mensal"
|
||||
yearlyBilling = "Faturação anual"
|
||||
checkoutOpened = "Checkout aberto"
|
||||
checkoutInstructions = "Conclua a sua compra no separador do Stripe. Após o pagamento, volte aqui e atualize a página para ativar a sua licença. Também receberá um e-mail com a sua chave de licença."
|
||||
activateLicense = "Ativar a sua licença"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout aberto num novo separador"
|
||||
instructions = "Conclua a sua compra no separador do Stripe. Assim que o pagamento estiver concluído, receberá um e-mail com a sua chave de licença."
|
||||
enterKey = "Introduza abaixo a sua chave de licença para ativar o seu plano:"
|
||||
keyDescription = "Cole a chave de licença do seu e-mail"
|
||||
activate = "Ativar licença"
|
||||
doLater = "Farei isto mais tarde"
|
||||
success = "Licença ativada!"
|
||||
successMessage = "A sua licença foi ativada com sucesso. Pode fechar esta janela."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Verificação de e-mail necessária"
|
||||
message = "Terá de verificar o seu endereço de e-mail no portal de faturação do Stripe. Verifique o seu e-mail para um link de início de sessão."
|
||||
|
||||
[plan.period]
|
||||
month = "mês"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistema de auditoria não disponível"
|
||||
notAvailableMessage = "O sistema de auditoria não está configurado ou não está disponível."
|
||||
disabled = "Registo de auditoria desativado"
|
||||
disabledMessage = "Ative o registo de auditoria na configuração da sua aplicação para rastrear eventos do sistema."
|
||||
enterpriseRequired = "Licença Enterprise necessária"
|
||||
enterpriseRequiredMessage = "O sistema de registo de auditoria é uma funcionalidade Enterprise. Atualize para uma licença Enterprise para aceder a registos de auditoria e análises."
|
||||
|
||||
[audit.error]
|
||||
title = "Erro ao carregar o sistema de auditoria"
|
||||
@@ -6370,7 +5942,6 @@ description = "Introduza o URL completo do seu servidor Stirling PDF autoalojado
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Introduza um URL de servidor"
|
||||
invalidUrl = "Formato de URL inválido. Introduza um URL válido como https://your-server.com"
|
||||
unreachable = "Não foi possível ligar ao servidor"
|
||||
testFailed = "Falha no teste de ligação"
|
||||
configFetch = "Falha ao obter a configuração do servidor. Verifique o URL e tente novamente."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "A ligar a:"
|
||||
submit = "Iniciar sessão"
|
||||
signInWith = "Iniciar sessão com"
|
||||
oauthPending = "A abrir o navegador para autenticação..."
|
||||
sso = "Início de sessão único"
|
||||
orContinueWith = "Ou continuar com email"
|
||||
serverRequirement = "Nota: O servidor deve ter o início de sessão ativado."
|
||||
showInstructions = "Como ativar?"
|
||||
@@ -6441,7 +6011,7 @@ paragraph = "Página de parágrafos"
|
||||
sparse = "Texto disperso"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Auto"
|
||||
auto = "Automático"
|
||||
paragraph = "Parágrafo"
|
||||
singleLine = "Linha única"
|
||||
|
||||
@@ -6455,8 +6025,6 @@ reset = "Repor alterações"
|
||||
downloadJson = "Transferir JSON"
|
||||
generatePdf = "Gerar PDF"
|
||||
saveChanges = "Guardar alterações"
|
||||
applyChanges = "Aplicar alterações"
|
||||
downloadCopy = "Transferir cópia"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Dimensionar texto automaticamente para caber nas caixas"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Dica: Mantenha Ctrl (Cmd) ou Shift premido para selecionar
|
||||
title = "Fixar texto editado a um único elemento PDF"
|
||||
description = "Quando ativado, o editor exporta cada caixa de texto editada como um único elemento de texto PDF para evitar sobreposição de glifos ou mistura de fontes."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Definições avançadas"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitações da pré-visualização"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Foco em texto e imagem"
|
||||
text = "Este espaço de trabalho foca-se na edição de texto e no reposicionamento de imagens incorporadas. Arte complexa de página, widgets de formulários e gráficos em camadas são preservados para exportação, mas não são totalmente editáveis aqui."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variações na pré-visualização"
|
||||
text = "Alguns elementos visuais (como bordas de tabelas, formas ou aparências de anotações) podem não ser exibidos exatamente na pré-visualização. O PDF exportado mantém os comandos de desenho originais sempre que possível."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Visualizador alfa"
|
||||
text = "Este visualizador alfa ainda está a evoluir — certas fontes, cores, efeitos de transparência e detalhes de layout podem variar ligeiramente. Verifique o PDF gerado antes de o partilhar."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Unir caixas selecionadas"
|
||||
merge = "Unir seleção"
|
||||
@@ -6556,7 +6106,7 @@ warnings = "Avisos"
|
||||
suggestions = "Notas"
|
||||
currentPageFonts = "Fontes nesta página"
|
||||
allFonts = "Todas as fontes"
|
||||
fallback = "fallback"
|
||||
fallback = "alternativa"
|
||||
missing = "em falta"
|
||||
perfectMessage = "Todas as fontes podem ser reproduzidas na perfeição."
|
||||
warningMessage = "Algumas fontes podem não ser renderizadas corretamente."
|
||||
@@ -6614,58 +6164,3 @@ title = "Resultados de adicionar texto"
|
||||
|
||||
[addText.error]
|
||||
failed = "Ocorreu um erro ao adicionar texto ao PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Carregar do telemóvel"
|
||||
description = "Digitalize para carregar fotos. As imagens convertem-se automaticamente em PDF."
|
||||
descriptionNoConvert = "Digitalize para carregar fotos a partir do seu dispositivo móvel."
|
||||
error = "Erro de ligação"
|
||||
pollingError = "Erro ao verificar ficheiros"
|
||||
sessionId = "ID da sessão"
|
||||
sessionCreateError = "Falha ao criar sessão"
|
||||
expiryWarning = "Sessão a expirar em breve"
|
||||
expiryWarningMessage = "Este código QR irá expirar em {{seconds}} segundos. Será gerado um novo código automaticamente."
|
||||
filesReceived = "{{count}} ficheiro(s) recebido(s)"
|
||||
connected = "Dispositivo móvel ligado"
|
||||
instructions = "Digitalize com a câmara do telemóvel. As imagens convertem-se automaticamente em PDF."
|
||||
instructionsNoConvert = "Digitalize com a câmara do telemóvel para carregar ficheiros."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Digitalizador móvel"
|
||||
noSession = "Sessão inválida"
|
||||
noSessionMessage = "Digitalize um código QR válido para aceder a esta página."
|
||||
validating = "A validar a sessão..."
|
||||
sessionInvalid = "Erro de sessão"
|
||||
sessionExpired = "Esta sessão expirou. Atualize e tente novamente."
|
||||
sessionNotFound = "Sessão não encontrada. Atualize e tente novamente."
|
||||
sessionValidationError = "Não foi possível verificar a sessão. Tente novamente."
|
||||
uploadSuccess = "Carregamento concluído!"
|
||||
uploadSuccessMessage = "As suas imagens foram enviadas."
|
||||
httpsRequired = "O acesso à câmara requer HTTPS ou localhost. Utilize HTTPS ou aceda via localhost."
|
||||
uploadFailed = "Falha no carregamento. Tente novamente."
|
||||
uploading = "A carregar..."
|
||||
connected = "Ligado"
|
||||
connecting = "A ligar..."
|
||||
chooseMethod = "Escolher método de carregamento"
|
||||
chooseMethodDescription = "Selecione como pretende digitalizar e carregar documentos"
|
||||
camera = "Câmara"
|
||||
cameraDescription = "Digitalize documentos com a câmara do seu dispositivo com deteção automática de margens"
|
||||
fileUpload = "Carregar ficheiro"
|
||||
fileDescription = "Carregar fotografias ou documentos existentes do seu dispositivo"
|
||||
cameraAccessDenied = "Acesso à câmara negado. Ative o acesso à câmara."
|
||||
back = "Voltar"
|
||||
settings = "Definições"
|
||||
edgeDetection = "Deteção de margens"
|
||||
flashlight = "Lanterna"
|
||||
flash = "Flash"
|
||||
processing = "A processar..."
|
||||
capture = "Capturar fotografia"
|
||||
selectFilesPrompt = "Selecione os ficheiros a carregar"
|
||||
selectImage = "Selecionar imagem"
|
||||
preview = "Pré-visualizar"
|
||||
retake = "Repetir"
|
||||
addToBatch = "Adicionar ao lote"
|
||||
upload = "Carregar"
|
||||
batchImages = "Lote"
|
||||
clearBatch = "Limpar"
|
||||
uploadAll = "Carregar tudo"
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
unsavedChanges = "Aveți modificări nesalvate în PDF."
|
||||
pendingRedactionsTitle = "Redactări neaplicate"
|
||||
pendingRedactions = "Aveți redactări neaplicate care vor fi pierdute."
|
||||
areYouSure = "Sigur doriți să părăsiți?"
|
||||
unsavedChangesTitle = "Modificări nesalvate"
|
||||
keepWorking = "Continuați lucrul"
|
||||
discardChanges = "Renunțați și ieșiți"
|
||||
discardRedactions = "Renunță și părăsește"
|
||||
applyAndContinue = "Salvați și ieșiți"
|
||||
exportAndContinue = "Exportați și continuați"
|
||||
cancel = "Anulare"
|
||||
@@ -343,10 +340,6 @@ advance = "Avansat"
|
||||
edit = "Vizualizează & Editează"
|
||||
popular = "Populare"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferințe"
|
||||
|
||||
@@ -367,7 +360,6 @@ advanced = "Avansat"
|
||||
title = "Securitate și autentificare"
|
||||
security = "Securitate"
|
||||
connections = "Conexiuni"
|
||||
telegram = "Telegram"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licențiere și Analytics"
|
||||
@@ -442,32 +434,6 @@ currentVersion = "Versiune curentă"
|
||||
latestVersion = "Ultima versiune"
|
||||
checkForUpdates = "Caută actualizări"
|
||||
viewDetails = "Vezi detalii"
|
||||
serverNeedsUpdate = "Serverul trebuie actualizat de administrator"
|
||||
|
||||
[settings.general.versionInfo]
|
||||
title = "Informații despre versiune"
|
||||
description = "Detalii despre versiunile pentru desktop și server"
|
||||
desktop = "Versiune Desktop"
|
||||
server = "Versiune Server"
|
||||
|
||||
[settings.security]
|
||||
title = "Securitate"
|
||||
description = "Actualizați parola pentru a vă menține contul în siguranță."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Schimbați parola. Veți fi deconectat(ă) după actualizare."
|
||||
required = "Toate câmpurile sunt obligatorii."
|
||||
mismatch = "Noile parole nu coincid."
|
||||
error = "Nu s-a putut actualiza parola. Verificați parola curentă și încercați din nou."
|
||||
success = "Parola a fost actualizată cu succes. Conectați-vă din nou."
|
||||
ssoDisabled = "Schimbarea parolei este gestionată de furnizorul dvs. de identitate."
|
||||
current = "Parola curentă"
|
||||
currentPlaceholder = "Introduceți parola curentă"
|
||||
new = "Parolă nouă"
|
||||
newPlaceholder = "Introduceți o parolă nouă"
|
||||
confirm = "Confirmați parola nouă"
|
||||
confirmPlaceholder = "Reintroduceți parola nouă"
|
||||
update = "Actualizați parola"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Scurtături de tastatură"
|
||||
@@ -522,16 +488,11 @@ low = "Scăzută"
|
||||
title = "Schimbă Credențialele"
|
||||
header = "Actualizează Detaliile Contului Tău"
|
||||
changePassword = "Utilizezi credențiale de conectare implicite. Te rugăm să introduci o nouă parolă"
|
||||
ssoManaged = "Contul dvs. este gestionat de furnizorul de identitate."
|
||||
newUsername = "Nume de Utilizator Nou"
|
||||
oldPassword = "Parola Curentă"
|
||||
newPassword = "Parolă Nouă"
|
||||
confirmNewPassword = "Confirmă Parola Nouă"
|
||||
submit = "Trimite Modificările"
|
||||
credsUpdated = "Cont actualizat"
|
||||
description = "Modificări salvate. Conectați-vă din nou."
|
||||
error = "Nu s-a putut actualiza numele de utilizator. Verificați parola și încercați din nou."
|
||||
changeUsername = "Actualizați numele de utilizator. Veți fi deconectat(ă) după actualizare."
|
||||
|
||||
[account]
|
||||
title = "Setări Cont"
|
||||
@@ -539,8 +500,6 @@ accountSettings = "Setări Cont"
|
||||
adminSettings = "Setări Admin - Vizualizează și Adaugă Utilizatori"
|
||||
userControlSettings = "Setări Control Utilizator"
|
||||
changeUsername = "Schimbă Numele de Utilizator"
|
||||
changeUsernameDescription = "Actualizați numele de utilizator. Veți fi deconectat(ă) după actualizare."
|
||||
newUsernamePlaceholder = "Introduceți noul nume de utilizator"
|
||||
newUsername = "Nume de Utilizator Nou"
|
||||
password = "Parolă de Confirmare"
|
||||
oldPassword = "Parola veche"
|
||||
@@ -749,11 +708,6 @@ tags = "semnătură,autograf"
|
||||
title = "Semnează"
|
||||
desc = "Adaugă o semnătură la documentul PDF prin desenare, text sau imagine."
|
||||
|
||||
[home.annotate]
|
||||
tags = "anotare,evidențiere,desen"
|
||||
title = "Anotare"
|
||||
desc = "Evidențiați, desenați, adăugați note și forme în vizualizator"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplifică,elimină,interactiv"
|
||||
title = "Nivelare"
|
||||
@@ -964,8 +918,8 @@ desc = "Suprapune PDF-uri peste alt PDF"
|
||||
title = "Suprapune PDF-uri"
|
||||
|
||||
[home.pdfTextEditor]
|
||||
title = "Editor text PDF"
|
||||
desc = "Revizuiește și editează exporturile JSON Stirling PDF cu editare de text grupată și regenerare PDF"
|
||||
title = "Editor de text PDF"
|
||||
desc = "Editați textul și imaginile existente în PDF-uri"
|
||||
|
||||
[home.addText]
|
||||
tags = "text,anotare,etichetă"
|
||||
@@ -976,7 +930,6 @@ desc = "Adaugă text personalizat oriunde în PDF-ul tău"
|
||||
addFiles = "Adăugați fișiere"
|
||||
uploadFromComputer = "Încărcați de pe calculator"
|
||||
openFromComputer = "Deschide de pe calculator"
|
||||
mobileUpload = "Încărcare de pe mobil"
|
||||
|
||||
[viewPdf]
|
||||
tags = "vizualizare,citește,adnotează,text,imagine"
|
||||
@@ -1268,11 +1221,11 @@ pdfaDigitalSignatureWarning = "PDF-ul conține o semnătură digitală. Aceasta
|
||||
fileFormat = "Format fișier"
|
||||
wordDoc = "Document Word"
|
||||
wordDocExt = "Document Word (.docx)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
odtExt = "Text OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
odpExt = "Prezentare OpenDocument (.odp)"
|
||||
txtExt = "Text simplu (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Format Rich Text (.rtf)"
|
||||
selectedFiles = "Fișiere selectate"
|
||||
noFileSelected = "Niciun fișier selectat. Folosiți panoul de fișiere pentru a adăuga fișiere."
|
||||
convertFiles = "Convertiți fișiere"
|
||||
@@ -1292,33 +1245,6 @@ cbzOptions = "Opțiuni CBZ la PDF"
|
||||
optimizeForEbook = "Optimizați PDF pentru e-readere (folosește Ghostscript)"
|
||||
cbzOutputOptions = "Opțiuni PDF la CBZ"
|
||||
cbzDpi = "DPI pentru randarea imaginilor"
|
||||
cbrOptions = "Opțiuni CBR"
|
||||
cbrOutputOptions = "Opțiuni PDF către CBR"
|
||||
cbrDpi = "DPI pentru randarea imaginilor"
|
||||
|
||||
[convert.ebookOptions]
|
||||
ebookOptions = "Opțiuni eBook către PDF"
|
||||
ebookOptionsDesc = "Opțiuni pentru conversia eBook-urilor în PDF"
|
||||
embedAllFonts = "Încorporează toate fonturile"
|
||||
embedAllFontsDesc = "Încorporează toate fonturile din eBook în PDF-ul generat"
|
||||
includeTableOfContents = "Include cuprins"
|
||||
includeTableOfContentsDesc = "Adaugă un cuprins generat în PDF-ul rezultat"
|
||||
includePageNumbers = "Include numerele de pagină"
|
||||
includePageNumbersDesc = "Adaugă numere de pagină în PDF-ul generat"
|
||||
optimizeForEbookPdf = "Optimizează pentru cititoare de eBook"
|
||||
optimizeForEbookPdfDesc = "Optimizează PDF-ul pentru citirea pe eBook (dimensiune de fișier mai mică, randare mai bună pe dispozitive eInk)"
|
||||
|
||||
[convert.epubOptions]
|
||||
epubOptions = "Opțiuni PDF către eBook"
|
||||
epubOptionsDesc = "Opțiuni pentru conversia PDF în EPUB/AZW3"
|
||||
detectChapters = "Detectează capitolele"
|
||||
detectChaptersDesc = "Detectează titlurile care par capitole și inserează întreruperi de pagină EPUB"
|
||||
targetDevice = "Dispozitiv țintă"
|
||||
targetDeviceDesc = "Alege un profil de ieșire optimizat pentru dispozitivul de citire"
|
||||
outputFormat = "Format de ieșire"
|
||||
outputFormatDesc = "Alege formatul de ieșire pentru eBook"
|
||||
tabletPhone = "Tabletă/Telefon (cu imagini)"
|
||||
kindleEink = "Kindle e-Ink (text optimizat)"
|
||||
|
||||
[imageToPdf]
|
||||
tags = "conversie,img,jpg,poză,fotografie"
|
||||
@@ -1435,11 +1361,6 @@ header = "Add attachments"
|
||||
add = "Adaugă atașament"
|
||||
remove = "Elimină atașament"
|
||||
embed = "Încorporează atașament"
|
||||
convertToPdfA3b = "Convertește la PDF/A-3b"
|
||||
convertToPdfA3bDescription = "Creează un PDF pentru arhivare cu atașamente încorporate"
|
||||
convertToPdfA3bTooltip = "PDF/A-3b este un format de arhivare care asigură păstrarea pe termen lung. Permite încorporarea oricăror formate de fișiere ca atașamente. Conversia necesită Ghostscript și poate dura mai mult pentru fișiere mari."
|
||||
convertToPdfA3bTooltipHeader = "Despre conversia PDF/A-3b"
|
||||
convertToPdfA3bTooltipTitle = "Ce face"
|
||||
submit = "Add attachments"
|
||||
|
||||
[watermark]
|
||||
@@ -1482,7 +1403,7 @@ height = "Spațiere pe înălțime"
|
||||
width = "Spațiere pe lățime"
|
||||
|
||||
[watermark.alphabet]
|
||||
roman = "Roman/Latin"
|
||||
roman = "Romano/Latin"
|
||||
arabic = "Arabă"
|
||||
japanese = "Japoneză"
|
||||
korean = "Coreeană"
|
||||
@@ -2385,10 +2306,6 @@ saved = "Salvate"
|
||||
label = "Încarcă imaginea semnăturii"
|
||||
placeholder = "Selectați fișierul imagine"
|
||||
hint = "Încărcați o imagine PNG sau JPG a semnăturii dvs."
|
||||
removeBackground = "Elimină fundalul alb (transparentizează)"
|
||||
processing = "Se procesează imaginea..."
|
||||
backgroundRemovalFailedTitle = "Eliminarea fundalului a eșuat"
|
||||
backgroundRemovalFailedMessage = "Nu s-a putut elimina fundalul din imagine. Se va folosi imaginea originală."
|
||||
|
||||
[sign.instructions]
|
||||
title = "Cum să adăugați semnătura"
|
||||
@@ -2434,11 +2351,6 @@ note = "Aplatizarea elimină elementele interactive din PDF, făcându-le needit
|
||||
label = "Nivelează doar formularele"
|
||||
desc = "Aplatizează doar câmpurile de formular, lăsând celelalte elemente interactive intacte"
|
||||
|
||||
[flatten.renderDpi]
|
||||
label = "DPI de randare (opțional, recomandat 150 DPI)"
|
||||
help = "Lăsați necompletat pentru a folosi valoarea implicită a sistemului. Un DPI mai mare îmbunătățește claritatea, dar crește timpul de procesare și dimensiunea fișierului."
|
||||
placeholder = "ex. 150"
|
||||
|
||||
[flatten.results]
|
||||
title = "Rezultatele aplatizării"
|
||||
|
||||
@@ -3013,7 +2925,6 @@ header = "Decupează PDF"
|
||||
submit = "Trimite"
|
||||
noFileSelected = "Selectați un fișier PDF pentru a începe decuparea"
|
||||
reset = "Resetează la PDF complet"
|
||||
autoCrop = "Decupare automată a spațiilor albe"
|
||||
|
||||
[crop.preview]
|
||||
title = "Selecție zonă de decupare"
|
||||
@@ -3244,7 +3155,6 @@ title = "Metoda de redactare"
|
||||
mode = "Mod"
|
||||
automatic = "Automat"
|
||||
automaticDesc = "Redactează text pe baza termenilor de căutare"
|
||||
automaticDisabledTooltip = "Selectați fișiere în managerul de fișiere pentru a redacta mai multe fișiere deodată"
|
||||
manual = "Manual"
|
||||
manualDesc = "Faceți clic și trageți pentru a redacta zone specifice"
|
||||
manualComingSoon = "Redactarea manuală va fi disponibilă în curând"
|
||||
@@ -3315,35 +3225,8 @@ text = "Potrivește doar cuvinte complete, nu potriviri parțiale. „John” nu
|
||||
title = "Convertește în PDF-imagine"
|
||||
text = "Convertește PDF-ul într-un PDF bazat pe imagine după redactare. Acest lucru asigură că textul din spatele casetelor de redactare este complet eliminat și nerecuperabil."
|
||||
|
||||
[redact.tooltip.manual.header]
|
||||
title = "Controale de redactare manuală"
|
||||
|
||||
[redact.tooltip.manual.markText]
|
||||
title = "Instrument „Marcare text”"
|
||||
text = "Selectați textul direct în PDF pentru a-l marca pentru redactare. Faceți clic și trageți pentru a evidenția textul pe care doriți să-l redactați."
|
||||
|
||||
[redact.tooltip.manual.markArea]
|
||||
title = "Instrument „Marcare zonă”"
|
||||
text = "Desenați zone dreptunghiulare în PDF pentru a marca regiuni de redactat. Util pentru redactarea imaginilor, semnăturilor sau formelor neregulate."
|
||||
|
||||
[redact.tooltip.manual.apply]
|
||||
title = "Aplică redactările"
|
||||
text = "După ce marcați conținutul, faceți clic pe „Aplică” pentru a redacta permanent toate zonele marcate. Numărul în așteptare indică câte redactări sunt gata de aplicat."
|
||||
bullet1 = "Marcați câte zone aveți nevoie înainte de aplicare"
|
||||
bullet2 = "Toate redactările în așteptare sunt aplicate simultan"
|
||||
bullet3 = "Redactările nu pot fi anulate după aplicare"
|
||||
|
||||
[redact.manual]
|
||||
title = "Instrumente de redactare"
|
||||
instructions = "Selectați text sau desenați zone în PDF pentru a marca conținut de redactat."
|
||||
markText = "Marchează text"
|
||||
markArea = "Marchează zonă"
|
||||
pendingLabel = "În așteptare:"
|
||||
applyWarning = "⚠️ Aplicare permanentă, nu poate fi anulată, iar datele dedesubt vor fi șterse"
|
||||
apply = "Aplică"
|
||||
noMarks = "Nicio marcă de redactare. Folosiți instrumentele de mai sus pentru a marca conținutul de redactat."
|
||||
header = "Redactare manuală"
|
||||
controlsTitle = "Controale de redactare manuală"
|
||||
textBasedRedaction = "Redactare bazată pe text"
|
||||
pageBasedRedaction = "Redactare pe pagină"
|
||||
convertPDFToImageLabel = "Convertește PDF în PDF-imagine (utilizat pentru a elimina textul din spatele casetei)"
|
||||
@@ -3459,19 +3342,6 @@ placeholder = "Introdu numărul de diviziuni orizontale"
|
||||
label = "Diviziuni Verticale"
|
||||
placeholder = "Introdu numărul de diviziuni verticale"
|
||||
|
||||
[split-by-sections.splitMode]
|
||||
label = "Mod de împărțire"
|
||||
description = "Alegeți cum să împărțiți paginile"
|
||||
splitAll = "Împarte toate paginile"
|
||||
splitAllExceptFirst = "Împarte toate în afară de prima"
|
||||
splitAllExceptLast = "Împarte toate în afară de ultima"
|
||||
splitAllExceptFirstAndLast = "Împarte toate în afară de prima și ultima"
|
||||
custom = "Pagini personalizate"
|
||||
|
||||
[split-by-sections.customPages]
|
||||
label = "Numere de pagini personalizate"
|
||||
placeholder = "ex. 2,4,6"
|
||||
|
||||
[AddStampRequest]
|
||||
tags = "Ștampilă, Adaugă imagine, centrează imagine, Filigran, PDF, Încorporează, Personalizează"
|
||||
header = "Ștampilează PDF"
|
||||
@@ -3833,19 +3703,6 @@ filesize = "Dimensiune Fișier"
|
||||
[compress.grayscale]
|
||||
label = "Aplicare scală de gri pentru compresie"
|
||||
|
||||
[compress.linearize]
|
||||
label = "Linearizează PDF pentru vizualizare web rapidă"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Convertește imaginile în line art"
|
||||
description = "Folosește ImageMagick pentru a reduce paginile la alb-negru cu contrast ridicat pentru o reducere maximă a dimensiunii."
|
||||
unavailable = "ImageMagick nu este instalat sau activat pe acest server"
|
||||
detailLevel = "Nivel de detaliu"
|
||||
edgeEmphasis = "Accentuare muchii"
|
||||
edgeLow = "Ușoară"
|
||||
edgeMedium = "Echilibrată"
|
||||
edgeHigh = "Puternică"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Prezentare generală a setărilor de comprimare"
|
||||
|
||||
@@ -3863,10 +3720,6 @@ bullet2 = "Valorile mai mari reduc dimensiunea fișierului"
|
||||
title = "Nuanțe de gri"
|
||||
text = "Selectați această opțiune pentru a converti toate imaginile în alb-negru, ceea ce poate reduce semnificativ dimensiunea fișierului, în special pentru PDF-uri scanate sau documente bogate în imagini."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "Convertește paginile în alb-negru cu contrast ridicat folosind ImageMagick. Folosiți nivelul de detaliu pentru a controla cât conținut devine negru și accentuarea muchiilor pentru a controla cât de agresiv sunt detectate muchiile."
|
||||
|
||||
[compress.error]
|
||||
failed = "A apărut o eroare la comprimarea PDF-ului."
|
||||
|
||||
@@ -3879,11 +3732,6 @@ failed = "A apărut o eroare la comprimarea PDF-ului."
|
||||
_value = "Setări de comprimare"
|
||||
1 = "1-3 comprimare PDF,</br> 4-6 comprimare ușoară a imaginilor,</br> 7-9 comprimare intensă a imaginilor Va reduce semnificativ calitatea imaginilor"
|
||||
|
||||
[compress.compressionLevel]
|
||||
range1to3 = "Valorile mai mici păstrează calitatea, dar duc la fișiere mai mari"
|
||||
range4to6 = "Compresie medie cu o reducere moderată a calității"
|
||||
range7to9 = "Valorile mai mari reduc semnificativ dimensiunea fișierului, dar pot reduce claritatea imaginilor"
|
||||
|
||||
[decrypt]
|
||||
passwordPrompt = "Acest fișier este protejat cu parolă. Introduceți parola:"
|
||||
cancelled = "Operațiune anulată pentru PDF: {0}"
|
||||
@@ -4123,98 +3971,23 @@ deleteSelected = "Ștergeți paginile selectate"
|
||||
closePdf = "Închide PDF"
|
||||
exportAll = "Exportați PDF"
|
||||
downloadSelected = "Descărcați fișierele selectate"
|
||||
annotations = "Anotări"
|
||||
exportSelected = "Exportați paginile selectate"
|
||||
saveChanges = "Salvați modificările"
|
||||
downloadAll = "Descărcați tot"
|
||||
saveAll = "Salvează tot"
|
||||
toggleTheme = "Comutați tema"
|
||||
toggleBookmarks = "Comută semnele de carte"
|
||||
language = "Limbă"
|
||||
toggleAnnotations = "Comutați vizibilitatea adnotărilor"
|
||||
search = "Căutați în PDF"
|
||||
panMode = "Mod panoramare"
|
||||
applyRedactionsFirst = "Aplicați mai întâi redactările"
|
||||
rotateLeft = "Rotiți la stânga"
|
||||
rotateRight = "Rotiți la dreapta"
|
||||
toggleSidebar = "Comutați bara laterală"
|
||||
toggleBookmarks = "Comută semnele de carte"
|
||||
exportSelected = "Exportați paginile selectate"
|
||||
toggleAnnotations = "Comutați vizibilitatea adnotărilor"
|
||||
annotationMode = "Comutați modul de adnotare"
|
||||
print = "Imprimați PDF"
|
||||
draw = "Desenați"
|
||||
redact = "Redactează"
|
||||
exitRedaction = "Ieși din modul Redactare"
|
||||
save = "Salvați"
|
||||
downloadAll = "Descărcați tot"
|
||||
saveAll = "Salvează tot"
|
||||
|
||||
[textAlign]
|
||||
left = "Stânga"
|
||||
center = "Centru"
|
||||
right = "Dreapta"
|
||||
|
||||
[annotation]
|
||||
title = "Anotare"
|
||||
desc = "Folosiți evidențierea, stiloul, textul și notele. Modificările rămân active — nu este necesară aplatizarea."
|
||||
highlight = "Evidențiere"
|
||||
pen = "Stilou"
|
||||
text = "Casetă de text"
|
||||
note = "Notă"
|
||||
rectangle = "Dreptunghi"
|
||||
ellipse = "Elipsă"
|
||||
select = "Selectează"
|
||||
exit = "Ieși din modul Anotare"
|
||||
strokeWidth = "Lățime"
|
||||
opacity = "Opacitate"
|
||||
strokeOpacity = "Opacitate contur"
|
||||
fillOpacity = "Opacitate umplere"
|
||||
fontSize = "Mărime font"
|
||||
chooseColor = "Alege culoarea"
|
||||
color = "Culoare"
|
||||
strokeColor = "Culoare contur"
|
||||
fillColor = "Culoare umplere"
|
||||
underline = "Subliniere"
|
||||
strikeout = "Tăiere"
|
||||
squiggly = "Ondulat"
|
||||
inkHighlighter = "Evidențiator liber"
|
||||
freehandHighlighter = "Evidențiator liber"
|
||||
square = "Pătrat"
|
||||
circle = "Cerc"
|
||||
polygon = "Poligon"
|
||||
line = "Linie"
|
||||
stamp = "Adaugă imagine"
|
||||
textMarkup = "Marcaj text"
|
||||
drawing = "Desen"
|
||||
shapes = "Forme"
|
||||
notesStamps = "Note și ștampile"
|
||||
settings = "Setări"
|
||||
borderOn = "Chenar: Activ"
|
||||
borderOff = "Chenar: Inactiv"
|
||||
editInk = "Editează stiloul"
|
||||
editLine = "Editează linia"
|
||||
editNote = "Editează nota"
|
||||
editText = "Editează caseta de text"
|
||||
editTextMarkup = "Editează marcajul textului"
|
||||
editSelected = "Editează anotarea"
|
||||
editSquare = "Editează pătratul"
|
||||
editCircle = "Editează cercul"
|
||||
editPolygon = "Editează poligonul"
|
||||
unsupportedType = "Acest tip de anotare nu este pe deplin suportat pentru editare."
|
||||
textAlignment = "Aliniere text"
|
||||
noteIcon = "Pictogramă notă"
|
||||
imagePreview = "Previzualizare"
|
||||
contents = "Text"
|
||||
backgroundColor = "Culoare fundal"
|
||||
clearBackground = "Elimină fundalul"
|
||||
noBackground = "Fără fundal"
|
||||
stampSettings = "Setări ștampilă"
|
||||
savingCopy = "Se pregătește descărcarea..."
|
||||
saveFailed = "Nu s-a putut salva copia"
|
||||
saveReady = "Descărcare pregătită"
|
||||
selectAndMove = "Selectează și editează"
|
||||
editSelectDescription = "Faceți clic pe o anotare existentă pentru a-i edita culoarea, opacitatea, textul sau dimensiunea."
|
||||
editStampHint = "Pentru a schimba imaginea, ștergeți această ștampilă și adăugați una nouă."
|
||||
editSwitchToSelect = "Comutați la „Selectează și editează” pentru a edita această anotare."
|
||||
undo = "Anulează"
|
||||
redo = "Refă"
|
||||
applyChanges = "Aplică modificările"
|
||||
saveChanges = "Salvează modificările"
|
||||
saveChanges = "Salvați modificările"
|
||||
|
||||
[search]
|
||||
title = "Căutați în PDF"
|
||||
@@ -4260,25 +4033,17 @@ files = "Fișiere"
|
||||
activity = "Jurnal"
|
||||
help = "Ajutor"
|
||||
account = "Cont"
|
||||
config = "Config"
|
||||
config = "Configurare"
|
||||
settings = "Setări"
|
||||
adminSettings = "Setări admin"
|
||||
allTools = "All Tools"
|
||||
reader = "Cititor"
|
||||
tours = "Tururi"
|
||||
showMeAround = "Ghidează-mă"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Vizionați ghidurile aici: turul instrumentelor, turul noului layout V2 și turul de administrare."
|
||||
user = "Vizionați ghidurile aici: turul instrumentelor și turul noului layout V2."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Turul instrumentelor"
|
||||
toolsTourDesc = "Aflați ce pot face instrumentele"
|
||||
adminTour = "Turul de administrare"
|
||||
adminTourDesc = "Explorați setările și funcțiile de administrare"
|
||||
whatsNewTour = "Vezi noutățile din V2"
|
||||
whatsNewTourDesc = "Explorați layout-ul actualizat"
|
||||
|
||||
[admin]
|
||||
error = "Eroare"
|
||||
@@ -4297,8 +4062,6 @@ fetchError = "Nu s-au putut încărca setările"
|
||||
saveError = "Nu s-au putut salva setările"
|
||||
saved = "Setările au fost salvate cu succes"
|
||||
saveSuccess = "Setările au fost salvate cu succes"
|
||||
success = "Setări salvate cu succes"
|
||||
error = "Nu s-au putut salva setările"
|
||||
save = "Salvați modificările"
|
||||
discard = "Renunță"
|
||||
restartRequired = "Este necesară repornirea"
|
||||
@@ -4422,13 +4185,6 @@ description = "Calea către executabilul WeasyPrint pentru conversia HTML în PD
|
||||
label = "Executabil Unoconvert"
|
||||
description = "Calea către LibreOffice unoconvert pentru conversia documentelor (lăsați gol pentru implicit: /opt/venv/bin/unoconvert)"
|
||||
|
||||
[admin.settings.general.frontendUrl]
|
||||
label = "URL frontend"
|
||||
description = "URL de bază pentru frontend (ex.: https://pdf.example.com). Folosit pentru linkurile de invitație prin e-mail și încărcările cu cod QR de pe mobil. Lăsați gol pentru a utiliza URL-ul backend."
|
||||
|
||||
[admin.settings.badge]
|
||||
clickToUpgrade = "Faceți clic pentru a vedea detaliile planului"
|
||||
|
||||
[admin.settings.security]
|
||||
title = "Securitate"
|
||||
description = "Configurați autentificarea, comportamentul de autentificare și politicile de securitate."
|
||||
@@ -4505,7 +4261,7 @@ description = "Urmărește acțiunile utilizatorilor și evenimentele de sistem
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Nivel audit"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
description = "0=OPRIT, 1=DE BAZĂ, 2=STANDARD, 3=DETALIAT"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Păstrare audit (zile)"
|
||||
@@ -4565,19 +4321,6 @@ connect = "Conectează"
|
||||
disconnect = "Deconectează"
|
||||
disconnected = "Furnizor deconectat cu succes"
|
||||
disconnectError = "Nu s-a putut deconecta furnizorul"
|
||||
mobileScannerConvertToPdf = "Convertește imaginile în PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertește automat imaginile încărcate în format PDF. Dacă este dezactivat, imaginile vor fi păstrate ca atare."
|
||||
mobileScannerImageResolution = "Rezoluția imaginii"
|
||||
mobileScannerImageResolutionDesc = "Rezoluția imaginilor încărcate. „Redusă” redimensionează imaginile la maximum 1200px pentru a reduce dimensiunea fișierului."
|
||||
imageResolutionFull = "Completă (Dimensiune originală)"
|
||||
imageResolutionReduced = "Redusă (Max 1200px)"
|
||||
mobileScannerPageFormat = "Format pagină"
|
||||
mobileScannerPageFormatDesc = "Dimensiunea paginii PDF pentru imaginile convertite. „Păstrează” folosește dimensiunile originale ale imaginii."
|
||||
pageFormatKeep = "Păstrează (Dimensiuni originale)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Întinde pentru a se potrivi"
|
||||
mobileScannerStretchToFitDesc = "Întinde imaginile pentru a umple întreaga pagină. Dacă este dezactivat, imaginile sunt centrate cu păstrarea proporțiilor."
|
||||
|
||||
[admin.settings.connections.ssoAutoLogin]
|
||||
label = "Autentificare automată SSO"
|
||||
@@ -4646,122 +4389,6 @@ description = "Creează automat conturi de utilizator la prima autentificare SAM
|
||||
label = "Blochează înregistrarea"
|
||||
description = "Previne înregistrarea de noi utilizatori prin SAML2"
|
||||
|
||||
[admin.settings.connections.mobileScanner]
|
||||
label = "Încărcare de pe telefon mobil"
|
||||
enable = "Activează încărcarea prin cod QR"
|
||||
description = "Permite utilizatorilor să încarce fișiere de pe dispozitive mobile scanând un cod QR"
|
||||
note = "Notă: Necesită configurarea URL-ului frontend. "
|
||||
link = "Configurați în Setările sistemului"
|
||||
mobileScannerConvertToPdf = "Convertește imaginile în PDF"
|
||||
mobileScannerConvertToPdfDesc = "Convertește automat imaginile încărcate în format PDF. Dacă este dezactivat, imaginile vor fi păstrate ca atare."
|
||||
mobileScannerImageResolution = "Rezoluția imaginii"
|
||||
mobileScannerImageResolutionDesc = "Rezoluția imaginilor încărcate. „Redusă” redimensionează imaginile la maximum 1200px pentru a reduce dimensiunea fișierului."
|
||||
imageResolutionFull = "Completă (Dimensiune originală)"
|
||||
imageResolutionReduced = "Redusă (Max 1200px)"
|
||||
mobileScannerPageFormat = "Format pagină"
|
||||
mobileScannerPageFormatDesc = "Dimensiunea paginii PDF pentru imaginile convertite. „Păstrează” folosește dimensiunile originale ale imaginii."
|
||||
pageFormatKeep = "Păstrează (Dimensiuni originale)"
|
||||
pageFormatA4 = "A4 (210×297mm)"
|
||||
pageFormatLetter = "Letter (8.5×11in)"
|
||||
mobileScannerStretchToFit = "Întinde pentru a se potrivi"
|
||||
mobileScannerStretchToFitDesc = "Întinde imaginile pentru a umple întreaga pagină. Dacă este dezactivat, imaginile sunt centrate cu păstrarea proporțiilor."
|
||||
|
||||
[admin.settings.telegram]
|
||||
title = "Bot Telegram"
|
||||
description = "Configurați conectivitatea botului Telegram, controalele de acces și comportamentul mesajelor de feedback."
|
||||
|
||||
[admin.settings.telegram.enabled]
|
||||
label = "Activează botul Telegram"
|
||||
description = "Permite utilizatorilor să interacționeze cu Stirling PDF prin botul Telegram configurat."
|
||||
|
||||
[admin.settings.telegram.botUsername]
|
||||
label = "Nume de utilizator bot"
|
||||
description = "Numele de utilizator public al botului Telegram."
|
||||
|
||||
[admin.settings.telegram.botToken]
|
||||
label = "Token bot"
|
||||
description = "Token API furnizat de BotFather pentru botul dvs. Telegram."
|
||||
|
||||
[admin.settings.telegram.pipelineInboxFolder]
|
||||
label = "Folder Inbox"
|
||||
description = "Folder în directorul pipeline unde sunt stocate fișierele primite din Telegram."
|
||||
|
||||
[admin.settings.telegram.customFolderSuffix]
|
||||
label = "Folosește sufix personalizat pentru folder"
|
||||
description = "Adaugă ID-ul conversației la folderele fișierelor primite pentru a izola încărcările per chat."
|
||||
|
||||
[admin.settings.telegram.accessControl]
|
||||
title = "Control acces"
|
||||
description = "Restrângeți ce utilizatori sau canale pot interacționa cu botul."
|
||||
|
||||
[admin.settings.telegram.enableAllowUserIDs]
|
||||
label = "Permite ID-uri specifice de utilizator"
|
||||
description = "Când este activat, doar ID-urile de utilizator listate pot folosi botul."
|
||||
|
||||
[admin.settings.telegram.allowUserIDs]
|
||||
label = "ID-uri de utilizator permise"
|
||||
description = "Introduceți ID-urile de utilizator Telegram permise să interacționeze cu botul."
|
||||
placeholder = "Adăugați un ID utilizator și apăsați Enter"
|
||||
|
||||
[admin.settings.telegram.enableAllowChannelIDs]
|
||||
label = "Permite ID-uri specifice de canal"
|
||||
description = "Când este activat, doar ID-urile de canal listate pot folosi botul."
|
||||
|
||||
[admin.settings.telegram.allowChannelIDs]
|
||||
label = "ID-uri de canal permise"
|
||||
description = "Introduceți ID-urile de canal Telegram permise să interacționeze cu botul."
|
||||
placeholder = "Adăugați un ID canal și apăsați Enter"
|
||||
|
||||
[admin.settings.telegram.processing]
|
||||
title = "Procesare"
|
||||
description = "Controlați intervalele de interogare și timpii de expirare ai procesării pentru încărcările din Telegram."
|
||||
|
||||
[admin.settings.telegram.processingTimeoutSeconds]
|
||||
label = "Timeout procesare (secunde)"
|
||||
description = "Timpul maxim de așteptare pentru o sarcină de procesare înainte de raportarea unei erori."
|
||||
|
||||
[admin.settings.telegram.pollingIntervalMillis]
|
||||
label = "Interval de interogare (ms)"
|
||||
description = "Intervalul dintre verificările pentru noi actualizări Telegram."
|
||||
|
||||
[admin.settings.telegram.feedback]
|
||||
title = "Mesaje de feedback"
|
||||
description = "Alegeți când botul ar trebui să trimită feedback utilizatorilor și canalelor."
|
||||
|
||||
[admin.settings.telegram.feedback.general.enabled]
|
||||
label = "Activează feedback-ul"
|
||||
description = "Controlați dacă botul trimite sau nu mesaje de feedback."
|
||||
|
||||
[admin.settings.telegram.feedback.channel]
|
||||
title = "Reguli de feedback pentru canale"
|
||||
|
||||
[admin.settings.telegram.feedback.channel.noValidDocument]
|
||||
label = "Afișează „No valid document” (Canal)"
|
||||
description = "Suprimă răspunsul „no valid document” pentru încărcările în canale."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorProcessing]
|
||||
label = "Afișează erorile de procesare (Canal)"
|
||||
description = "Trimite mesaje de eroare de procesare către canale."
|
||||
|
||||
[admin.settings.telegram.feedback.channel.errorMessage]
|
||||
label = "Afișează mesajele de eroare (Canal)"
|
||||
description = "Afișează mesaje de eroare detaliate pentru canale."
|
||||
|
||||
[admin.settings.telegram.feedback.user]
|
||||
title = "Reguli de feedback pentru utilizatori"
|
||||
|
||||
[admin.settings.telegram.feedback.user.noValidDocument]
|
||||
label = "Afișează „No valid document” (Utilizator)"
|
||||
description = "Suprimă răspunsul „no valid document” pentru încărcările utilizatorilor."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorProcessing]
|
||||
label = "Afișează erorile de procesare (Utilizator)"
|
||||
description = "Trimite mesaje de eroare de procesare către utilizatori."
|
||||
|
||||
[admin.settings.telegram.feedback.user.errorMessage]
|
||||
label = "Afișează mesajele de eroare (Utilizator)"
|
||||
description = "Afișează mesaje de eroare detaliate pentru utilizatori."
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Bază de date"
|
||||
description = "Configurați setări personalizate de conectare la baza de date pentru implementări enterprise."
|
||||
@@ -4943,10 +4570,6 @@ description = "Permite administratorilor să invite utilizatori prin e-mail cu p
|
||||
label = "URL frontend"
|
||||
description = "URL de bază pentru frontend (de ex. https://pdf.example.com). Folosit pentru generarea linkurilor de invitație în e-mailuri. Lăsați gol pentru a folosi URL-ul backend."
|
||||
|
||||
[admin.settings.mail.frontendUrlNote]
|
||||
note = "Notă: Necesită configurarea URL-ului frontend. "
|
||||
link = "Configurați în Setările sistemului"
|
||||
|
||||
[admin.settings.legal]
|
||||
title = "Documente legale"
|
||||
description = "Configurați linkuri către documente și politici legale."
|
||||
@@ -5131,9 +4754,6 @@ googleDriveShort = "Drive"
|
||||
myFiles = "Fișierele mele"
|
||||
noRecentFiles = "Nu s-au găsit fișiere recente"
|
||||
googleDriveNotAvailable = "Integrarea cu Google Drive nu este disponibilă"
|
||||
mobileUpload = "Încărcare de pe mobil"
|
||||
mobileShort = "Mobil"
|
||||
mobileUploadNotAvailable = "Încărcarea de pe mobil nu este activată"
|
||||
downloadSelected = "Descărcați selecția"
|
||||
saveSelected = "Salvează selecția"
|
||||
openFiles = "Deschideți fișiere"
|
||||
@@ -5449,7 +5069,6 @@ loading = "Se încarcă..."
|
||||
back = "Înapoi"
|
||||
continue = "Continuă"
|
||||
error = "Eroare"
|
||||
save = "Salvează"
|
||||
|
||||
[config.overview]
|
||||
title = "Configurarea aplicației"
|
||||
@@ -5512,15 +5131,6 @@ impact = "Orice aplicații sau servicii care folosesc în prezent aceste chei vo
|
||||
confirmPrompt = "Sigur doriți să continuați?"
|
||||
confirmCta = "Reîmprospătați cheile"
|
||||
|
||||
[config.apiKeys.alert]
|
||||
apiKeyErrorTitle = "Eroare cheie API"
|
||||
failedToCreateApiKey = "Nu s-a putut crea cheia API."
|
||||
failedToRetrieveApiKey = "Nu s-a putut obține cheia API din răspuns."
|
||||
failedToFetchApiKey = "Nu s-a putut prelua cheia API."
|
||||
apiKeyRefreshed = "Cheie API reîmprospătată"
|
||||
apiKeyRefreshedBody = "Cheia API a fost reîmprospătată cu succes."
|
||||
failedToRefreshApiKey = "Nu s-a putut reîmprospăta cheia API."
|
||||
|
||||
[AddAttachmentsRequest]
|
||||
attachments = "Selectați atașamente"
|
||||
info = "Selectați fișiere de atașat la PDF-ul dvs. Aceste fișiere vor fi încorporate și accesibile prin panoul de atașamente al PDF-ului."
|
||||
@@ -5625,16 +5235,6 @@ finish = "Finalizați"
|
||||
startTour = "Porniți turul"
|
||||
startTourDescription = "Faceți un tur ghidat al funcțiilor esențiale Stirling PDF"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Începeți din bara <strong>Acces rapid</strong> pentru a comuta între Reader, Automate, fișierele dvs. și toate tururile."
|
||||
leftPanel = "Panoul din stânga <strong>Instrumente</strong> listează tot ce puteți face. Navigați prin categorii sau căutați pentru a găsi rapid un instrument."
|
||||
fileUpload = "Folosiți butonul <strong>Fișiere</strong> pentru a încărca sau a alege un PDF recent. Vom încărca un exemplu pentru a vedea spațiul de lucru."
|
||||
rightRail = "Bara <strong>din dreapta</strong> conține acțiuni rapide pentru a selecta fișiere, a schimba tema sau limba și a descărca rezultatele."
|
||||
topBar = "Bara de sus vă permite să comutați între <strong>Vizualizator</strong>, <strong>Editor de pagini</strong> și <strong>Fișiere active</strong>."
|
||||
pageEditorView = "Comutați la Editorul de pagini pentru a reordona, roti sau șterge pagini."
|
||||
activeFilesView = "Folosiți Fișiere active pentru a vedea tot ce aveți deschis și a alege la ce să lucrați."
|
||||
wrapUp = "Acestea sunt noutățile din V2. Deschideți oricând meniul <strong>Tururi</strong> pentru a relua acesta, turul Instrumente sau turul Admin."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Bun venit la Stirling PDF!"
|
||||
description = "Doriți să faceți un tur rapid de 1 minut pentru a afla funcțiile esențiale și cum să începeți?"
|
||||
@@ -5655,10 +5255,6 @@ download = "Descarcă →"
|
||||
showMeAround = "Arată-mi"
|
||||
skipTheTour = "Sari peste tur"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Prezentarea turului"
|
||||
body = "Stirling PDF V2 vine cu zeci de instrumente și un layout reîmprospătat. Faceți un tur rapid pentru a vedea ce s-a schimbat și unde găsiți funcțiile de care aveți nevoie."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Sari peste deocamdată"
|
||||
seePlans = "Vezi planuri →"
|
||||
@@ -5666,7 +5262,7 @@ upgrade = "Fă upgrade acum →"
|
||||
freeTitle = "Licență server"
|
||||
overLimitTitle = "Necesită licență de server"
|
||||
overLimitBody = "Politica noastră de licențiere permite până la <strong>{{freeTierLimit}}</strong> utilizatori gratuit per server. Ai <strong>{{overLimitUserCopy}}</strong> utilizatori Stirling. Pentru a continua fără întreruperi, fă upgrade la planul Stirling Server - <strong>locuri nelimitate</strong>, editare text PDF și control complet de admin pentru $99/server/lună."
|
||||
freeBody = "Licențierea noastră <strong>Open-Core</strong> permite până la <strong>{{freeTierLimit}}</strong> utilizatori gratuit per server. Pentru a scala fără întreruperi și a primi acces timpuriu la noul nostru <strong>instrument de editare text PDF</strong>, recomandăm planul Stirling Server - editare completă și <strong>locuri nelimitate</strong> pentru $99/server/lună."
|
||||
freeBody = "Licențierea noastră <strong>Open-Core</strong> permite până la <strong>{{freeTierLimit}}</strong> utilizatori gratuit per server. Pentru scalare fără întreruperi, recomandăm planul Stirling Server - <strong>locuri nelimitate</strong> și <strong>suport SSO</strong> pentru $99/server/lună."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Descărcare"
|
||||
@@ -5939,7 +5535,7 @@ submit = "Schimbă echipa"
|
||||
currency = "Monedă"
|
||||
popular = "Popular"
|
||||
current = "Plan curent"
|
||||
upgrade = "Upgrade"
|
||||
upgrade = "Actualizează"
|
||||
contact = "Contactează-ne"
|
||||
customPricing = "Personalizat"
|
||||
showComparison = "Compară toate funcțiile"
|
||||
@@ -5972,28 +5568,6 @@ contactSales = "Contactați vânzări"
|
||||
contactToUpgrade = "Contactați-ne pentru a face upgrade sau a personaliza planul"
|
||||
maxUsers = "Număr maxim de utilizatori"
|
||||
upTo = "Până la"
|
||||
getLicense = "Obține licență pentru server"
|
||||
upgradeToEnterprise = "Upgrade la Enterprise"
|
||||
selectPeriod = "Selectați perioada de facturare"
|
||||
monthlyBilling = "Facturare lunară"
|
||||
yearlyBilling = "Facturare anuală"
|
||||
checkoutOpened = "Checkout deschis"
|
||||
checkoutInstructions = "Finalizați achiziția în fila Stripe. După plată, reveniți aici și reîmprospătați pagina pentru a vă activa licența. Veți primi, de asemenea, un e-mail cu cheia de licență."
|
||||
activateLicense = "Activați licența"
|
||||
|
||||
[plan.static.licenseActivation]
|
||||
checkoutOpened = "Checkout deschis într-o filă nouă"
|
||||
instructions = "Finalizați achiziția în fila Stripe. După finalizarea plății, veți primi un e-mail cu cheia de licență."
|
||||
enterKey = "Introduceți mai jos cheia de licență pentru a vă activa planul:"
|
||||
keyDescription = "Lipiți cheia de licență din e-mail"
|
||||
activate = "Activează licența"
|
||||
doLater = "Voi face asta mai târziu"
|
||||
success = "Licență activată!"
|
||||
successMessage = "Licența a fost activată cu succes. Puteți închide această fereastră."
|
||||
|
||||
[plan.static.billingPortal]
|
||||
title = "Este necesară verificarea e-mailului"
|
||||
message = "Va trebui să vă verificați adresa de e-mail în portalul de facturare Stripe. Verificați e-mailul pentru un link de autentificare."
|
||||
|
||||
[plan.period]
|
||||
month = "lună"
|
||||
@@ -6197,8 +5771,6 @@ notAvailable = "Sistem de audit indisponibil"
|
||||
notAvailableMessage = "Sistemul de audit nu este configurat sau nu este disponibil."
|
||||
disabled = "Jurnalizarea de audit este dezactivată"
|
||||
disabledMessage = "Activați jurnalizarea de audit în configurația aplicației pentru a urmări evenimentele sistemului."
|
||||
enterpriseRequired = "Este necesară licența Enterprise"
|
||||
enterpriseRequiredMessage = "Sistemul de auditare a jurnalelor este o funcție Enterprise. Faceți upgrade la o licență Enterprise pentru a accesa jurnalele de audit și analizele."
|
||||
|
||||
[audit.error]
|
||||
title = "Eroare la încărcarea sistemului de audit"
|
||||
@@ -6370,7 +5942,6 @@ description = "Introdu URL-ul complet al serverului tău Stirling PDF găzduit l
|
||||
|
||||
[setup.server.error]
|
||||
emptyUrl = "Te rugăm să introduci un URL de server"
|
||||
invalidUrl = "Format URL invalid. Introduceți un URL valid, de exemplu https://your-server.com"
|
||||
unreachable = "Nu s-a putut conecta la server"
|
||||
testFailed = "Testul de conexiune a eșuat"
|
||||
configFetch = "Nu s-a putut prelua configurația serverului. Verificați URL-ul și încercați din nou."
|
||||
@@ -6389,7 +5960,6 @@ connectingTo = "Conectare la:"
|
||||
submit = "Autentificare"
|
||||
signInWith = "Autentifică-te cu"
|
||||
oauthPending = "Se deschide browserul pentru autentificare..."
|
||||
sso = "Single Sign-On"
|
||||
orContinueWith = "Sau continuă cu email"
|
||||
serverRequirement = "Notă: Serverul trebuie să aibă autentificarea activată."
|
||||
showInstructions = "Cum se activează?"
|
||||
@@ -6455,8 +6025,6 @@ reset = "Resetați modificările"
|
||||
downloadJson = "Descărcați JSON"
|
||||
generatePdf = "Generați PDF"
|
||||
saveChanges = "Salvează modificările"
|
||||
applyChanges = "Aplică modificările"
|
||||
downloadCopy = "Descarcă o copie"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Scalare automată a textului pentru a se potrivi în casete"
|
||||
@@ -6475,24 +6043,6 @@ descriptionInline = "Sfat: Țineți apăsat Ctrl (Cmd) sau Shift pentru a select
|
||||
title = "Blocați textul editat într-un singur element PDF"
|
||||
description = "Când este activată, editorul exportă fiecare casetă de text editată ca un singur element de text PDF pentru a evita suprapunerea glifelor sau amestecul de fonturi."
|
||||
|
||||
[pdfTextEditor.options.advanced]
|
||||
title = "Setări avansate"
|
||||
|
||||
[pdfTextEditor.tooltip.header]
|
||||
title = "Limitări ale previzualizării"
|
||||
|
||||
[pdfTextEditor.tooltip.textFocus]
|
||||
title = "Focalizare pe text și imagine"
|
||||
text = "Acest spațiu de lucru se concentrează pe editarea textului și repoziționarea imaginilor încorporate. Elementele grafice complexe ale paginii, widgeturile de formular și grafica stratificată sunt păstrate pentru export, dar nu sunt pe deplin editabile aici."
|
||||
|
||||
[pdfTextEditor.tooltip.previewVariance]
|
||||
title = "Variații în previzualizare"
|
||||
text = "Unele elemente vizuale (cum ar fi chenarul tabelelor, formele sau aspectul anotațiilor) pot să nu fie afișate exact în previzualizare. PDF-ul exportat păstrează comenzile de desen originale ori de câte ori este posibil."
|
||||
|
||||
[pdfTextEditor.tooltip.alpha]
|
||||
title = "Vizualizator Alpha"
|
||||
text = "Acest vizualizator alpha este încă în dezvoltare — anumite fonturi, culori, efecte de transparență și detalii de layout pot varia ușor. Verificați încă o dată PDF-ul generat înainte de a-l partaja."
|
||||
|
||||
[pdfTextEditor.manual]
|
||||
mergeTooltip = "Unește casetele selectate"
|
||||
merge = "Unește selecția"
|
||||
@@ -6556,7 +6106,7 @@ warnings = "Avertizări"
|
||||
suggestions = "Note"
|
||||
currentPageFonts = "Fonturi pe această pagină"
|
||||
allFonts = "Toate fonturile"
|
||||
fallback = "fallback"
|
||||
fallback = "rezervă"
|
||||
missing = "lipsește"
|
||||
perfectMessage = "Toate fonturile pot fi redate perfect."
|
||||
warningMessage = "Unele fonturi pot să nu fie redate corect."
|
||||
@@ -6614,58 +6164,3 @@ title = "Rezultate adăugare text"
|
||||
|
||||
[addText.error]
|
||||
failed = "A apărut o eroare la adăugarea textului în PDF."
|
||||
|
||||
[mobileUpload]
|
||||
title = "Încărcare de pe mobil"
|
||||
description = "Scanați pentru a încărca fotografii. Imaginile se convertesc automat în PDF."
|
||||
descriptionNoConvert = "Scanați pentru a încărca fotografii de pe dispozitivul mobil."
|
||||
error = "Eroare de conexiune"
|
||||
pollingError = "Eroare la verificarea fișierelor"
|
||||
sessionId = "ID sesiune"
|
||||
sessionCreateError = "Nu s-a putut crea sesiunea"
|
||||
expiryWarning = "Sesiunea expiră în curând"
|
||||
expiryWarningMessage = "Acest cod QR va expira în {{seconds}} secunde. Un nou cod va fi generat automat."
|
||||
filesReceived = "S-au primit {{count}} fișier(e)"
|
||||
connected = "Dispozitiv mobil conectat"
|
||||
instructions = "Scanați cu camera telefonului. Imaginile se convertesc automat în PDF."
|
||||
instructionsNoConvert = "Scanați cu camera telefonului pentru a încărca fișiere."
|
||||
|
||||
[mobileScanner]
|
||||
title = "Scanner mobil"
|
||||
noSession = "Sesiune invalidă"
|
||||
noSessionMessage = "Scanați un cod QR valid pentru a accesa această pagină."
|
||||
validating = "Se validează sesiunea..."
|
||||
sessionInvalid = "Eroare de sesiune"
|
||||
sessionExpired = "Această sesiune a expirat. Reîmprospătați și încercați din nou."
|
||||
sessionNotFound = "Sesiunea nu a fost găsită. Reîmprospătați și încercați din nou."
|
||||
sessionValidationError = "Nu s-a putut verifica sesiunea. Încercați din nou."
|
||||
uploadSuccess = "Încărcare reușită!"
|
||||
uploadSuccessMessage = "Imaginile au fost transferate."
|
||||
httpsRequired = "Accesul la cameră necesită HTTPS sau localhost. Folosiți HTTPS sau accesați prin localhost."
|
||||
uploadFailed = "Încărcarea a eșuat. Încercați din nou."
|
||||
uploading = "Se încarcă..."
|
||||
connected = "Conectat"
|
||||
connecting = "Se conectează..."
|
||||
chooseMethod = "Alegeți metoda de încărcare"
|
||||
chooseMethodDescription = "Selectați cum doriți să scanați și să încărcați documente"
|
||||
camera = "Cameră"
|
||||
cameraDescription = "Scanați documente folosind camera dispozitivului, cu detectare automată a marginilor"
|
||||
fileUpload = "Încărcare fișier"
|
||||
fileDescription = "Încărcați fotografii sau documente existente de pe dispozitiv"
|
||||
cameraAccessDenied = "Acces la cameră refuzat. Activați accesul la cameră."
|
||||
back = "Înapoi"
|
||||
settings = "Setări"
|
||||
edgeDetection = "Detectare margini"
|
||||
flashlight = "Lanternă"
|
||||
flash = "Flash"
|
||||
processing = "Se procesează..."
|
||||
capture = "Capturați fotografie"
|
||||
selectFilesPrompt = "Selectați fișiere de încărcat"
|
||||
selectImage = "Selectați imagine"
|
||||
preview = "Previzualizare"
|
||||
retake = "Refaceți"
|
||||
addToBatch = "Adăugați la lot"
|
||||
upload = "Încărcați"
|
||||
batchImages = "Lot"
|
||||
clearBatch = "Goliți"
|
||||
uploadAll = "Încărcați tot"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user