Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7314c96d7 |
@@ -1,12 +0,0 @@
|
||||
# CI Configuration
|
||||
|
||||
## CI Lite Mode
|
||||
|
||||
Skip non-essential CI workflows by setting a repository variable:
|
||||
|
||||
**Settings → Secrets and variables → Actions → Variables → New repository variable**
|
||||
|
||||
- Name: `CI_PROFILE`
|
||||
- Value: `lite`
|
||||
|
||||
Skips resource-intensive builds, releases, and OSS-specific workflows. Useful for deployment-only forks or faster CI runs.
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Auto PR V2 Deployment
|
||||
name: Auto PR main Deployment
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
pr_ref: ${{ steps.resolve.outputs.ref }}
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # main.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -89,12 +89,12 @@ jobs:
|
||||
else
|
||||
auth_users=("Frooodle" "sf298" "Ludy87" "LaserKaspar" "sbplat" "reecebrowne" "DarioGii" "ConnorYoh" "EthanHealy01" "jbrunton96" "balazs-szucs")
|
||||
is_auth=false; for u in "${auth_users[@]}"; do [ "$u" = "$PR_AUTHOR" ] && is_auth=true && break; done
|
||||
if [ "$PR_BASE" = "V2" ] && [ "$is_auth" = true ]; then
|
||||
if [ "$PR_BASE" = "main" ] && [ "$is_auth" = true ]; then
|
||||
should=true
|
||||
else
|
||||
title_has_v2=false; echo "$PR_TITLE" | grep -qiE 'v2|version.?2|version.?two' && title_has_v2=true
|
||||
branch_has_kw=false; echo "$PR_BRANCH" | grep -qiE 'v2|react' && branch_has_kw=true
|
||||
if [ "$is_auth" = true ] && { [ "$title_has_v2" = true ] || [ "$branch_has_kw" = true ]; }; then
|
||||
title_has_main=false; echo "$PR_TITLE" | grep -qiE 'main|version.?2|version.?two' && title_has_main=true
|
||||
branch_has_kw=false; echo "$PR_BRANCH" | grep -qiE 'main|react' && branch_has_kw=true
|
||||
if [ "$is_auth" = true ] && { [ "$title_has_main" = true ] || [ "$branch_has_kw" = true ]; }; then
|
||||
should=true
|
||||
fi
|
||||
fi
|
||||
@@ -103,13 +103,13 @@ jobs:
|
||||
echo "should_deploy=$should" >> $GITHUB_OUTPUT
|
||||
echo "allow_fork=${allow_fork:-false}" >> $GITHUB_OUTPUT
|
||||
|
||||
deploy-v2-pr:
|
||||
deploy-main-pr:
|
||||
needs: check-pr
|
||||
runs-on: ubuntu-latest
|
||||
if: needs.check-pr.outputs.should_deploy == 'true' && (needs.check-pr.outputs.is_fork == 'false' || needs.check-pr.outputs.allow_fork == 'true')
|
||||
# Concurrency control - only one deployment per PR at a time
|
||||
concurrency:
|
||||
group: v2-deploy-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
group: main-deploy-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
cancel-in-progress: true
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -118,7 +118,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # main.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -146,7 +146,7 @@ jobs:
|
||||
const { owner, repo } = context.repo;
|
||||
const prNumber = ${{ needs.check-pr.outputs.pr_number }};
|
||||
|
||||
// Delete previous V2 deployment comments to avoid clutter
|
||||
// Delete previous main deployment comments to avoid clutter
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner,
|
||||
repo,
|
||||
@@ -154,14 +154,14 @@ jobs:
|
||||
per_page: 100
|
||||
});
|
||||
|
||||
const v2Comments = comments.filter(comment =>
|
||||
comment.body.includes('🚀 **Auto-deploying V2 version**') ||
|
||||
comment.body.includes('## 🚀 V2 Auto-Deployment Complete!') ||
|
||||
comment.body.includes('❌ **V2 Auto-deployment failed**')
|
||||
const mainComments = comments.filter(comment =>
|
||||
comment.body.includes('🚀 **Auto-deploying main version**') ||
|
||||
comment.body.includes('## 🚀 main Auto-Deployment Complete!') ||
|
||||
comment.body.includes('❌ **main Auto-deployment failed**')
|
||||
);
|
||||
|
||||
for (const comment of v2Comments) {
|
||||
console.log(`Deleting old V2 comment: ${comment.id}`);
|
||||
for (const comment of mainComments) {
|
||||
console.log(`Deleting old main comment: ${comment.id}`);
|
||||
await github.rest.issues.deleteComment({
|
||||
owner,
|
||||
repo,
|
||||
@@ -174,7 +174,7 @@ jobs:
|
||||
owner,
|
||||
repo,
|
||||
issue_number: prNumber,
|
||||
body: `🚀 **Auto-deploying V2 version** for PR #${prNumber}...\n\n_This is an automated deployment triggered by V2/version2 keywords in the PR title or V2/React keywords in the branch name._\n\n⚠️ **Note:** If new commits are pushed during deployment, this build will be cancelled and replaced with the latest version.`
|
||||
body: `🚀 **Auto-deploying main version** for PR #${prNumber}...\n\n_This is an automated deployment triggered by main/version2 keywords in the PR title or main/React keywords in the branch name._\n\n⚠️ **Note:** If new commits are pushed during deployment, this build will be cancelled and replaced with the latest version.`
|
||||
});
|
||||
return newComment.id;
|
||||
|
||||
@@ -238,7 +238,7 @@ jobs:
|
||||
- name: Check if frontend image exists
|
||||
id: check-frontend
|
||||
run: |
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-frontend-${{ steps.commit-hashes.outputs.frontend_short }} >/dev/null 2>&1; then
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-frontend-${{ steps.commit-hashes.outputs.frontend_short }} >/dev/null 2>&1; then
|
||||
echo "exists=true" >> $GITHUB_OUTPUT
|
||||
echo "Frontend image already exists, skipping build"
|
||||
else
|
||||
@@ -249,7 +249,7 @@ jobs:
|
||||
- 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
|
||||
if docker manifest inspect ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-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
|
||||
@@ -257,26 +257,26 @@ jobs:
|
||||
echo "Backend image needs to be built"
|
||||
fi
|
||||
|
||||
- name: Build and push V2 frontend image
|
||||
- name: Build and push main frontend image
|
||||
if: steps.check-frontend.outputs.exists == 'false'
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
file: ./docker/frontend/Dockerfile
|
||||
push: true
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:v2-frontend-${{ steps.commit-hashes.outputs.frontend_short }}
|
||||
build-args: VERSION_TAG=v2-alpha
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-frontend-${{ steps.commit-hashes.outputs.frontend_short }}
|
||||
build-args: VERSION_TAG=main-alpha
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Build and push V2 backend image
|
||||
- name: Build and push main 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
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-backend-${{ steps.commit-hashes.outputs.backend_short }}
|
||||
build-args: VERSION_TAG=main-alpha
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Set up SSH
|
||||
@@ -285,66 +285,66 @@ jobs:
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Deploy V2 to VPS
|
||||
- name: Deploy main to VPS
|
||||
id: deploy
|
||||
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
|
||||
main_PORT=${{ needs.check-pr.outputs.pr_number }}
|
||||
BACKEND_PORT=$((main_PORT + 10000)) # Backend on higher port to avoid conflicts
|
||||
|
||||
# Create docker-compose for V2 with separate frontend and backend
|
||||
# Create docker-compose for main with separate frontend and backend
|
||||
cat > docker-compose.yml << EOF
|
||||
version: '3.3'
|
||||
services:
|
||||
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 }}
|
||||
stirling-pdf-main-backend:
|
||||
container_name: stirling-pdf-main-backend-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-backend-${{ steps.commit-hashes.outputs.backend_short }}
|
||||
ports:
|
||||
- "${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
|
||||
- /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}/logs:/logs:rw
|
||||
- /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}/data:/usr/share/tessdata:rw
|
||||
- /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}/config:/configs:rw
|
||||
- /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}/logs:/logs:rw
|
||||
environment:
|
||||
DISABLE_ADDITIONAL_FEATURES: "false"
|
||||
SECURITY_ENABLELOGIN: "true"
|
||||
SECURITY_INITIALLOGIN_USERNAME: "${{ secrets.TEST_LOGIN_USERNAME }}"
|
||||
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 }} - Frontend/Backend Split Architecture"
|
||||
UI_APPNAMENAVBAR: "V2 PR#${{ needs.check-pr.outputs.pr_number }}"
|
||||
UI_APPNAME: "Stirling-PDF main PR#${{ needs.check-pr.outputs.pr_number }}"
|
||||
UI_HOMEDESCRIPTION: "main PR#${{ needs.check-pr.outputs.pr_number }} - Frontend/Backend Split Architecture"
|
||||
UI_APPNAMENAVBAR: "main PR#${{ needs.check-pr.outputs.pr_number }}"
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "false"
|
||||
SWAGGER_SERVER_URL: "https://${V2_PORT}.ssl.stirlingpdf.cloud"
|
||||
baseUrl: "https://${V2_PORT}.ssl.stirlingpdf.cloud"
|
||||
SWAGGER_SERVER_URL: "https://${main_PORT}.ssl.stirlingpdf.cloud"
|
||||
baseUrl: "https://${main_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 }}
|
||||
stirling-pdf-main-frontend:
|
||||
container_name: stirling-pdf-main-frontend-pr-${{ needs.check-pr.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:main-frontend-${{ steps.commit-hashes.outputs.frontend_short }}
|
||||
ports:
|
||||
- "${V2_PORT}:80" # Frontend port (same as regular PRs)
|
||||
- "${main_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
|
||||
- stirling-pdf-main-backend
|
||||
restart: on-failure:5
|
||||
EOF
|
||||
|
||||
# Deploy to VPS
|
||||
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
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/docker-compose-main.yml
|
||||
|
||||
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}
|
||||
# Create main PR-specific directories
|
||||
mkdir -p /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}/{data,config,logs}
|
||||
|
||||
# Move docker-compose file to correct location
|
||||
mv /tmp/docker-compose-v2.yml /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}/docker-compose.yml
|
||||
mv /tmp/docker-compose-main.yml /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}/docker-compose.yml
|
||||
|
||||
# Stop any existing container and clean up
|
||||
cd /stirling/V2-PR-${{ needs.check-pr.outputs.pr_number }}
|
||||
cd /stirling/main-PR-${{ needs.check-pr.outputs.pr_number }}
|
||||
docker-compose down --remove-orphans 2>/dev/null || true
|
||||
|
||||
# Start the new container
|
||||
@@ -359,9 +359,9 @@ jobs:
|
||||
ENDSSH
|
||||
|
||||
# Set port for output
|
||||
echo "v2_port=${V2_PORT}" >> $GITHUB_OUTPUT
|
||||
echo "main_port=${main_PORT}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Post V2 deployment URL to PR
|
||||
- name: Post main deployment URL to PR
|
||||
if: success()
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
with:
|
||||
@@ -369,7 +369,7 @@ jobs:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
const prNumber = ${{ needs.check-pr.outputs.pr_number }};
|
||||
const v2Port = ${{ steps.deploy.outputs.v2_port }};
|
||||
const mainPort = ${{ steps.deploy.outputs.main_port }};
|
||||
|
||||
// Delete the "deploying..." comment since we're posting the final result
|
||||
const deploymentStartedId = ${{ steps.deployment-started.outputs.result }};
|
||||
@@ -386,15 +386,15 @@ jobs:
|
||||
}
|
||||
}
|
||||
|
||||
const deploymentUrl = `http://${{ secrets.VPS_HOST }}:${v2Port}`;
|
||||
const httpsUrl = `https://${v2Port}.ssl.stirlingpdf.cloud`;
|
||||
const deploymentUrl = `http://${{ secrets.VPS_HOST }}:${mainPort}`;
|
||||
const httpsUrl = `https://${mainPort}.ssl.stirlingpdf.cloud`;
|
||||
|
||||
const commentBody = `## 🚀 V2 Auto-Deployment Complete!\n\n` +
|
||||
`Your V2 PR with the new frontend/backend split architecture has been deployed!\n\n` +
|
||||
const commentBody = `## 🚀 main Auto-Deployment Complete!\n\n` +
|
||||
`Your main 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` +
|
||||
`🔄 **Auto-deployed** because PR title or branch name contains V2/version2/React keywords.`;
|
||||
`🔄 **Auto-deployed** because PR title or branch name contains main/version2/React keywords.`;
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
@@ -403,7 +403,7 @@ jobs:
|
||||
body: commentBody
|
||||
});
|
||||
|
||||
cleanup-v2-deployment:
|
||||
cleanup-main-deployment:
|
||||
if: github.event.action == 'closed'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -413,7 +413,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
||||
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # main.12.2
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -429,7 +429,7 @@ jobs:
|
||||
app-id: ${{ secrets.GH_APP_ID }}
|
||||
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Clean up V2 deployment comments
|
||||
- name: Clean up main deployment comments
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
with:
|
||||
github-token: ${{ steps.setup-bot.outputs.token }}
|
||||
@@ -437,25 +437,25 @@ jobs:
|
||||
const { owner, repo } = context.repo;
|
||||
const prNumber = ${{ github.event.pull_request.number }};
|
||||
|
||||
// Find and delete V2 deployment comments
|
||||
// Find and delete main deployment comments
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: prNumber
|
||||
});
|
||||
|
||||
const v2Comments = comments.filter(c =>
|
||||
c.body?.includes("## 🚀 V2 Auto-Deployment Complete!") &&
|
||||
const mainComments = comments.filter(c =>
|
||||
c.body?.includes("## 🚀 main Auto-Deployment Complete!") &&
|
||||
c.user?.type === "Bot"
|
||||
);
|
||||
|
||||
for (const comment of v2Comments) {
|
||||
for (const comment of mainComments) {
|
||||
await github.rest.issues.deleteComment({
|
||||
owner,
|
||||
repo,
|
||||
comment_id: comment.id
|
||||
});
|
||||
console.log(`Deleted V2 deployment comment (ID: ${comment.id})`);
|
||||
console.log(`Deleted main deployment comment (ID: ${comment.id})`);
|
||||
}
|
||||
|
||||
- name: Set up SSH
|
||||
@@ -464,29 +464,29 @@ jobs:
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Cleanup V2 deployment
|
||||
- name: Cleanup main deployment
|
||||
run: |
|
||||
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..."
|
||||
if [ -d "/stirling/main-PR-${{ github.event.pull_request.number }}" ]; then
|
||||
echo "Found main PR directory, proceeding with cleanup..."
|
||||
|
||||
# Stop and remove V2 containers
|
||||
cd /stirling/V2-PR-${{ github.event.pull_request.number }}
|
||||
# Stop and remove main containers
|
||||
cd /stirling/main-PR-${{ github.event.pull_request.number }}
|
||||
docker-compose down || true
|
||||
|
||||
# Go back to root before removal
|
||||
cd /
|
||||
|
||||
# Remove V2 PR-specific directories
|
||||
rm -rf /stirling/V2-PR-${{ github.event.pull_request.number }}
|
||||
# Remove main PR-specific directories
|
||||
rm -rf /stirling/main-PR-${{ github.event.pull_request.number }}
|
||||
|
||||
# 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
|
||||
# Clean up main containers by name (in case compose cleanup missed them)
|
||||
docker rm -f stirling-pdf-main-frontend-pr-${{ github.event.pull_request.number }} || true
|
||||
docker rm -f stirling-pdf-main-backend-pr-${{ github.event.pull_request.number }} || true
|
||||
|
||||
echo "V2 cleanup completed"
|
||||
echo "main cleanup completed"
|
||||
else
|
||||
echo "V2 PR directory not found, nothing to clean up"
|
||||
echo "main PR directory not found, nothing to clean up"
|
||||
fi
|
||||
|
||||
# Clean up old unused images (older than 2 weeks) but keep recent ones for reuse
|
||||
|
||||
@@ -14,7 +14,6 @@ jobs:
|
||||
permissions:
|
||||
issues: write
|
||||
if: |
|
||||
vars.CI_PROFILE != 'lite' &&
|
||||
github.event.issue.pull_request &&
|
||||
(
|
||||
contains(github.event.comment.body, 'prdeploy') ||
|
||||
|
||||
@@ -262,13 +262,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- docker-rev: docker/embedded/Dockerfile
|
||||
artifact-suffix: Dockerfile
|
||||
- docker-rev: docker/embedded/Dockerfile.ultra-lite
|
||||
artifact-suffix: Dockerfile.ultra-lite
|
||||
- docker-rev: docker/embedded/Dockerfile.fat
|
||||
artifact-suffix: Dockerfile.fat
|
||||
docker-rev: ["docker/embedded/Dockerfile", "docker/embedded/Dockerfile.ultra-lite", "docker/embedded/Dockerfile.fat"]
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
@@ -278,13 +272,6 @@ jobs:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
|
||||
- name: Free disk space on runner
|
||||
run: |
|
||||
echo "Disk space before cleanup:" && df -h
|
||||
sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/lib/android /usr/local/share/boost
|
||||
docker system prune -af || true
|
||||
echo "Disk space after cleanup:" && df -h
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0
|
||||
with:
|
||||
@@ -326,7 +313,7 @@ jobs:
|
||||
if: always()
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
with:
|
||||
name: reports-docker-${{ matrix.artifact-suffix }}
|
||||
name: reports-docker-${{ matrix.docker-rev }}
|
||||
path: |
|
||||
build/reports/tests/
|
||||
build/test-results/
|
||||
|
||||
@@ -31,7 +31,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
determine-matrix:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
|
||||
@@ -24,7 +24,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-24.04-8core
|
||||
permissions:
|
||||
packages: write
|
||||
|
||||
@@ -24,7 +24,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
|
||||
@@ -17,7 +17,6 @@ permissions: read-all
|
||||
|
||||
jobs:
|
||||
analysis:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
name: Scorecard analysis
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
|
||||
@@ -27,7 +27,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
sonarqube:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -10,7 +10,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
@@ -23,7 +23,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -28,7 +28,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
determine-matrix:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
@@ -637,8 +636,6 @@ jobs:
|
||||
if [ "${{ needs.build.result }}" = "success" ]; then
|
||||
echo "✅ All Tauri builds completed successfully!"
|
||||
echo "Artifacts are ready for distribution."
|
||||
elif [ "${{ needs.build.result }}" = "skipped" ]; then
|
||||
echo "⏭️ Tauri builds skipped (CI lite mode enabled)"
|
||||
else
|
||||
echo "❌ Some Tauri builds failed."
|
||||
echo "Please check the logs and fix any issues."
|
||||
|
||||
@@ -21,7 +21,6 @@ permissions:
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -112,6 +112,7 @@ public class ApplicationProperties {
|
||||
@Data
|
||||
public static class Security {
|
||||
private Boolean enableLogin;
|
||||
private Boolean csrfDisabled;
|
||||
private InitialLogin initialLogin = new InitialLogin();
|
||||
private OAUTH2 oauth2 = new OAUTH2();
|
||||
private SAML2 saml2 = new SAML2();
|
||||
@@ -574,16 +575,6 @@ public class ApplicationProperties {
|
||||
private String username;
|
||||
@ToString.Exclude private String password;
|
||||
private String from;
|
||||
// STARTTLS upgrades a plain SMTP connection to TLS after connecting (RFC 3207)
|
||||
private Boolean startTlsEnable = true;
|
||||
private Boolean startTlsRequired;
|
||||
// SSL/TLS wrapper for implicit TLS (typically port 465)
|
||||
private Boolean sslEnable;
|
||||
// Hostnames or patterns (e.g., "smtp.example.com" or "*") to trust for TLS certificates;
|
||||
// defaults to "*" (trust all) when not set
|
||||
private String sslTrust;
|
||||
// Enables hostname verification for TLS connections
|
||||
private Boolean sslCheckServerIdentity;
|
||||
}
|
||||
|
||||
@Data
|
||||
|
||||
@@ -254,7 +254,10 @@ public class PostHogService {
|
||||
properties,
|
||||
"security_enableLogin",
|
||||
applicationProperties.getSecurity().getEnableLogin());
|
||||
addIfNotEmpty(properties, "security_csrfDisabled", true);
|
||||
addIfNotEmpty(
|
||||
properties,
|
||||
"security_csrfDisabled",
|
||||
applicationProperties.getSecurity().getCsrfDisabled());
|
||||
addIfNotEmpty(
|
||||
properties,
|
||||
"security_loginAttemptCount",
|
||||
|
||||
@@ -162,9 +162,10 @@ public class RequestUriUtils {
|
||||
// enableLogin)
|
||||
|| trimmedUri.startsWith(
|
||||
"/api/v1/ui-data/footer-info") // Public footer configuration
|
||||
|| trimmedUri.startsWith("/v1/api-docs")
|
||||
|| trimmedUri.startsWith("/api/v1/invite/validate")
|
||||
|| trimmedUri.startsWith("/api/v1/invite/accept")
|
||||
|| trimmedUri.startsWith("/v1/api-docs");
|
||||
|| trimmedUri.contains("/v1/api-docs");
|
||||
}
|
||||
|
||||
private static String stripContextPath(String contextPath, String requestURI) {
|
||||
|
||||
@@ -34,6 +34,7 @@ public class InitialSetup {
|
||||
public void init() throws IOException {
|
||||
initUUIDKey();
|
||||
initSecretKey();
|
||||
initEnableCSRFSecurity();
|
||||
initLegalUrls();
|
||||
initSetAppVersion();
|
||||
GeneralUtils.extractPipeline();
|
||||
@@ -59,6 +60,18 @@ public class InitialSetup {
|
||||
}
|
||||
}
|
||||
|
||||
public void initEnableCSRFSecurity() throws IOException {
|
||||
if (GeneralUtils.isVersionHigher(
|
||||
"0.46.0", applicationProperties.getAutomaticallyGenerated().getAppVersion())) {
|
||||
Boolean csrf = applicationProperties.getSecurity().getCsrfDisabled();
|
||||
if (!csrf) {
|
||||
GeneralUtils.saveKeyToSettings("security.csrfDisabled", false);
|
||||
GeneralUtils.saveKeyToSettings("system.enableAnalytics", true);
|
||||
applicationProperties.getSecurity().setCsrfDisabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void initLegalUrls() throws IOException {
|
||||
// Initialize Terms and Conditions
|
||||
String termsUrl = applicationProperties.getLegal().getTermsAndConditions();
|
||||
@@ -82,7 +95,7 @@ public class InitialSetup {
|
||||
isNewServer =
|
||||
existingVersion == null
|
||||
|| existingVersion.isEmpty()
|
||||
|| "0.0.0".equals(existingVersion);
|
||||
|| existingVersion.equals("0.0.0");
|
||||
|
||||
String appVersion = "0.0.0";
|
||||
Resource resource = new ClassPathResource("version.properties");
|
||||
|
||||
@@ -62,15 +62,10 @@ public class OpenApiConfig {
|
||||
|
||||
// Add server configuration from environment variable
|
||||
String swaggerServerUrl = System.getenv("SWAGGER_SERVER_URL");
|
||||
Server server;
|
||||
if (swaggerServerUrl != null && !swaggerServerUrl.trim().isEmpty()) {
|
||||
server = new Server().url(swaggerServerUrl).description("API Server");
|
||||
} else {
|
||||
// Use relative path so Swagger uses the current browser origin to avoid CORS issues
|
||||
// when accessing via different ports
|
||||
server = new Server().url("/").description("Current Server");
|
||||
Server server = new Server().url(swaggerServerUrl).description("API Server");
|
||||
openAPI.addServersItem(server);
|
||||
}
|
||||
openAPI.addServersItem(server);
|
||||
|
||||
// Add ErrorResponse schema to components
|
||||
Schema<?> errorResponseSchema =
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
package stirling.software.SPDF.config;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.CacheControl;
|
||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -29,20 +25,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
registry.addInterceptor(endpointInterceptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
// Cache hashed assets (JS/CSS with content hashes) for 1 year
|
||||
// These files have names like index-ChAS4tCC.js that change when content changes
|
||||
registry.addResourceHandler("/assets/**")
|
||||
.addResourceLocations("classpath:/static/assets/")
|
||||
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS).cachePublic());
|
||||
|
||||
// Don't cache index.html - it needs to be fresh to reference latest hashed assets
|
||||
registry.addResourceHandler("/index.html")
|
||||
.addResourceLocations("classpath:/static/")
|
||||
.setCacheControl(CacheControl.noCache().mustRevalidate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
// Check if running in Tauri mode
|
||||
|
||||
@@ -124,6 +124,7 @@ public class SettingsController {
|
||||
ApplicationProperties.Security security = applicationProperties.getSecurity();
|
||||
|
||||
settings.put("enableLogin", security.getEnableLogin());
|
||||
settings.put("csrfDisabled", security.getCsrfDisabled());
|
||||
settings.put("loginMethod", security.getLoginMethod());
|
||||
settings.put("loginAttemptCount", security.getLoginAttemptCount());
|
||||
settings.put("loginResetTimeMinutes", security.getLoginResetTimeMinutes());
|
||||
@@ -158,6 +159,12 @@ public class SettingsController {
|
||||
.getSecurity()
|
||||
.setEnableLogin((Boolean) settings.get("enableLogin"));
|
||||
}
|
||||
if (settings.containsKey("csrfDisabled")) {
|
||||
GeneralUtils.saveKeyToSettings("security.csrfDisabled", settings.get("csrfDisabled"));
|
||||
applicationProperties
|
||||
.getSecurity()
|
||||
.setCsrfDisabled((Boolean) settings.get("csrfDisabled"));
|
||||
}
|
||||
if (settings.containsKey("loginMethod")) {
|
||||
GeneralUtils.saveKeyToSettings("security.loginMethod", settings.get("loginMethod"));
|
||||
applicationProperties
|
||||
|
||||
-1
@@ -74,7 +74,6 @@ public class ConfigController {
|
||||
configData.put("appNameNavbar", applicationProperties.getUi().getAppNameNavbar());
|
||||
configData.put("languages", applicationProperties.getUi().getLanguages());
|
||||
configData.put("logoStyle", applicationProperties.getUi().getLogoStyle());
|
||||
configData.put("defaultLocale", applicationProperties.getSystem().getDefaultLocale());
|
||||
|
||||
// Security settings
|
||||
// enableLogin requires both the config flag AND proprietary features to be loaded
|
||||
|
||||
+7
-6
@@ -4,6 +4,8 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
@@ -11,7 +13,6 @@ import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
@Controller
|
||||
@@ -62,10 +63,9 @@ public class ReactRoutingController {
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping(
|
||||
value = {"/", "/index.html"},
|
||||
produces = MediaType.TEXT_HTML_VALUE)
|
||||
public ResponseEntity<String> serveIndexHtml(HttpServletRequest request) throws IOException {
|
||||
@GetMapping(value = {"/", "/index.html"}, produces = MediaType.TEXT_HTML_VALUE)
|
||||
public ResponseEntity<String> serveIndexHtml(HttpServletRequest request)
|
||||
throws IOException {
|
||||
if (indexHtmlExists && cachedIndexHtml != null) {
|
||||
return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(cachedIndexHtml);
|
||||
}
|
||||
@@ -75,7 +75,8 @@ public class ReactRoutingController {
|
||||
|
||||
@GetMapping(
|
||||
"/{path:^(?!api|static|robots\\.txt|favicon\\.ico|manifest.*\\.json|pipeline|pdfjs|pdfjs-legacy|fonts|images|files|css|js|assets|locales|modern-logo|classic-logo|Login|og_images|samples)[^\\.]*$}")
|
||||
public ResponseEntity<String> forwardRootPaths(HttpServletRequest request) throws IOException {
|
||||
public ResponseEntity<String> forwardRootPaths(HttpServletRequest request)
|
||||
throws IOException {
|
||||
return serveIndexHtml(request);
|
||||
}
|
||||
|
||||
|
||||
+2
-64
@@ -33,12 +33,8 @@ public class PdfJsonFallbackFontService {
|
||||
public static final String FALLBACK_FONT_CJK_ID = "fallback-noto-cjk";
|
||||
public static final String FALLBACK_FONT_JP_ID = "fallback-noto-jp";
|
||||
public static final String FALLBACK_FONT_KR_ID = "fallback-noto-korean";
|
||||
public static final String FALLBACK_FONT_TC_ID = "fallback-noto-tc";
|
||||
public static final String FALLBACK_FONT_AR_ID = "fallback-noto-arabic";
|
||||
public static final String FALLBACK_FONT_TH_ID = "fallback-noto-thai";
|
||||
public static final String FALLBACK_FONT_DEVANAGARI_ID = "fallback-noto-devanagari";
|
||||
public static final String FALLBACK_FONT_MALAYALAM_ID = "fallback-noto-malayalam";
|
||||
public static final String FALLBACK_FONT_TIBETAN_ID = "fallback-noto-tibetan";
|
||||
|
||||
// Font name aliases map PDF font names to available fallback fonts
|
||||
// This provides better visual consistency when editing PDFs
|
||||
@@ -63,22 +59,6 @@ public class PdfJsonFallbackFontService {
|
||||
Map.entry("dejavuserif", "fallback-dejavu-serif"),
|
||||
Map.entry("dejavumono", "fallback-dejavu-mono"),
|
||||
Map.entry("dejavusansmono", "fallback-dejavu-mono"),
|
||||
// Traditional Chinese fonts (Taiwan, Hong Kong, Macau)
|
||||
Map.entry("mingliu", "fallback-noto-tc"),
|
||||
Map.entry("pmingliu", "fallback-noto-tc"),
|
||||
Map.entry("microsoftjhenghei", "fallback-noto-tc"),
|
||||
Map.entry("jhenghei", "fallback-noto-tc"),
|
||||
Map.entry("kaiti", "fallback-noto-tc"),
|
||||
Map.entry("kaiu", "fallback-noto-tc"),
|
||||
Map.entry("dfkaib5", "fallback-noto-tc"),
|
||||
Map.entry("dfkai", "fallback-noto-tc"),
|
||||
// Simplified Chinese fonts (Mainland China) - more common
|
||||
Map.entry("simsun", "fallback-noto-cjk"),
|
||||
Map.entry("simhei", "fallback-noto-cjk"),
|
||||
Map.entry("microsoftyahei", "fallback-noto-cjk"),
|
||||
Map.entry("yahei", "fallback-noto-cjk"),
|
||||
Map.entry("songti", "fallback-noto-cjk"),
|
||||
Map.entry("heiti", "fallback-noto-cjk"),
|
||||
// Noto Sans - Google's universal font (use as last resort generic fallback)
|
||||
Map.entry("noto", "fallback-noto-sans"),
|
||||
Map.entry("notosans", "fallback-noto-sans"));
|
||||
@@ -103,12 +83,6 @@ public class PdfJsonFallbackFontService {
|
||||
"classpath:/static/fonts/NotoSansKR-Regular.ttf",
|
||||
"NotoSansKR-Regular",
|
||||
"ttf")),
|
||||
Map.entry(
|
||||
FALLBACK_FONT_TC_ID,
|
||||
new FallbackFontSpec(
|
||||
"classpath:/static/fonts/NotoSansTC-Regular.ttf",
|
||||
"NotoSansTC-Regular",
|
||||
"ttf")),
|
||||
Map.entry(
|
||||
FALLBACK_FONT_AR_ID,
|
||||
new FallbackFontSpec(
|
||||
@@ -121,24 +95,6 @@ public class PdfJsonFallbackFontService {
|
||||
"classpath:/static/fonts/NotoSansThai-Regular.ttf",
|
||||
"NotoSansThai-Regular",
|
||||
"ttf")),
|
||||
Map.entry(
|
||||
FALLBACK_FONT_DEVANAGARI_ID,
|
||||
new FallbackFontSpec(
|
||||
"classpath:/static/fonts/NotoSansDevanagari-Regular.ttf",
|
||||
"NotoSansDevanagari-Regular",
|
||||
"ttf")),
|
||||
Map.entry(
|
||||
FALLBACK_FONT_MALAYALAM_ID,
|
||||
new FallbackFontSpec(
|
||||
"classpath:/static/fonts/NotoSansMalayalam-Regular.ttf",
|
||||
"NotoSansMalayalam-Regular",
|
||||
"ttf")),
|
||||
Map.entry(
|
||||
FALLBACK_FONT_TIBETAN_ID,
|
||||
new FallbackFontSpec(
|
||||
"classpath:/static/fonts/NotoSerifTibetan-Regular.ttf",
|
||||
"NotoSerifTibetan-Regular",
|
||||
"ttf")),
|
||||
// Liberation Sans family
|
||||
Map.entry(
|
||||
"fallback-liberation-sans",
|
||||
@@ -528,20 +484,6 @@ public class PdfJsonFallbackFontService {
|
||||
*/
|
||||
public String resolveFallbackFontId(int codePoint) {
|
||||
Character.UnicodeBlock block = Character.UnicodeBlock.of(codePoint);
|
||||
|
||||
// Bopomofo is primarily used in Taiwan for Traditional Chinese phonetic annotation
|
||||
if (block == Character.UnicodeBlock.BOPOMOFO
|
||||
|| block == Character.UnicodeBlock.BOPOMOFO_EXTENDED) {
|
||||
return FALLBACK_FONT_TC_ID;
|
||||
}
|
||||
|
||||
// Compatibility ideographs are primarily used by Traditional Chinese encodings (e.g., Big5,
|
||||
// HKSCS) so prefer the Traditional Chinese fallback here.
|
||||
if (block == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|
||||
|| block == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT) {
|
||||
return FALLBACK_FONT_TC_ID;
|
||||
}
|
||||
|
||||
if (block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|
||||
|| block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|
||||
|| block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|
||||
@@ -550,23 +492,19 @@ public class PdfJsonFallbackFontService {
|
||||
|| block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E
|
||||
|| block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F
|
||||
|| block == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|
||||
|| block == Character.UnicodeBlock.BOPOMOFO
|
||||
|| block == Character.UnicodeBlock.BOPOMOFO_EXTENDED
|
||||
|| block == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
|
||||
return FALLBACK_FONT_CJK_ID;
|
||||
}
|
||||
|
||||
Character.UnicodeScript script = Character.UnicodeScript.of(codePoint);
|
||||
return switch (script) {
|
||||
// HAN script is used by both Simplified and Traditional Chinese
|
||||
// Default to Simplified (mainland China, 1.4B speakers) as it's more common
|
||||
// Traditional Chinese PDFs are detected via font name aliases (MingLiU, PMingLiU, etc.)
|
||||
case HAN -> FALLBACK_FONT_CJK_ID;
|
||||
case HIRAGANA, KATAKANA -> FALLBACK_FONT_JP_ID;
|
||||
case HANGUL -> FALLBACK_FONT_KR_ID;
|
||||
case ARABIC -> FALLBACK_FONT_AR_ID;
|
||||
case THAI -> FALLBACK_FONT_TH_ID;
|
||||
case DEVANAGARI -> FALLBACK_FONT_DEVANAGARI_ID;
|
||||
case MALAYALAM -> FALLBACK_FONT_MALAYALAM_ID;
|
||||
case TIBETAN -> FALLBACK_FONT_TIBETAN_ID;
|
||||
default -> FALLBACK_FONT_ID;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
security:
|
||||
enableLogin: true # set to 'true' to enable login
|
||||
csrfDisabled: false # set to 'true' to disable CSRF protection (not recommended for production)
|
||||
loginAttemptCount: 5 # lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1
|
||||
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
||||
loginMethod: all # Accepts values like 'all' and 'normal'(only Login with Username/Password), 'oauth2'(only Login with OAuth2) or 'saml2'(only Login with SAML2)
|
||||
@@ -104,11 +105,6 @@ mail:
|
||||
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
|
||||
sslCheckServerIdentity: false # enable hostname verification when using SSL/TLS
|
||||
|
||||
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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-9
@@ -205,10 +205,6 @@ public class ProprietaryUIDataController {
|
||||
data.setLoginMethod(securityProps.getLoginMethod());
|
||||
data.setAltLogin(!providerList.isEmpty() && securityProps.isAltLogin());
|
||||
|
||||
// Add language configuration for login page
|
||||
data.setLanguages(applicationProperties.getUi().getLanguages());
|
||||
data.setDefaultLocale(applicationProperties.getSystem().getDefaultLocale());
|
||||
|
||||
return ResponseEntity.ok(data);
|
||||
}
|
||||
|
||||
@@ -332,7 +328,6 @@ public class ProprietaryUIDataController {
|
||||
data.setGrandfatheredUserCount(grandfatheredCount);
|
||||
data.setLicenseMaxUsers(licenseMaxUsers);
|
||||
data.setPremiumEnabled(premiumEnabled);
|
||||
data.setMailEnabled(applicationProperties.getMail().isEnabled());
|
||||
|
||||
return ResponseEntity.ok(data);
|
||||
}
|
||||
@@ -381,7 +376,7 @@ public class ProprietaryUIDataController {
|
||||
data.setUsername(username);
|
||||
data.setRole(user.get().getRolesAsString());
|
||||
data.setSettings(settingsJson);
|
||||
data.setChangeCredsFlag(user.get().isFirstLogin() || user.get().isForcePasswordChange());
|
||||
data.setChangeCredsFlag(user.get().isFirstLogin());
|
||||
data.setOAuth2Login(isOAuth2Login);
|
||||
data.setSaml2Login(isSaml2Login);
|
||||
|
||||
@@ -496,8 +491,6 @@ public class ProprietaryUIDataController {
|
||||
private boolean altLogin;
|
||||
private boolean firstTimeSetup;
|
||||
private boolean showDefaultCredentials;
|
||||
private List<String> languages;
|
||||
private String defaultLocale;
|
||||
}
|
||||
|
||||
@Data
|
||||
@@ -517,7 +510,6 @@ public class ProprietaryUIDataController {
|
||||
private int grandfatheredUserCount;
|
||||
private int licenseMaxUsers;
|
||||
private boolean premiumEnabled;
|
||||
private boolean mailEnabled;
|
||||
}
|
||||
|
||||
@Data
|
||||
|
||||
+2
-27
@@ -33,8 +33,7 @@ public class MailConfig {
|
||||
|
||||
// Creates a new instance of JavaMailSenderImpl, which is a Spring implementation
|
||||
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
|
||||
String host = mailProperties.getHost();
|
||||
mailSender.setHost(host);
|
||||
mailSender.setHost(mailProperties.getHost());
|
||||
mailSender.setPort(mailProperties.getPort());
|
||||
mailSender.setDefaultEncoding("UTF-8");
|
||||
|
||||
@@ -71,32 +70,8 @@ public class MailConfig {
|
||||
log.info("SMTP authentication disabled - no credentials provided");
|
||||
}
|
||||
|
||||
boolean startTlsEnabled =
|
||||
mailProperties.getStartTlsEnable() == null || mailProperties.getStartTlsEnable();
|
||||
// Enables STARTTLS to encrypt the connection if supported by the SMTP server
|
||||
props.put("mail.smtp.starttls.enable", Boolean.toString(startTlsEnabled));
|
||||
if (mailProperties.getStartTlsRequired() != null) {
|
||||
props.put(
|
||||
"mail.smtp.starttls.required", mailProperties.getStartTlsRequired().toString());
|
||||
}
|
||||
|
||||
if (mailProperties.getSslEnable() != null) {
|
||||
props.put("mail.smtp.ssl.enable", mailProperties.getSslEnable().toString());
|
||||
}
|
||||
|
||||
// Trust the configured host to allow STARTTLS with self-signed certificates
|
||||
String sslTrust = mailProperties.getSslTrust();
|
||||
if (sslTrust == null || sslTrust.trim().isEmpty()) {
|
||||
sslTrust = "*";
|
||||
}
|
||||
if (sslTrust != null && !sslTrust.trim().isEmpty()) {
|
||||
props.put("mail.smtp.ssl.trust", sslTrust);
|
||||
}
|
||||
if (mailProperties.getSslCheckServerIdentity() != null) {
|
||||
props.put(
|
||||
"mail.smtp.ssl.checkserveridentity",
|
||||
mailProperties.getSslCheckServerIdentity().toString());
|
||||
}
|
||||
props.put("mail.smtp.starttls.enable", "true");
|
||||
|
||||
// Returns the configured mail sender, ready to send emails
|
||||
return mailSender;
|
||||
|
||||
+81
-9
@@ -1,6 +1,7 @@
|
||||
package stirling.software.proprietary.security.configuration;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
@@ -24,6 +25,8 @@ import org.springframework.security.saml2.provider.service.web.authentication.Op
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
|
||||
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
|
||||
import org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler;
|
||||
import org.springframework.security.web.savedrequest.NullRequestCache;
|
||||
import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
@@ -44,6 +47,7 @@ import stirling.software.proprietary.security.database.repository.PersistentLogi
|
||||
import stirling.software.proprietary.security.filter.IPRateLimitingFilter;
|
||||
import stirling.software.proprietary.security.filter.JwtAuthenticationFilter;
|
||||
import stirling.software.proprietary.security.filter.UserAuthenticationFilter;
|
||||
import stirling.software.proprietary.security.model.User;
|
||||
import stirling.software.proprietary.security.oauth2.CustomOAuth2AuthenticationFailureHandler;
|
||||
import stirling.software.proprietary.security.oauth2.CustomOAuth2AuthenticationSuccessHandler;
|
||||
import stirling.software.proprietary.security.saml2.CustomSaml2AuthenticationFailureHandler;
|
||||
@@ -194,19 +198,74 @@ public class SecurityConfiguration {
|
||||
http.cors(cors -> cors.disable());
|
||||
}
|
||||
|
||||
http.csrf(CsrfConfigurer::disable);
|
||||
if (securityProperties.getCsrfDisabled() || !loginEnabledValue) {
|
||||
http.csrf(CsrfConfigurer::disable);
|
||||
}
|
||||
|
||||
if (loginEnabledValue) {
|
||||
boolean v2Enabled = appConfig.v2Enabled();
|
||||
|
||||
http.addFilterBefore(
|
||||
userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
|
||||
.addFilterBefore(rateLimitingFilter, UsernamePasswordAuthenticationFilter.class)
|
||||
.addFilterBefore(jwtAuthenticationFilter, UserAuthenticationFilter.class);
|
||||
|
||||
if (!securityProperties.getCsrfDisabled()) {
|
||||
CookieCsrfTokenRepository cookieRepo =
|
||||
CookieCsrfTokenRepository.withHttpOnlyFalse();
|
||||
CsrfTokenRequestAttributeHandler requestHandler =
|
||||
new CsrfTokenRequestAttributeHandler();
|
||||
requestHandler.setCsrfRequestAttributeName(null);
|
||||
http.csrf(
|
||||
csrf ->
|
||||
csrf.ignoringRequestMatchers(
|
||||
request -> {
|
||||
String uri = request.getRequestURI();
|
||||
|
||||
// Ignore CSRF for auth endpoints
|
||||
if (uri.startsWith("/api/v1/auth/")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String apiKey = request.getHeader("X-API-KEY");
|
||||
// If there's no API key, don't ignore CSRF
|
||||
// (return false)
|
||||
if (apiKey == null || apiKey.trim().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
// Validate API key using existing UserService
|
||||
try {
|
||||
Optional<User> user =
|
||||
userService.getUserByApiKey(apiKey);
|
||||
// If API key is valid, ignore CSRF (return
|
||||
// true)
|
||||
// If API key is invalid, don't ignore CSRF
|
||||
// (return false)
|
||||
return user.isPresent();
|
||||
} catch (Exception e) {
|
||||
// If there's any error validating the API
|
||||
// key, don't ignore CSRF
|
||||
return false;
|
||||
}
|
||||
})
|
||||
.csrfTokenRepository(cookieRepo)
|
||||
.csrfTokenRequestHandler(requestHandler));
|
||||
}
|
||||
|
||||
http.sessionManagement(
|
||||
sessionManagement ->
|
||||
sessionManagement -> {
|
||||
if (v2Enabled) {
|
||||
sessionManagement.sessionCreationPolicy(
|
||||
SessionCreationPolicy.STATELESS));
|
||||
SessionCreationPolicy.STATELESS);
|
||||
} else {
|
||||
sessionManagement
|
||||
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
|
||||
.maximumSessions(10)
|
||||
.maxSessionsPreventsLogin(false)
|
||||
.sessionRegistry(sessionRegistry)
|
||||
.expiredUrl("/login?logout=true");
|
||||
}
|
||||
});
|
||||
http.authenticationProvider(daoAuthenticationProvider());
|
||||
http.requestCache(requestCache -> requestCache.requestCache(new NullRequestCache()));
|
||||
|
||||
@@ -272,9 +331,7 @@ public class SecurityConfiguration {
|
||||
formLogin ->
|
||||
formLogin
|
||||
.loginPage("/login") // Redirect here when unauthenticated
|
||||
.loginProcessingUrl(
|
||||
"/perform_login") // Process form posts here (not
|
||||
// /login)
|
||||
.loginProcessingUrl("/perform_login") // Process form posts here (not /login)
|
||||
.successHandler(
|
||||
new CustomAuthenticationSuccessHandler(
|
||||
loginAttemptService,
|
||||
@@ -289,7 +346,18 @@ public class SecurityConfiguration {
|
||||
if (securityProperties.isOauth2Active()) {
|
||||
http.oauth2Login(
|
||||
oauth2 -> {
|
||||
oauth2.loginPage("/login")
|
||||
// v1: Use /oauth2 as login page for Thymeleaf templates
|
||||
if (!v2Enabled) {
|
||||
oauth2.loginPage("/oauth2");
|
||||
}
|
||||
|
||||
// v2: Don't set loginPage, let default OAuth2 flow handle it
|
||||
oauth2
|
||||
/*
|
||||
This Custom handler is used to check if the OAUTH2 user trying to log in, already exists in the database.
|
||||
If user exists, login proceeds as usual. If user does not exist, then it is auto-created but only if 'OAUTH2AutoCreateUser'
|
||||
is set as true, else login fails with an error message advising the same.
|
||||
*/
|
||||
.successHandler(
|
||||
new CustomOAuth2AuthenticationSuccessHandler(
|
||||
loginAttemptService,
|
||||
@@ -323,8 +391,12 @@ public class SecurityConfiguration {
|
||||
.saml2Login(
|
||||
saml2 -> {
|
||||
try {
|
||||
saml2.loginPage("/login")
|
||||
.relyingPartyRegistrationRepository(
|
||||
// Only set login page for v1/Thymeleaf mode
|
||||
if (!v2Enabled) {
|
||||
saml2.loginPage("/saml2");
|
||||
}
|
||||
|
||||
saml2.relyingPartyRegistrationRepository(
|
||||
saml2RelyingPartyRegistrations)
|
||||
.authenticationManager(
|
||||
new ProviderManager(authenticationProvider))
|
||||
|
||||
-77
@@ -7,7 +7,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@@ -19,7 +18,6 @@ import org.springframework.security.oauth2.core.user.OAuth2User;
|
||||
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.transaction.Transactional;
|
||||
@@ -238,8 +236,6 @@ public class UserController {
|
||||
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
|
||||
.body(Map.of("error", "incorrectPassword", "message", "Incorrect password"));
|
||||
}
|
||||
// Set flags before changing password so they're saved together
|
||||
user.setForcePasswordChange(false);
|
||||
userService.changePassword(user, newPassword);
|
||||
userService.changeFirstUse(user, false);
|
||||
// Logout using Spring's utility
|
||||
@@ -588,79 +584,6 @@ public class UserController {
|
||||
return ResponseEntity.ok(Map.of("message", "User role updated successfully"));
|
||||
}
|
||||
|
||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||
@PostMapping("/admin/changePasswordForUser")
|
||||
public ResponseEntity<?> changePasswordForUser(
|
||||
@RequestParam(name = "username") String username,
|
||||
@RequestParam(name = "newPassword", required = false) String newPassword,
|
||||
@RequestParam(name = "generateRandom", defaultValue = "false") boolean generateRandom,
|
||||
@RequestParam(name = "sendEmail", defaultValue = "false") boolean sendEmail,
|
||||
@RequestParam(name = "includePassword", defaultValue = "false") boolean includePassword,
|
||||
@RequestParam(name = "forcePasswordChange", defaultValue = "false")
|
||||
boolean forcePasswordChange,
|
||||
HttpServletRequest request,
|
||||
Authentication authentication)
|
||||
throws SQLException, UnsupportedProviderException, MessagingException {
|
||||
Optional<User> userOpt = userService.findByUsernameIgnoreCase(username);
|
||||
if (userOpt.isEmpty()) {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND)
|
||||
.body(Map.of("error", "User not found."));
|
||||
}
|
||||
|
||||
String currentUsername = authentication.getName();
|
||||
if (currentUsername.equalsIgnoreCase(username)) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", "Cannot change your own password."));
|
||||
}
|
||||
|
||||
User user = userOpt.get();
|
||||
|
||||
String finalPassword = newPassword;
|
||||
if (generateRandom) {
|
||||
finalPassword = UUID.randomUUID().toString().replace("-", "").substring(0, 12);
|
||||
}
|
||||
|
||||
if (finalPassword == null || finalPassword.trim().isEmpty()) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", "New password is required."));
|
||||
}
|
||||
|
||||
// Set force password change flag before changing password so both are saved together
|
||||
user.setForcePasswordChange(forcePasswordChange);
|
||||
userService.changePassword(user, finalPassword);
|
||||
|
||||
// Invalidate all active sessions to force reauthentication
|
||||
userService.invalidateUserSessions(username);
|
||||
|
||||
if (sendEmail) {
|
||||
if (emailService.isEmpty() || !applicationProperties.getMail().isEnabled()) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(Map.of("error", "Email is not configured."));
|
||||
}
|
||||
|
||||
String userEmail = user.getUsername();
|
||||
// Check if username is a valid email format
|
||||
if (userEmail == null || userEmail.isBlank() || !userEmail.contains("@")) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
|
||||
.body(
|
||||
Map.of(
|
||||
"error",
|
||||
"User's email is not a valid email address. Notifications are disabled."));
|
||||
}
|
||||
|
||||
String loginUrl = buildLoginUrl(request);
|
||||
emailService
|
||||
.get()
|
||||
.sendPasswordChangedNotification(
|
||||
userEmail,
|
||||
user.getUsername(),
|
||||
includePassword ? finalPassword : null,
|
||||
loginUrl);
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(Map.of("message", "User password updated successfully"));
|
||||
}
|
||||
|
||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||
@PostMapping("/admin/changeUserEnabled/{username}")
|
||||
public ResponseEntity<?> changeUserEnabled(
|
||||
|
||||
+18
-8
@@ -26,7 +26,6 @@ import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
@@ -40,7 +39,6 @@ import stirling.software.proprietary.security.service.JwtServiceInterface;
|
||||
import stirling.software.proprietary.security.service.UserService;
|
||||
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
|
||||
private final JwtServiceInterface jwtService;
|
||||
@@ -49,6 +47,19 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
private final AuthenticationEntryPoint authenticationEntryPoint;
|
||||
private final ApplicationProperties.Security securityProperties;
|
||||
|
||||
public JwtAuthenticationFilter(
|
||||
JwtServiceInterface jwtService,
|
||||
UserService userService,
|
||||
CustomUserDetailsService userDetailsService,
|
||||
AuthenticationEntryPoint authenticationEntryPoint,
|
||||
ApplicationProperties.Security securityProperties) {
|
||||
this.jwtService = jwtService;
|
||||
this.userService = userService;
|
||||
this.userDetailsService = userDetailsService;
|
||||
this.authenticationEntryPoint = authenticationEntryPoint;
|
||||
this.securityProperties = securityProperties;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(
|
||||
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||
@@ -57,11 +68,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
|
||||
String requestURI = request.getRequestURI();
|
||||
String contextPath = request.getContextPath();
|
||||
|
||||
if (isStaticResource(contextPath, requestURI)) {
|
||||
if (isStaticResource(request.getContextPath(), request.getRequestURI())) {
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
@@ -70,7 +77,10 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
String jwtToken = jwtService.extractToken(request);
|
||||
|
||||
if (jwtToken == null) {
|
||||
// Allow auth endpoints to pass through without JWT
|
||||
// Allow specific auth endpoints to pass through without JWT
|
||||
String requestURI = request.getRequestURI();
|
||||
String contextPath = request.getContextPath();
|
||||
|
||||
if (!isPublicAuthEndpoint(requestURI, contextPath)) {
|
||||
// For API requests, return 401 JSON
|
||||
String acceptHeader = request.getHeader("Accept");
|
||||
|
||||
+18
@@ -241,6 +241,24 @@ public class UserAuthenticationFilter extends OncePerRequestFilter {
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
|
||||
private static boolean isPublicAuthEndpoint(String requestURI, String contextPath) {
|
||||
// Remove context path from URI to normalize path matching
|
||||
String trimmedUri =
|
||||
requestURI.startsWith(contextPath)
|
||||
? requestURI.substring(contextPath.length())
|
||||
: requestURI;
|
||||
|
||||
// Public auth endpoints that don't require authentication
|
||||
return trimmedUri.startsWith("/login")
|
||||
|| trimmedUri.startsWith("/auth/")
|
||||
|| trimmedUri.startsWith("/oauth2")
|
||||
|| trimmedUri.startsWith("/saml2")
|
||||
|| trimmedUri.startsWith("/api/v1/auth/login")
|
||||
|| trimmedUri.startsWith("/api/v1/auth/refresh")
|
||||
|| trimmedUri.startsWith("/api/v1/auth/logout")
|
||||
|| trimmedUri.startsWith("/api/v1/proprietary/ui-data/login");
|
||||
}
|
||||
|
||||
private enum UserLoginType {
|
||||
USERDETAILS("UserDetails"),
|
||||
OAUTH2USER("OAuth2User"),
|
||||
|
||||
@@ -59,9 +59,6 @@ public class User implements UserDetails, Serializable {
|
||||
@Column(name = "hasCompletedInitialSetup")
|
||||
private Boolean hasCompletedInitialSetup = false;
|
||||
|
||||
@Column(name = "forcePasswordChange")
|
||||
private Boolean forcePasswordChange = false;
|
||||
|
||||
@Column(name = "roleName")
|
||||
private String roleName;
|
||||
|
||||
@@ -120,14 +117,6 @@ public class User implements UserDetails, Serializable {
|
||||
this.hasCompletedInitialSetup = hasCompletedInitialSetup;
|
||||
}
|
||||
|
||||
public boolean isForcePasswordChange() {
|
||||
return forcePasswordChange != null && forcePasswordChange;
|
||||
}
|
||||
|
||||
public void setForcePasswordChange(boolean forcePasswordChange) {
|
||||
this.forcePasswordChange = forcePasswordChange;
|
||||
}
|
||||
|
||||
public void setAuthenticationType(AuthenticationType authenticationType) {
|
||||
this.authenticationType = authenticationType.toString().toLowerCase();
|
||||
}
|
||||
|
||||
-8
@@ -27,7 +27,6 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpSession;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.model.exception.UnsupportedProviderException;
|
||||
@@ -40,7 +39,6 @@ import stirling.software.proprietary.security.service.JwtServiceInterface;
|
||||
import stirling.software.proprietary.security.service.LoginAttemptService;
|
||||
import stirling.software.proprietary.security.service.UserService;
|
||||
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class CustomOAuth2AuthenticationSuccessHandler
|
||||
extends SavedRequestAwareAuthenticationSuccessHandler {
|
||||
@@ -79,18 +77,12 @@ public class CustomOAuth2AuthenticationSuccessHandler
|
||||
|
||||
if (user != null && !licenseSettingsService.isOAuthEligible(user)) {
|
||||
// User is not grandfathered and no paid license - block OAuth login
|
||||
log.warn(
|
||||
"OAuth login blocked for existing user '{}' - not eligible (not grandfathered and no paid license)",
|
||||
username);
|
||||
response.sendRedirect(
|
||||
request.getContextPath() + "/logout?oAuth2RequiresLicense=true");
|
||||
return;
|
||||
}
|
||||
} else if (!licenseSettingsService.isOAuthEligible(null)) {
|
||||
// No existing user and no paid license -> block auto creation
|
||||
log.warn(
|
||||
"OAuth login blocked for new user '{}' - not eligible (no paid license for auto-creation)",
|
||||
username);
|
||||
response.sendRedirect(request.getContextPath() + "/logout?oAuth2RequiresLicense=true");
|
||||
return;
|
||||
}
|
||||
|
||||
+4
-20
@@ -67,15 +67,10 @@ public class OAuth2Configuration {
|
||||
keycloakClientRegistration().ifPresent(registrations::add);
|
||||
|
||||
if (registrations.isEmpty()) {
|
||||
log.error("No OAuth2 provider registered - check your OAuth2 configuration");
|
||||
log.error("No OAuth2 provider registered");
|
||||
throw new NoProviderFoundException("At least one OAuth2 provider must be configured.");
|
||||
}
|
||||
|
||||
log.info(
|
||||
"OAuth2 ClientRegistrationRepository created with {} provider(s): {}",
|
||||
registrations.size(),
|
||||
registrations.stream().map(ClientRegistration::getRegistrationId).toList());
|
||||
|
||||
return new InMemoryClientRegistrationRepository(registrations);
|
||||
}
|
||||
|
||||
@@ -170,6 +165,7 @@ public class OAuth2Configuration {
|
||||
githubClient.getUseAsUsername());
|
||||
|
||||
boolean isValid = validateProvider(github);
|
||||
log.info("Initialised GitHub OAuth2 provider");
|
||||
|
||||
return isValid
|
||||
? Optional.of(
|
||||
@@ -212,19 +208,7 @@ public class OAuth2Configuration {
|
||||
null,
|
||||
null);
|
||||
|
||||
boolean isValid =
|
||||
!isStringEmpty(oidcProvider.getIssuer()) || validateProvider(oidcProvider);
|
||||
if (isValid) {
|
||||
log.info(
|
||||
"Initialised OIDC OAuth2 provider: registrationId='{}', issuer='{}', redirectUri='{}'",
|
||||
name,
|
||||
oauth.getIssuer(),
|
||||
REDIRECT_URI_PATH + name);
|
||||
} else {
|
||||
log.warn("OIDC OAuth2 provider validation failed - provider will not be registered");
|
||||
}
|
||||
|
||||
return isValid
|
||||
return !isStringEmpty(oidcProvider.getIssuer()) || validateProvider(oidcProvider)
|
||||
? Optional.of(
|
||||
ClientRegistrations.fromIssuerLocation(oauth.getIssuer())
|
||||
.registrationId(name)
|
||||
@@ -233,7 +217,7 @@ public class OAuth2Configuration {
|
||||
.scope(oidcProvider.getScopes())
|
||||
.userNameAttributeName(oidcProvider.getUseAsUsername().getName())
|
||||
.clientName(clientName)
|
||||
.redirectUri(REDIRECT_URI_PATH + name)
|
||||
.redirectUri(REDIRECT_URI_PATH + "oidc")
|
||||
.authorizationGrantType(AUTHORIZATION_CODE)
|
||||
.build())
|
||||
: Optional.empty();
|
||||
|
||||
+5
-11
@@ -67,25 +67,19 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
|
||||
boolean userExists = userService.usernameExistsIgnoreCase(username);
|
||||
|
||||
// Check if user is eligible for SAML (grandfathered or system has ENTERPRISE license)
|
||||
// Check if user is eligible for SAML (grandfathered or system has paid license)
|
||||
if (userExists) {
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
userService.findByUsernameIgnoreCase(username).orElse(null);
|
||||
|
||||
if (user != null && !licenseSettingsService.isSamlEligible(user)) {
|
||||
// User is not grandfathered and no ENTERPRISE license - block SAML login
|
||||
log.warn(
|
||||
"SAML2 login blocked for existing user '{}' - not eligible (not grandfathered and no ENTERPRISE license)",
|
||||
username);
|
||||
if (user != null && !licenseSettingsService.isOAuthEligible(user)) {
|
||||
// User is not grandfathered and no paid license - block SAML login
|
||||
response.sendRedirect(
|
||||
request.getContextPath() + "/logout?saml2RequiresLicense=true");
|
||||
return;
|
||||
}
|
||||
} else if (!licenseSettingsService.isSamlEligible(null)) {
|
||||
// No existing user and no ENTERPRISE license -> block auto creation
|
||||
log.warn(
|
||||
"SAML2 login blocked for new user '{}' - not eligible (no ENTERPRISE license for auto-creation)",
|
||||
username);
|
||||
} else if (!licenseSettingsService.isOAuthEligible(null)) {
|
||||
// No existing user and no paid license -> block auto creation
|
||||
response.sendRedirect(
|
||||
request.getContextPath() + "/logout?saml2RequiresLicense=true");
|
||||
return;
|
||||
|
||||
-50
@@ -223,54 +223,4 @@ public class EmailService {
|
||||
|
||||
sendPlainEmail(to, subject, body, true);
|
||||
}
|
||||
|
||||
@Async
|
||||
public void sendPasswordChangedNotification(
|
||||
String to, String username, String newPassword, String loginUrl)
|
||||
throws MessagingException {
|
||||
String subject = "Your Stirling PDF password has been updated";
|
||||
|
||||
String passwordSection =
|
||||
newPassword == null
|
||||
? ""
|
||||
: """
|
||||
<div style=\"background-color: #f8f9fa; border-left: 4px solid #007bff; padding: 15px; margin: 20px 0; border-radius: 4px;\">
|
||||
<p style=\"margin: 0;\"><strong>Temporary Password:</strong> %s</p>
|
||||
</div>
|
||||
"""
|
||||
.formatted(newPassword);
|
||||
|
||||
String body =
|
||||
"""
|
||||
<html><body style=\"margin: 0; padding: 0;\">
|
||||
<div style=\"font-family: Arial, sans-serif; background-color: #f8f9fa; padding: 20px;\">
|
||||
<div style=\"max-width: 600px; margin: auto; background-color: #ffffff; border-radius: 8px; overflow: hidden; border: 1px solid #e0e0e0;\">
|
||||
<div style=\"text-align: center; padding: 20px; background-color: #222;\">
|
||||
<img src=\"https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling-transparent.svg\" alt=\"Stirling PDF\" style=\"max-height: 60px;\">
|
||||
</div>
|
||||
<div style=\"padding: 30px; color: #333;\">
|
||||
<h2 style=\"color: #222; margin-top: 0;\">Your password was changed</h2>
|
||||
<p>Hello %s,</p>
|
||||
<p>An administrator has updated the password for your Stirling PDF account.</p>
|
||||
%s
|
||||
<p>If you did not expect this change, please contact your administrator immediately.</p>
|
||||
<div style=\"text-align: center; margin: 30px 0;\">
|
||||
<a href=\"%s\" style=\"display: inline-block; background-color: #007bff; color: #ffffff; padding: 14px 28px; text-decoration: none; border-radius: 5px; font-weight: bold;\">Go to Stirling PDF</a>
|
||||
</div>
|
||||
<p style=\"font-size: 14px; color: #666;\">Or copy and paste this link in your browser:</p>
|
||||
<div style=\"background-color: #f8f9fa; padding: 12px; margin: 15px 0; border-radius: 4px; word-break: break-all; font-size: 13px; color: #555;\">
|
||||
%s
|
||||
</div>
|
||||
</div>
|
||||
<div style=\"text-align: center; padding: 15px; font-size: 12px; color: #777; background-color: #f0f0f0;\">
|
||||
© 2025 Stirling PDF. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body></html>
|
||||
"""
|
||||
.formatted(username, passwordSection, loginUrl, loginUrl);
|
||||
|
||||
sendPlainEmail(to, subject, body, true);
|
||||
}
|
||||
}
|
||||
|
||||
+6
-82
@@ -21,7 +21,6 @@ import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.proprietary.model.UserLicenseSettings;
|
||||
import stirling.software.proprietary.security.configuration.ee.KeygenLicenseVerifier.License;
|
||||
import stirling.software.proprietary.security.configuration.ee.LicenseKeyChecker;
|
||||
import stirling.software.proprietary.security.model.User;
|
||||
import stirling.software.proprietary.security.repository.UserLicenseSettingsRepository;
|
||||
import stirling.software.proprietary.security.service.UserService;
|
||||
|
||||
@@ -344,76 +343,17 @@ public class UserLicenseSettingsService {
|
||||
* @param user The user to check
|
||||
* @return true if the user can use OAuth/SAML
|
||||
*/
|
||||
public boolean isOAuthEligible(User user) {
|
||||
String username = (user != null) ? user.getUsername() : "<new user>";
|
||||
log.info("OAuth eligibility check for user: {}", username);
|
||||
|
||||
public boolean isOAuthEligible(stirling.software.proprietary.security.model.User user) {
|
||||
// Grandfathered users always have OAuth access
|
||||
if (user != null && user.isOauthGrandfathered()) {
|
||||
log.debug("User {} is grandfathered for OAuth", user.getUsername());
|
||||
return true;
|
||||
}
|
||||
|
||||
// todo: remove
|
||||
if (user != null) {
|
||||
log.info(
|
||||
"User {} is NOT grandfathered (isOauthGrandfathered={})",
|
||||
username,
|
||||
user.isOauthGrandfathered());
|
||||
} else {
|
||||
log.info("New user attempting OAuth login - checking license requirement");
|
||||
}
|
||||
|
||||
// Users can use OAuth with SERVER or ENTERPRISE license
|
||||
boolean hasPaid = hasPaidLicense();
|
||||
log.info(
|
||||
"OAuth eligibility result: hasPaidLicense={}, user={}, eligible={}",
|
||||
hasPaid,
|
||||
username,
|
||||
hasPaid);
|
||||
return hasPaid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a user is eligible to use SAML authentication.
|
||||
*
|
||||
* <p>A user is eligible if:
|
||||
*
|
||||
* <ul>
|
||||
* <li>They are grandfathered for OAuth (existing user before policy change), OR
|
||||
* <li>The system has an ENTERPRISE license (SAML is enterprise-only)
|
||||
* </ul>
|
||||
*
|
||||
* @param user The user to check
|
||||
* @return true if the user can use SAML
|
||||
*/
|
||||
public boolean isSamlEligible(User user) {
|
||||
String username = (user != null) ? user.getUsername() : "<new user>";
|
||||
log.info("SAML2 eligibility check for user: {}", username);
|
||||
|
||||
// Grandfathered users always have SAML access
|
||||
if (user != null && user.isOauthGrandfathered()) {
|
||||
log.info("User {} is grandfathered for SAML2 - ELIGIBLE", username);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (user != null) {
|
||||
log.info(
|
||||
"User {} is NOT grandfathered (isOauthGrandfathered={})",
|
||||
username,
|
||||
user.isOauthGrandfathered());
|
||||
} else {
|
||||
log.info("New user attempting SAML2 login - checking license requirement");
|
||||
}
|
||||
|
||||
// Users can use SAML only with ENTERPRISE license
|
||||
boolean hasEnterprise = hasEnterpriseLicense();
|
||||
log.info(
|
||||
"SAML2 eligibility result: hasEnterpriseLicense={}, user={}, eligible={}",
|
||||
hasEnterprise,
|
||||
username,
|
||||
hasEnterprise);
|
||||
return hasEnterprise;
|
||||
// Users can use OAuth/SAML only if system has ENTERPRISE license
|
||||
boolean hasEnterpriseLicense = hasEnterpriseLicense();
|
||||
log.debug("OAuth eligibility check: hasEnterpriseLicense={}", hasEnterpriseLicense);
|
||||
return hasEnterpriseLicense;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -555,12 +495,8 @@ public class UserLicenseSettingsService {
|
||||
if (checker == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
License license = checker.getPremiumLicenseEnabledResult();
|
||||
boolean hasPaid = (license == License.SERVER || license == License.ENTERPRISE);
|
||||
log.info("License check result: type={}, requiresPaid=true, hasPaid={}", license, hasPaid);
|
||||
|
||||
return hasPaid;
|
||||
return license == License.SERVER || license == License.ENTERPRISE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -574,19 +510,7 @@ public class UserLicenseSettingsService {
|
||||
if (checker == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
License license = checker.getPremiumLicenseEnabledResult();
|
||||
log.info(
|
||||
"License check result: type={}, requiresEnterprise=true, hasEnterprise={}",
|
||||
license,
|
||||
(license == License.ENTERPRISE));
|
||||
|
||||
if (license != License.ENTERPRISE) {
|
||||
log.warn(
|
||||
"SAML2 requires ENTERPRISE license but found: {}. SAML2 login will be blocked.",
|
||||
license);
|
||||
}
|
||||
|
||||
return license == License.ENTERPRISE;
|
||||
}
|
||||
}
|
||||
|
||||
-162
@@ -1,162 +0,0 @@
|
||||
package stirling.software.proprietary.security.oauth2;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Unit tests for OAuth2Configuration redirect URI logic.
|
||||
*
|
||||
* <p>These tests validate the critical fix for GitHub issue #5141: The redirect URI path segment
|
||||
* MUST match the registration ID. Previously, the redirect URI was hardcoded to 'oidc', causing
|
||||
* InvalidClientRegistrationIdException when custom provider names were used.
|
||||
*
|
||||
* <p>Note: These are conceptual tests documenting the expected behavior. Full integration testing
|
||||
* with actual OIDC discovery would require: 1. Mock HTTP server for OIDC discovery endpoints 2.
|
||||
* Valid OIDC configuration responses 3. Network mocking infrastructure
|
||||
*/
|
||||
class OAuth2ConfigurationTest {
|
||||
|
||||
/**
|
||||
* Tests the redirect URI pattern for OIDC provider configurations.
|
||||
*
|
||||
* <p>Critical behavior (GitHub issue #5141 fix): The redirect URI path segment MUST match the
|
||||
* registration ID. For example: - Provider name: "authentik" → Redirect URI:
|
||||
* "/login/oauth2/code/authentik" - Provider name: "mycompany" → Redirect URI:
|
||||
* "/login/oauth2/code/mycompany" - Provider name: "oidc" → Redirect URI:
|
||||
* "/login/oauth2/code/oidc"
|
||||
*
|
||||
* <p>Previously, the redirect URI was hardcoded to 'oidc', causing Spring Security to look for
|
||||
* a registration with ID 'oidc' when the provider redirected back. This caused
|
||||
* InvalidClientRegistrationIdException when custom provider names were used.
|
||||
*/
|
||||
@Test
|
||||
void testRedirectUriPattern_usesProviderNameNotHardcodedOidc() {
|
||||
// Verify the redirect URI pattern constant
|
||||
String redirectUriBase = "{baseUrl}/login/oauth2/code/";
|
||||
|
||||
// Test cases: provider name → expected redirect URI
|
||||
String[][] testCases = {
|
||||
{"authentik", redirectUriBase + "authentik"},
|
||||
{"mycompany", redirectUriBase + "mycompany"},
|
||||
{"oidc", redirectUriBase + "oidc"},
|
||||
{"okta", redirectUriBase + "okta"},
|
||||
{"auth0", redirectUriBase + "auth0"}
|
||||
};
|
||||
|
||||
for (String[] testCase : testCases) {
|
||||
String providerName = testCase[0];
|
||||
String expectedRedirectUri = testCase[1];
|
||||
|
||||
// The fix ensures: .redirectUri(REDIRECT_URI_PATH + name)
|
||||
// instead of: .redirectUri(REDIRECT_URI_PATH + "oidc")
|
||||
String actualRedirectUri = redirectUriBase + providerName;
|
||||
|
||||
assertEquals(
|
||||
expectedRedirectUri,
|
||||
actualRedirectUri,
|
||||
String.format(
|
||||
"Redirect URI for provider '%s' must use provider name, not hardcoded 'oidc'",
|
||||
providerName));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Documents the critical fix for OAuth2 redirect URI mismatch.
|
||||
*
|
||||
* <p>This test validates the logic that was changed in OAuth2Configuration.java line 220:
|
||||
*
|
||||
* <pre>
|
||||
* // BEFORE (bug):
|
||||
* .redirectUri(REDIRECT_URI_PATH + "oidc") // Always "oidc"
|
||||
*
|
||||
* // AFTER (fix):
|
||||
* .redirectUri(REDIRECT_URI_PATH + name) // Dynamic provider name
|
||||
* </pre>
|
||||
*/
|
||||
@Test
|
||||
void testCriticalFix_redirectUriMatchesRegistrationId() {
|
||||
// The redirect URI path segment extraction by Spring Security
|
||||
String callbackUrl = "http://localhost:8080/login/oauth2/code/authentik?code=abc123";
|
||||
|
||||
// Spring extracts the path segment between "code/" and "?"
|
||||
String extractedRegistrationId = extractRegistrationIdFromCallback(callbackUrl);
|
||||
|
||||
// The extracted ID MUST match an actual registration ID
|
||||
assertEquals("authentik", extractedRegistrationId);
|
||||
|
||||
// If we had used hardcoded "oidc", the callback would be:
|
||||
String buggyCallbackUrl = "http://localhost:8080/login/oauth2/code/oidc?code=abc123";
|
||||
String buggyExtractedId = extractRegistrationIdFromCallback(buggyCallbackUrl);
|
||||
|
||||
// This would look for registration with ID "oidc" but we registered "authentik"
|
||||
assertEquals("oidc", buggyExtractedId);
|
||||
|
||||
// The mismatch: registrationId="authentik", but Spring looks for "oidc"
|
||||
// Result: InvalidClientRegistrationIdException
|
||||
assertNotNull(buggyExtractedId, "This demonstrates the bug that was fixed");
|
||||
}
|
||||
|
||||
/** Helper method simulating Spring's extraction of registration ID from callback URL */
|
||||
private String extractRegistrationIdFromCallback(String callbackUrl) {
|
||||
// Simplified version of what Spring Security does
|
||||
// Actual: OAuth2AuthorizationRequestRedirectFilter extracts from path
|
||||
String path = callbackUrl.split("\\?")[0];
|
||||
String[] parts = path.split("/");
|
||||
return parts[parts.length - 1]; // Last path segment
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the frontend-backend flow for custom provider names.
|
||||
*
|
||||
* <p>Complete flow: 1. Backend: Provider configured as "authentik" in settings.yml 2. Backend:
|
||||
* ClientRegistration created with registrationId="authentik" 3. Backend: Redirect URI set to
|
||||
* "{baseUrl}/login/oauth2/code/authentik" 4. Backend: Login endpoint returns providerList with
|
||||
* "/oauth2/authorization/authentik" 5. Frontend: Extracts "authentik" from path and uses it for
|
||||
* OAuth login 6. Frontend: Redirects to "/oauth2/authorization/authentik" 7. Backend: Spring
|
||||
* Security redirects to provider with redirect_uri containing "authentik" 8. Provider:
|
||||
* Redirects back to "/login/oauth2/code/authentik?code=..." 9. Backend: Spring Security
|
||||
* extracts "authentik" from callback URL 10. Backend: Looks up ClientRegistration with ID
|
||||
* "authentik" ✅ SUCCESS
|
||||
*
|
||||
* <p>If redirect URI was hardcoded to "oidc" (the bug): Step 7: Provider redirects to
|
||||
* "/login/oauth2/code/oidc?code=..." Step 9: Spring Security looks for registration ID "oidc"
|
||||
* Step 10: FAIL - No registration found with ID "oidc" (we registered "authentik") Result:
|
||||
* InvalidClientRegistrationIdException
|
||||
*/
|
||||
@Test
|
||||
void testEndToEndFlow_registrationIdConsistency() {
|
||||
String providerName = "authentik";
|
||||
|
||||
// Step 2: Registration ID
|
||||
String registrationId = providerName;
|
||||
assertEquals("authentik", registrationId);
|
||||
|
||||
// Step 3: Redirect URI (MUST use same name)
|
||||
String redirectUri = "{baseUrl}/login/oauth2/code/" + providerName;
|
||||
assertEquals("{baseUrl}/login/oauth2/code/authentik", redirectUri);
|
||||
|
||||
// Step 4: Provider list endpoint
|
||||
String authorizationPath = "/oauth2/authorization/" + providerName;
|
||||
assertEquals("/oauth2/authorization/authentik", authorizationPath);
|
||||
|
||||
// Step 5: Frontend extracts provider ID
|
||||
String frontendProviderId =
|
||||
authorizationPath.substring(authorizationPath.lastIndexOf('/') + 1);
|
||||
assertEquals("authentik", frontendProviderId);
|
||||
|
||||
// Step 6-8: OAuth flow (external)
|
||||
|
||||
// Step 9: Callback URL from provider
|
||||
String callbackUrl =
|
||||
"http://localhost:8080/login/oauth2/code/" + providerName + "?code=abc123";
|
||||
String extractedId = extractRegistrationIdFromCallback(callbackUrl);
|
||||
|
||||
// Step 10: Registration lookup
|
||||
assertEquals(
|
||||
registrationId,
|
||||
extractedId,
|
||||
"Registration ID from callback MUST match original registration ID");
|
||||
}
|
||||
}
|
||||
+1
-32
@@ -27,11 +27,6 @@ class MailConfigTest {
|
||||
when(mailProps.getPort()).thenReturn(587);
|
||||
when(mailProps.getUsername()).thenReturn("user@example.com");
|
||||
when(mailProps.getPassword()).thenReturn("password");
|
||||
when(mailProps.getStartTlsEnable()).thenReturn(null);
|
||||
when(mailProps.getStartTlsRequired()).thenReturn(null);
|
||||
when(mailProps.getSslEnable()).thenReturn(null);
|
||||
when(mailProps.getSslTrust()).thenReturn(null);
|
||||
when(mailProps.getSslCheckServerIdentity()).thenReturn(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -55,32 +50,6 @@ class MailConfigTest {
|
||||
() -> assertEquals("password", impl.getPassword()),
|
||||
() -> assertEquals("UTF-8", impl.getDefaultEncoding()),
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.auth")),
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.starttls.enable")),
|
||||
() -> assertEquals(null, props.getProperty("mail.smtp.starttls.required")),
|
||||
() -> assertEquals(null, props.getProperty("mail.smtp.ssl.enable")),
|
||||
() -> assertEquals("*", props.getProperty("mail.smtp.ssl.trust")));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldRespectExplicitTlsOverrides() {
|
||||
ApplicationProperties appProps = mock(ApplicationProperties.class);
|
||||
when(mailProps.getStartTlsEnable()).thenReturn(false);
|
||||
when(mailProps.getStartTlsRequired()).thenReturn(true);
|
||||
when(mailProps.getSslEnable()).thenReturn(true);
|
||||
when(mailProps.getSslTrust()).thenReturn("*");
|
||||
when(mailProps.getSslCheckServerIdentity()).thenReturn(true);
|
||||
when(appProps.getMail()).thenReturn(mailProps);
|
||||
|
||||
MailConfig config = new MailConfig(appProps);
|
||||
JavaMailSenderImpl impl = (JavaMailSenderImpl) config.javaMailSender();
|
||||
|
||||
Properties props = impl.getJavaMailProperties();
|
||||
|
||||
assertAll(
|
||||
() -> assertEquals("false", props.getProperty("mail.smtp.starttls.enable")),
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.starttls.required")),
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.ssl.enable")),
|
||||
() -> assertEquals("*", props.getProperty("mail.smtp.ssl.trust")),
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.ssl.checkserveridentity")));
|
||||
() -> assertEquals("true", props.getProperty("mail.smtp.starttls.enable")));
|
||||
}
|
||||
}
|
||||
|
||||
-218
@@ -267,222 +267,4 @@ class UserLicenseSettingsServiceTest {
|
||||
verify(userService, times(1)).grandfatherAllOAuthUsers();
|
||||
verify(userService, times(1)).grandfatherPendingSsoUsersWithoutSession();
|
||||
}
|
||||
|
||||
// ===== OAuth Eligibility Tests =====
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_grandfatheredUser_returnsTrue() {
|
||||
// Grandfathered user should be eligible regardless of license
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("grandfathered-user");
|
||||
user.setOauthGrandfathered(true);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.NORMAL);
|
||||
|
||||
boolean result = service.isOAuthEligible(user);
|
||||
|
||||
assertEquals(true, result, "Grandfathered user should be eligible for OAuth");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_nonGrandfatheredUserWithServerLicense_returnsTrue() {
|
||||
// Non-grandfathered user with SERVER license should be eligible
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.SERVER);
|
||||
|
||||
boolean result = service.isOAuthEligible(user);
|
||||
|
||||
assertEquals(true, result, "Non-grandfathered user with SERVER license should be eligible");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_nonGrandfatheredUserWithEnterpriseLicense_returnsTrue() {
|
||||
// Non-grandfathered user with ENTERPRISE license should be eligible
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.ENTERPRISE);
|
||||
|
||||
boolean result = service.isOAuthEligible(user);
|
||||
|
||||
assertEquals(
|
||||
true, result, "Non-grandfathered user with ENTERPRISE license should be eligible");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_nonGrandfatheredUserWithNoLicense_returnsFalse() {
|
||||
// Non-grandfathered user without license should NOT be eligible
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.NORMAL);
|
||||
|
||||
boolean result = service.isOAuthEligible(user);
|
||||
|
||||
assertEquals(
|
||||
false,
|
||||
result,
|
||||
"Non-grandfathered user without paid license should NOT be eligible");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_newUserWithServerLicense_returnsTrue() {
|
||||
// New user (null) with SERVER license should be eligible for auto-creation
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.SERVER);
|
||||
|
||||
boolean result = service.isOAuthEligible(null);
|
||||
|
||||
assertEquals(
|
||||
true, result, "New user with SERVER license should be eligible for auto-creation");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_newUserWithNoLicense_returnsFalse() {
|
||||
// New user (null) without license should NOT be eligible
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.NORMAL);
|
||||
|
||||
boolean result = service.isOAuthEligible(null);
|
||||
|
||||
assertEquals(
|
||||
false,
|
||||
result,
|
||||
"New user without paid license should NOT be eligible for auto-creation");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isOAuthEligible_licenseCheckerUnavailable_returnsFalse() {
|
||||
// If LicenseKeyChecker is unavailable, OAuth should be blocked
|
||||
when(licenseKeyCheckerProvider.getIfAvailable()).thenReturn(null);
|
||||
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
boolean result = service.isOAuthEligible(user);
|
||||
|
||||
assertEquals(
|
||||
false, result, "OAuth should be blocked when LicenseKeyChecker is unavailable");
|
||||
}
|
||||
|
||||
// ===== SAML Eligibility Tests =====
|
||||
|
||||
@Test
|
||||
void isSamlEligible_grandfatheredUser_returnsTrue() {
|
||||
// Grandfathered user should be eligible for SAML regardless of license
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("grandfathered-user");
|
||||
user.setOauthGrandfathered(true);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.NORMAL);
|
||||
|
||||
boolean result = service.isSamlEligible(user);
|
||||
|
||||
assertEquals(true, result, "Grandfathered user should be eligible for SAML");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_nonGrandfatheredUserWithEnterpriseLicense_returnsTrue() {
|
||||
// Non-grandfathered user with ENTERPRISE license should be eligible
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.ENTERPRISE);
|
||||
|
||||
boolean result = service.isSamlEligible(user);
|
||||
|
||||
assertEquals(
|
||||
true,
|
||||
result,
|
||||
"Non-grandfathered user with ENTERPRISE license should be eligible for SAML");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_nonGrandfatheredUserWithServerLicense_returnsFalse() {
|
||||
// Non-grandfathered user with SERVER license should NOT be eligible for SAML
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.SERVER);
|
||||
|
||||
boolean result = service.isSamlEligible(user);
|
||||
|
||||
assertEquals(
|
||||
false,
|
||||
result,
|
||||
"Non-grandfathered user with SERVER license should NOT be eligible for SAML");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_nonGrandfatheredUserWithNoLicense_returnsFalse() {
|
||||
// Non-grandfathered user without license should NOT be eligible
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.NORMAL);
|
||||
|
||||
boolean result = service.isSamlEligible(user);
|
||||
|
||||
assertEquals(
|
||||
false,
|
||||
result,
|
||||
"Non-grandfathered user without ENTERPRISE license should NOT be eligible for SAML");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_newUserWithEnterpriseLicense_returnsTrue() {
|
||||
// New user (null) with ENTERPRISE license should be eligible for auto-creation
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.ENTERPRISE);
|
||||
|
||||
boolean result = service.isSamlEligible(null);
|
||||
|
||||
assertEquals(
|
||||
true,
|
||||
result,
|
||||
"New user with ENTERPRISE license should be eligible for SAML auto-creation");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_newUserWithServerLicense_returnsFalse() {
|
||||
// New user (null) with SERVER license should NOT be eligible for SAML
|
||||
when(licenseKeyChecker.getPremiumLicenseEnabledResult()).thenReturn(License.SERVER);
|
||||
|
||||
boolean result = service.isSamlEligible(null);
|
||||
|
||||
assertEquals(
|
||||
false,
|
||||
result,
|
||||
"New user with SERVER license should NOT be eligible for SAML (requires ENTERPRISE)");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isSamlEligible_licenseCheckerUnavailable_returnsFalse() {
|
||||
// If LicenseKeyChecker is unavailable, SAML should be blocked
|
||||
when(licenseKeyCheckerProvider.getIfAvailable()).thenReturn(null);
|
||||
|
||||
stirling.software.proprietary.security.model.User user =
|
||||
new stirling.software.proprietary.security.model.User();
|
||||
user.setUsername("test-user");
|
||||
user.setOauthGrandfathered(false);
|
||||
|
||||
boolean result = service.isSamlEligible(user);
|
||||
|
||||
assertEquals(false, result, "SAML should be blocked when LicenseKeyChecker is unavailable");
|
||||
}
|
||||
}
|
||||
|
||||
+2
-49
@@ -12,8 +12,6 @@ plugins {
|
||||
}
|
||||
|
||||
import com.github.jk1.license.render.*
|
||||
import groovy.json.JsonOutput
|
||||
import groovy.json.JsonSlurper
|
||||
|
||||
ext {
|
||||
springBootVersion = "3.5.6"
|
||||
@@ -59,7 +57,7 @@ repositories {
|
||||
|
||||
allprojects {
|
||||
group = 'stirling.software'
|
||||
version = '2.1.2'
|
||||
version = '2.0.3'
|
||||
|
||||
configurations.configureEach {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
@@ -67,51 +65,6 @@ allprojects {
|
||||
}
|
||||
}
|
||||
|
||||
def writeIfChanged(File targetFile, String newContent) {
|
||||
if (targetFile.getText('UTF-8') != newContent) {
|
||||
targetFile.write(newContent, 'UTF-8')
|
||||
}
|
||||
}
|
||||
|
||||
def updateTauriConfigVersion(String version) {
|
||||
File tauriConfig = file('frontend/src-tauri/tauri.conf.json')
|
||||
def parsed = new JsonSlurper().parse(tauriConfig)
|
||||
parsed.version = version
|
||||
|
||||
def formatted = JsonOutput.prettyPrint(JsonOutput.toJson(parsed)) + System.lineSeparator()
|
||||
writeIfChanged(tauriConfig, formatted)
|
||||
}
|
||||
|
||||
def updateSimulationVersion(File fileToUpdate, String version) {
|
||||
def content = fileToUpdate.getText('UTF-8')
|
||||
def matcher = content =~ /(appVersion:\s*')([^']*)(')/
|
||||
|
||||
if (!matcher.find()) {
|
||||
throw new GradleException("Could not locate appVersion in ${fileToUpdate} for synchronization")
|
||||
}
|
||||
|
||||
def updatedContent = matcher.replaceFirst("${matcher.group(1)}${version}${matcher.group(3)}")
|
||||
writeIfChanged(fileToUpdate, updatedContent)
|
||||
}
|
||||
|
||||
tasks.register('syncAppVersion') {
|
||||
group = 'versioning'
|
||||
description = 'Synchronizes app version across desktop and simulation configs.'
|
||||
|
||||
doLast {
|
||||
def appVersion = project.version.toString()
|
||||
println "Synchronizing application version to ${appVersion}"
|
||||
updateTauriConfigVersion(appVersion)
|
||||
|
||||
[
|
||||
'frontend/src/core/testing/serverExperienceSimulations.ts',
|
||||
'frontend/src/proprietary/testing/serverExperienceSimulations.ts'
|
||||
].each { path ->
|
||||
updateSimulationVersion(file(path), appVersion)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('writeVersion', WriteProperties) {
|
||||
destinationFile = layout.projectDirectory.file('app/common/src/main/resources/version.properties')
|
||||
println "Writing version.properties to ${destinationFile.get().asFile.path}"
|
||||
@@ -361,7 +314,7 @@ tasks.named('bootRun') {
|
||||
tasks.named('build') {
|
||||
group = 'build'
|
||||
description = 'Delegates to :stirling-pdf:bootJar'
|
||||
dependsOn ':stirling-pdf:bootJar', 'buildRestartHelper', 'syncAppVersion'
|
||||
dependsOn ':stirling-pdf:bootJar', 'buildRestartHelper'
|
||||
|
||||
doFirst {
|
||||
println "Delegating to :stirling-pdf:bootJar"
|
||||
|
||||
Generated
+16
-41
@@ -456,7 +456,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
@@ -500,7 +499,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
@@ -581,7 +579,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/core/-/core-1.5.0.tgz",
|
||||
"integrity": "sha512-Yrh9XoVaT8cUgzgqpJ7hx5wg6BqQrCFirqqlSwVb+Ly9oNn4fZbR9GycIWmzJOU5XBnaOJjXfQSaDyoNP0woNA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/engines": "1.5.0",
|
||||
"@embedpdf/models": "1.5.0"
|
||||
@@ -681,7 +678,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-history/-/plugin-history-1.5.0.tgz",
|
||||
"integrity": "sha512-p7PTNNaIr4gH3jLwX+eLJe1DeUXgi21kVGN6SRx/pocH8esg4jqoOeD/YiRRZoZnPOiy0jBXVhkPkwSmY7a2hQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -698,7 +694,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-interaction-manager/-/plugin-interaction-manager-1.5.0.tgz",
|
||||
"integrity": "sha512-ckHgTfvkW6c5Ta7Mc+Dl9C2foVnvEpqEJ84wyBnqrU0OWbe/jsiPhyKBVeartMGqNI/kVfaQTXupyrKhekAVmg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -716,7 +711,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-loader/-/plugin-loader-1.5.0.tgz",
|
||||
"integrity": "sha512-P4YpIZfaW69etYIjphyaL4cGl2pB14h3OdTE0tRQ2pZYZHFLTvlt4q9B3PVSdhlSrHK5nob7jfLGon2U7xCslg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -770,7 +764,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-render/-/plugin-render-1.5.0.tgz",
|
||||
"integrity": "sha512-ywwSj0ByrlkvrJIHKRzqxARkOZriki8VJUC+T4MV8fGyF4CzvCRJyKlPktahFz+VxhoodqTh7lBCib68dH+GvA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -805,7 +798,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-scroll/-/plugin-scroll-1.5.0.tgz",
|
||||
"integrity": "sha512-RNmTZCZ8X1mA8cw9M7TMDuhO9GtkOalGha2bBL3En3D1IlDRS7PzNNMSMV7eqT7OQICSTltlpJ8p8Qi5esvL/Q==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -842,7 +834,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-selection/-/plugin-selection-1.5.0.tgz",
|
||||
"integrity": "sha512-zrxLBAZQoPswDuf9q9DrYaQc6B0Ysc2U1hueTjNH/4+ydfl0BFXZkKR63C2e3YmWtXvKjkoIj0GyPzsiBORLUw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -918,7 +909,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@embedpdf/plugin-viewport/-/plugin-viewport-1.5.0.tgz",
|
||||
"integrity": "sha512-G8GDyYRhfehw72+r4qKkydnA5+AU8qH67g01Y12b0DzI0VIzymh/05Z4dK8DsY3jyWPXJfw2hlg5+KDHaMBHgQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@embedpdf/models": "1.5.0"
|
||||
},
|
||||
@@ -1074,7 +1064,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
|
||||
"integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@emotion/babel-plugin": "^11.13.5",
|
||||
@@ -1118,7 +1107,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
|
||||
"integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.18.3",
|
||||
"@emotion/babel-plugin": "^11.13.5",
|
||||
@@ -2149,7 +2137,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.6.tgz",
|
||||
"integrity": "sha512-paTl+0x+O/QtgMtqVJaG8maD8sfiOdgPmLOyG485FmeGZ1L3KMdEkhxZtmdGlDFsLXhmMGQ57ducT90bvhXX5A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@floating-ui/react": "^0.27.16",
|
||||
"clsx": "^2.1.1",
|
||||
@@ -2200,7 +2187,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.6.tgz",
|
||||
"integrity": "sha512-liHfaWXHAkLjJy+Bkr29UsCwAoDQ/a64WrM67lksx8F0qqyjR5RQH8zVlhuOjdpQnwtlUkE/YiTvbJiPcoI0bw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"react": "^18.x || ^19.x"
|
||||
}
|
||||
@@ -2268,7 +2254,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.5.tgz",
|
||||
"integrity": "sha512-8VVxFmp1GIm9PpmnQoCoYo0UWHoOrdA57tDL62vkpzEgvb/d71Wsbv4FRg7r1Gyx7PuSo0tflH34cdl/NvfHNQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.28.4",
|
||||
"@mui/core-downloads-tracker": "^7.3.5",
|
||||
@@ -3201,7 +3186,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.9.0.tgz",
|
||||
"integrity": "sha512-ggs5k+/0FUJcIgNY08aZTqpBTtbExkJMYMLSMwyucrhtWexVOEY1KJmhBsxf+E/Q15f5rbwBpj+t0t2AW2oCsQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12.16"
|
||||
}
|
||||
@@ -3320,6 +3304,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz",
|
||||
"integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"acorn": "^8.9.0"
|
||||
}
|
||||
@@ -4096,7 +4081,6 @@
|
||||
"integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.10.4",
|
||||
"@babel/runtime": "^7.12.5",
|
||||
@@ -4425,7 +4409,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
|
||||
"integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"csstype": "^3.0.2"
|
||||
}
|
||||
@@ -4436,7 +4419,6 @@
|
||||
"integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.2.0"
|
||||
}
|
||||
@@ -4506,7 +4488,6 @@
|
||||
"integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.46.3",
|
||||
"@typescript-eslint/types": "8.46.3",
|
||||
@@ -5220,6 +5201,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz",
|
||||
"integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/shared": "3.5.24"
|
||||
}
|
||||
@@ -5229,6 +5211,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz",
|
||||
"integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.5.24",
|
||||
"@vue/shared": "3.5.24"
|
||||
@@ -5239,6 +5222,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz",
|
||||
"integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.5.24",
|
||||
"@vue/runtime-core": "3.5.24",
|
||||
@@ -5251,6 +5235,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz",
|
||||
"integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-ssr": "3.5.24",
|
||||
"@vue/shared": "3.5.24"
|
||||
@@ -5277,7 +5262,6 @@
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
|
||||
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -5685,6 +5669,7 @@
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
|
||||
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
@@ -5961,7 +5946,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"baseline-browser-mapping": "^2.8.19",
|
||||
"caniuse-lite": "^1.0.30001751",
|
||||
@@ -7009,8 +6993,7 @@
|
||||
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz",
|
||||
"integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"peer": true
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/dezalgo": {
|
||||
"version": "1.0.4",
|
||||
@@ -7405,7 +7388,6 @@
|
||||
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
@@ -7576,7 +7558,6 @@
|
||||
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rtsao/scc": "^1.1.0",
|
||||
"array-includes": "^3.1.9",
|
||||
@@ -7743,7 +7724,8 @@
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
|
||||
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/espree": {
|
||||
"version": "10.4.0",
|
||||
@@ -7808,6 +7790,7 @@
|
||||
"resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.2.tgz",
|
||||
"integrity": "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.4.15"
|
||||
}
|
||||
@@ -8898,7 +8881,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.27.6"
|
||||
},
|
||||
@@ -9375,6 +9357,7 @@
|
||||
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
|
||||
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/estree": "^1.0.6"
|
||||
}
|
||||
@@ -9695,7 +9678,6 @@
|
||||
"integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@acemir/cssom": "^0.9.19",
|
||||
"@asamuzakjp/dom-selector": "^6.7.3",
|
||||
@@ -10282,7 +10264,8 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
|
||||
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/locate-path": {
|
||||
"version": "6.0.0",
|
||||
@@ -11428,7 +11411,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.11",
|
||||
"picocolors": "^1.1.1",
|
||||
@@ -11708,7 +11690,6 @@
|
||||
"resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz",
|
||||
"integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/preact"
|
||||
@@ -12091,7 +12072,6 @@
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
|
||||
"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -12101,7 +12081,6 @@
|
||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
|
||||
"integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"scheduler": "^0.27.0"
|
||||
},
|
||||
@@ -13613,6 +13592,7 @@
|
||||
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
|
||||
"integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
@@ -13821,7 +13801,6 @@
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -14123,7 +14102,6 @@
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
@@ -14205,7 +14183,6 @@
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"napi-postinstall": "^0.3.0"
|
||||
},
|
||||
@@ -14410,7 +14387,6 @@
|
||||
"integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.5.0",
|
||||
@@ -14562,7 +14538,6 @@
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -14576,7 +14551,6 @@
|
||||
"integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/chai": "^5.2.2",
|
||||
"@vitest/expect": "3.2.4",
|
||||
@@ -15188,7 +15162,8 @@
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
|
||||
"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/zod": {
|
||||
"version": "3.25.76",
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "الحصول على معلومات عن PDF"
|
||||
header = "الحصول على معلومات عن PDF"
|
||||
submit = "الحصول على المعلومات"
|
||||
downloadJson = "تحميل JSON"
|
||||
processing = "جارٍ استخراج المعلومات..."
|
||||
results = "النتائج"
|
||||
noResults = "شغّل الأداة لإنشاء تقرير."
|
||||
downloads = "التنزيلات"
|
||||
noneDetected = "لم يتم اكتشاف أي شيء"
|
||||
indexTitle = "الفهرس"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "ملخص المعلومات الكامل"
|
||||
shortTitle = "معلومات PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "البيانات الوصفية"
|
||||
formFields = "حقول النماذج"
|
||||
basicInfo = "معلومات أساسية"
|
||||
documentInfo = "معلومات المستند"
|
||||
compliance = "الامتثال"
|
||||
encryption = "التشفير"
|
||||
permissions = "الأذونات"
|
||||
other = "أخرى"
|
||||
perPageInfo = "معلومات لكل صفحة"
|
||||
tableOfContents = "جدول المحتويات"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "المرفقات"
|
||||
embeddedFiles = "ملفات مضمنة"
|
||||
javaScript = "JavaScript"
|
||||
layers = "الطبقات"
|
||||
structureTree = "شجرة البنية"
|
||||
xmp = "بيانات XMP الوصفية"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "الحجم"
|
||||
annotations = "التعليقات التوضيحية"
|
||||
images = "الصور"
|
||||
links = "الروابط"
|
||||
fonts = "الخطوط"
|
||||
xobjects = "عدد كائنات XObject"
|
||||
multimedia = "وسائط متعددة"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "الصفحات"
|
||||
fileSize = "حجم الملف"
|
||||
pdfVersion = "إصدار PDF"
|
||||
language = "اللغة"
|
||||
title = "ملخص PDF"
|
||||
author = "المؤلف"
|
||||
created = "تم الإنشاء"
|
||||
modified = "تم التعديل"
|
||||
permsAll = "جميع الأذونات مسموح بها"
|
||||
permsRestricted = "{{count}} قيود"
|
||||
permsMixed = "بعض الأذونات مقيّدة"
|
||||
hasCompliance = "يتضمن معايير امتثال"
|
||||
noCompliance = "لا توجد معايير امتثال"
|
||||
basic = "معلومات أساسية"
|
||||
documentInfo = "معلومات المستند"
|
||||
securityTitle = "حالة الأمان"
|
||||
technical = "تقني"
|
||||
overviewTitle = "نظرة عامة على PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF مشفّر - توجد حماية بكلمة مرور"
|
||||
unencrypted = "PDF غير مُشفّر - لا توجد حماية بكلمة مرور"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "الصور"
|
||||
fonts = "الخطوط"
|
||||
formFields = "حقول النماذج"
|
||||
embeddedFiles = "ملفات مضمنة"
|
||||
javaScript = "JavaScript"
|
||||
layers = "الطبقات"
|
||||
bookmarks = "الإشارات المرجعية"
|
||||
multimedia = "وسائط متعددة"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "مستند بلا عنوان"
|
||||
unknown = "مؤلف غير معروف"
|
||||
text = "هذا ملف PDF يحتوي على {{pages}} صفحة بعنوان {{title}} وتم إنشاؤه بواسطة {{author}} (إصدار PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "تعذّر معالجة بعض الملفات."
|
||||
unexpected = "حدث خطأ غير متوقع أثناء الاستخراج."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "اكتمل الاستخراج"
|
||||
|
||||
[extractPage]
|
||||
tags = "استخراج"
|
||||
@@ -3913,8 +3828,8 @@ title = "التحليلات"
|
||||
description = "تساعدنا هذه الملفات على فهم كيفية استخدام أدواتنا، كي نركّز على بناء الميزات الأكثر قيمة لمجتمعنا. كن مطمئنًا—Stirling PDF لا يمكنه ولن يتتبع محتوى المستندات التي تعمل عليها."
|
||||
|
||||
[cookieBanner.services]
|
||||
posthog = "تحليلات PostHog"
|
||||
scarf = "Scarf بكسل"
|
||||
posthog = "PostHog Analytics"
|
||||
scarf = "Scarf Pixel"
|
||||
|
||||
[removeMetadata]
|
||||
submit = "إزالة البيانات الوصفية"
|
||||
@@ -5262,7 +5177,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> مستخدمًا مجانًا لكل خادم. للتوسع دون انقطاع، نوصي بخطة Stirling Server - <strong>مقاعد غير محدودة</strong> و<strong>دعم SSO</strong> مقابل $99/server/mo."
|
||||
freeBody = "ترخيص <strong>Open-Core</strong> لدينا يسمح حتى <strong>{{freeTierLimit}}</strong> مستخدمين مجاناً لكل خادم. للتوسع بسلاسة والحصول على وصول مبكر إلى <strong>أداة تحرير نصوص PDF</strong> الجديدة، نوصي بخطة خادم Stirling - تحرير كامل و<strong>مقاعد غير محدودة</strong> مقابل $99/خادم/شهرياً."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "تنزيل"
|
||||
@@ -5367,31 +5282,6 @@ error = "فشل تحديث حالة المستخدم"
|
||||
success = "تم حذف المستخدم بنجاح"
|
||||
error = "فشل حذف المستخدم"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "تغيير كلمة المرور"
|
||||
title = "تغيير كلمة المرور"
|
||||
subtitle = "تحديث كلمة المرور لـ"
|
||||
newPassword = "كلمة مرور جديدة"
|
||||
confirmPassword = "تأكيد كلمة المرور"
|
||||
placeholder = "أدخل كلمة مرور جديدة"
|
||||
confirmPlaceholder = "أعد إدخال كلمة المرور الجديدة"
|
||||
passwordRequired = "يرجى إدخال كلمة مرور جديدة"
|
||||
passwordMismatch = "كلمتا المرور غير متطابقتين"
|
||||
generateRandom = "إنشاء كلمة مرور آمنة"
|
||||
generatedPreview = "كلمة المرور المُنشأة:"
|
||||
copyTooltip = "نسخ إلى الحافظة"
|
||||
copiedToClipboard = "تم نسخ كلمة المرور إلى الحافظة"
|
||||
copyFailed = "فشل نسخ كلمة المرور"
|
||||
sendEmail = "إرسال بريد إلكتروني للمستخدم حول هذا التغيير"
|
||||
includePassword = "تضمين كلمة المرور الجديدة في البريد الإلكتروني"
|
||||
forcePasswordChange = "إلزام المستخدم بتغيير كلمة المرور عند تسجيل الدخول التالي"
|
||||
emailUnavailable = "بريد هذا المستخدم الإلكتروني غير صالح. تم تعطيل الإشعارات."
|
||||
smtpDisabled = "تتطلب إشعارات البريد الإلكتروني تفعيل SMTP في الإعدادات."
|
||||
notifyOnly = "سيتم إرسال بريد إلكتروني بدون كلمة المرور لإبلاغ المستخدم بأن المشرف قد غيّرها."
|
||||
submit = "تحديث كلمة المرور"
|
||||
success = "تم تحديث كلمة المرور بنجاح"
|
||||
error = "فشل تحديث كلمة المرور"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "دعوة عبر البريد الإلكتروني"
|
||||
description = "اكتب أو الصق عناوين البريد الإلكتروني أدناه مفصولة بفواصل. سيتلقى المستخدمون بيانات اعتماد تسجيل الدخول عبر البريد الإلكتروني."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "سجّل الدخول بحساب Stirling الخاص بك"
|
||||
[setup.selfhosted]
|
||||
title = "سجّل الدخول إلى الخادم"
|
||||
subtitle = "أدخل بيانات اعتماد الخادم"
|
||||
link = "أو الاتصال بحساب مُستضاف ذاتيًا"
|
||||
|
||||
[setup.server]
|
||||
title = "الاتصال بالخادم"
|
||||
@@ -5944,14 +5833,6 @@ description = "أدخل عنوان URL الكامل لخادم Stirling PDF ال
|
||||
emptyUrl = "يرجى إدخال عنوان URL للخادم"
|
||||
unreachable = "تعذّر الاتصال بالخادم"
|
||||
testFailed = "فشل اختبار الاتصال"
|
||||
configFetch = "فشل في جلب إعدادات الخادم. يرجى التحقق من عنوان URL والمحاولة مرة أخرى."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "تسجيل الدخول غير مفعّل"
|
||||
body = "لا يحتوي هذا الخادم على تسجيل دخول مفعّل. للاتصال بهذا الخادم، يجب تمكين المصادقة:"
|
||||
step1 = "عيّن DOCKER_ENABLE_SECURITY=true في بيئتك"
|
||||
step2 = "أو عيّن security.enableLogin=true في settings.yml"
|
||||
step3 = "أعد تشغيل الخادم"
|
||||
|
||||
[setup.login]
|
||||
title = "تسجيل الدخول"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "وصول مبكر"
|
||||
reset = "إعادة تعيين التغييرات"
|
||||
downloadJson = "تنزيل JSON"
|
||||
generatePdf = "توليد PDF"
|
||||
saveChanges = "حفظ التغييرات"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ضبط النص تلقائياً ليتناسب مع الصناديق"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "هذا العارض بنسخة ألفا ولا يزال يتطور—ق
|
||||
[pdfTextEditor.empty]
|
||||
title = "لم يتم تحميل مستند"
|
||||
subtitle = "حمّل ملف PDF أو JSON لبدء تحرير محتوى النص."
|
||||
dropzone = "اسحب وأفلت ملف PDF أو JSON هنا، أو انقر للاستعراض"
|
||||
dropzoneWithFiles = "حدد ملفًا من علامة تبويب الملفات، أو اسحب وأفلت ملف PDF أو JSON هنا، أو انقر للاستعراض"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "مرحباً بك في محرر نصوص PDF (وصول مبكر)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF Barəsində Məlumat Əldə Et"
|
||||
header = "PDF Barəsində Məlumat Əldə Et"
|
||||
submit = "Məlumat Əldə Et"
|
||||
downloadJson = "JSON yüklə"
|
||||
processing = "Məlumat çıxarılır..."
|
||||
results = "Nəticələr"
|
||||
noResults = "Hesabat yaratmaq üçün aləti işə salın."
|
||||
downloads = "Yükləmələr"
|
||||
noneDetected = "Heç nə aşkar edilmədi"
|
||||
indexTitle = "İndeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Tam məlumat xülasəsi"
|
||||
shortTitle = "PDF Məlumatı"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metaməlumat"
|
||||
formFields = "Forma sahələri"
|
||||
basicInfo = "Əsas Məlumat"
|
||||
documentInfo = "Sənəd Məlumatı"
|
||||
compliance = "Uyğunluq"
|
||||
encryption = "Şifrələmə"
|
||||
permissions = "İcazələr"
|
||||
other = "Digər"
|
||||
perPageInfo = "Hər səhifə üzrə məlumat"
|
||||
tableOfContents = "Mündəricat"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Əlavələr"
|
||||
embeddedFiles = "Gömülü fayllar"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Qatlar"
|
||||
structureTree = "Struktur ağacı"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Ölçü"
|
||||
annotations = "Annotasiyalar"
|
||||
images = "Şəkillər"
|
||||
links = "Keçidlər"
|
||||
fonts = "Şriftlər"
|
||||
xobjects = "XObject sayları"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Səhifələr"
|
||||
fileSize = "Fayl Ölçüsü"
|
||||
pdfVersion = "PDF Versiyası"
|
||||
language = "Dil"
|
||||
title = "PDF Xülasəsi"
|
||||
author = "Müəllif"
|
||||
created = "Yaradılıb"
|
||||
modified = "Dəyişdirilib"
|
||||
permsAll = "Bütün icazələr verilib"
|
||||
permsRestricted = "{{count}} məhdudiyyət"
|
||||
permsMixed = "Bəzi icazələr məhdudlaşdırılıb"
|
||||
hasCompliance = "Uyğunluq standartları mövcuddur"
|
||||
noCompliance = "Uyğunluq standartları yoxdur"
|
||||
basic = "Əsas Məlumat"
|
||||
documentInfo = "Sənəd Məlumatı"
|
||||
securityTitle = "Təhlükəsizlik Vəziyyəti"
|
||||
technical = "Texniki"
|
||||
overviewTitle = "PDF İcmalı"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Şifrələnmiş PDF - Parol ilə qorunur"
|
||||
unencrypted = "Şifrələnməmiş PDF - Parol qorunması yoxdur"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Şəkillər"
|
||||
fonts = "Şriftlər"
|
||||
formFields = "Forma sahələri"
|
||||
embeddedFiles = "Gömülü fayllar"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Qatlar"
|
||||
bookmarks = "Əlfəcinlər"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "adsız sənəd"
|
||||
unknown = "Naməlum müəllif"
|
||||
text = "Bu, {{author}} tərəfindən yaradılmış, {{title}} adlı, {{pages}} səhifəlik PDF-dir (PDF versiyası {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Bəzi faylları emal etmək mümkün olmadı."
|
||||
unexpected = "Çıxarılma zamanı gözlənilməz xəta baş verdi."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Çıxarılma tamamlandı"
|
||||
|
||||
[extractPage]
|
||||
tags = "çıxar"
|
||||
@@ -5262,7 +5177,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> 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Yüklə"
|
||||
@@ -5367,31 +5282,6 @@ error = "İstifadəçi statusunu yeniləmək alınmadı"
|
||||
success = "İstifadəçi uğurla silindi"
|
||||
error = "İstifadəçini silmək alınmadı"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Parolu dəyiş"
|
||||
title = "Parolu dəyiş"
|
||||
subtitle = "Aşağıdakı istifadəçi üçün parolu yeniləyin"
|
||||
newPassword = "Yeni parol"
|
||||
confirmPassword = "Parolu təsdiq edin"
|
||||
placeholder = "Yeni parolu daxil edin"
|
||||
confirmPlaceholder = "Yeni parolu yenidən daxil edin"
|
||||
passwordRequired = "Zəhmət olmasa yeni parolu daxil edin"
|
||||
passwordMismatch = "Parollar uyğun gəlmir"
|
||||
generateRandom = "Təhlükəsiz parol yaradın"
|
||||
generatedPreview = "Yaradılmış parol:"
|
||||
copyTooltip = "Buferə kopyala"
|
||||
copiedToClipboard = "Parol buferə kopyalandı"
|
||||
copyFailed = "Parolu kopyalamaq alınmadı"
|
||||
sendEmail = "Bu dəyişiklik barədə istifadəçiyə e-poçt göndərin"
|
||||
includePassword = "E-poçta yeni parolu daxil edin"
|
||||
forcePasswordChange = "Növbəti girişdə istifadəçini parolu dəyişməyə məcbur et"
|
||||
emailUnavailable = "Bu istifadəçinin e-poçtu etibarlı e-poçt ünvanı deyil. Bildirişlər söndürülüb."
|
||||
smtpDisabled = "E-poçt bildirişləri üçün parametrlərdə SMTP aktiv olmalıdır."
|
||||
notifyOnly = "Parol olmadan e-poçt göndəriləcək; istifadəçiyə adminin onu dəyişdiyi bildiriləcək."
|
||||
submit = "Parolu yenilə"
|
||||
success = "Parol uğurla yeniləndi"
|
||||
error = "Parolu yeniləmək alınmadı"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-poçt Dəvəti"
|
||||
description = "Aşağıya vergüllə ayrılmış e-poçtları yazın və ya yapışdırın. İstifadəçilərə giriş məlumatları e-poçtla göndəriləcək."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Stirling hesabınızla daxil olun"
|
||||
[setup.selfhosted]
|
||||
title = "Serverə daxil olun"
|
||||
subtitle = "Server məlumatlarınızı daxil edin"
|
||||
link = "və ya self-hosted hesaba qoşulun"
|
||||
|
||||
[setup.server]
|
||||
title = "Serverə qoşulun"
|
||||
@@ -5944,14 +5833,6 @@ description = "Öz Stirling PDF serverinizin tam URL ünvanını daxil edin"
|
||||
emptyUrl = "Zəhmət olmasa server URL-i 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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Giriş aktiv deyil"
|
||||
body = "Bu serverdə giriş aktiv deyil. Bu serverə qoşulmaq üçün autentifikasiya aktiv edilməlidir:"
|
||||
step1 = "Mühitinizdə DOCKER_ENABLE_SECURITY=true təyin edin"
|
||||
step2 = "Yaxud settings.yml faylında security.enableLogin=true təyin edin"
|
||||
step3 = "Serveri yenidən başladın"
|
||||
|
||||
[setup.login]
|
||||
title = "Daxil ol"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Erkən Giriş"
|
||||
reset = "Dəyişiklikləri sıfırla"
|
||||
downloadJson = "JSON-u endir"
|
||||
generatePdf = "PDF yarat"
|
||||
saveChanges = "Dəyişiklikləri yadda saxla"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Mətni avtomatik miqyasla"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Bu alfa görüntüləyici hələ inkişaf edir—bəzi şriftlər, rən
|
||||
[pdfTextEditor.empty]
|
||||
title = "Sənəd yüklənməyib"
|
||||
subtitle = "Mətn məzmununu redaktə etməyə başlamaq üçün PDF və ya JSON faylı yükləyin."
|
||||
dropzone = "Buraya PDF və ya JSON faylını sürükləyib buraxın və ya baxmaq üçün klikləyin"
|
||||
dropzoneWithFiles = "Fayllar vərəqindən bir fayl seçin və ya buraya PDF və ya JSON faylını sürükləyib buraxın, yaxud baxmaq üçün klikləyin"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor-ə xoş gəldiniz (Erkən Giriş)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Вземете информация за PDF"
|
||||
header = "Вземете информация за PDF"
|
||||
submit = "Вземете информация"
|
||||
downloadJson = "Изтеглете JSON"
|
||||
processing = "Извличане на информация..."
|
||||
results = "Резултати"
|
||||
noResults = "Стартирайте инструмента, за да генерирате отчет."
|
||||
downloads = "Изтегляния"
|
||||
noneDetected = "Нищо не е открито"
|
||||
indexTitle = "Индекс"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Пълно резюме на информацията"
|
||||
shortTitle = "Информация за PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Метаданни"
|
||||
formFields = "Полета на формуляра"
|
||||
basicInfo = "Основна информация"
|
||||
documentInfo = "Информация за документа"
|
||||
compliance = "Съответствие"
|
||||
encryption = "Шифриране"
|
||||
permissions = "Разрешения"
|
||||
other = "Друго"
|
||||
perPageInfo = "Информация по страници"
|
||||
tableOfContents = "Съдържание"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Прикачени файлове"
|
||||
embeddedFiles = "Вградени файлове"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Слоеве"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Размер"
|
||||
annotations = "Анотации"
|
||||
images = "Изображения"
|
||||
links = "Връзки"
|
||||
fonts = "Шрифтове"
|
||||
xobjects = "Брой XObject"
|
||||
multimedia = "Мултимедия"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Страници"
|
||||
fileSize = "Размер на файла"
|
||||
pdfVersion = "Версия на PDF"
|
||||
language = "Език"
|
||||
title = "Обобщение на PDF"
|
||||
author = "Автор"
|
||||
created = "Създаден"
|
||||
modified = "Променен"
|
||||
permsAll = "Всички разрешения са позволени"
|
||||
permsRestricted = "{{count}} ограничения"
|
||||
permsMixed = "Някои разрешения са ограничени"
|
||||
hasCompliance = "Има стандарти за съответствие"
|
||||
noCompliance = "Няма стандарти за съответствие"
|
||||
basic = "Основна информация"
|
||||
documentInfo = "Информация за документа"
|
||||
securityTitle = "Състояние на сигурността"
|
||||
technical = "Технически"
|
||||
overviewTitle = "Преглед на PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Шифриран PDF - налична защита с парола"
|
||||
unencrypted = "Нешифриран PDF - няма защита с парола"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Изображения"
|
||||
fonts = "Шрифтове"
|
||||
formFields = "Полета на формуляра"
|
||||
embeddedFiles = "Вградени файлове"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Слоеве"
|
||||
bookmarks = "Отметки"
|
||||
multimedia = "Мултимедия"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "неозаглавен документ"
|
||||
unknown = "Неизвестен автор"
|
||||
text = "Това е {{pages}}-страничен PDF със заглавие {{title}}, създаден от {{author}} (версия на PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Някои файлове не можаха да бъдат обработени."
|
||||
unexpected = "Неочаквана грешка по време на извличане."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Извличането е завършено"
|
||||
|
||||
[extractPage]
|
||||
tags = "извличане"
|
||||
@@ -5262,7 +5177,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> потребители безплатно на сървър. За безпрепятствено мащабиране препоръчваме плана Stirling Server - <strong>неограничени места</strong> и <strong>поддръжка на SSO</strong> за $99/server/mo."
|
||||
freeBody = "Нашият <strong>Open-Core</strong> лиценз позволява до <strong>{{freeTierLimit}}</strong> безплатни потребители на сървър. За да мащабирате без прекъсвания и да получите ранен достъп до нашия нов <strong>инструмент за редакция на PDF текст</strong>, препоръчваме плана Stirling Server – пълно редактиране и <strong>неограничени места</strong> за $99/сървър/месец."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Изтегляне"
|
||||
@@ -5367,31 +5282,6 @@ error = "Неуспешно обновяване на статус на потр
|
||||
success = "Потребителят е изтрит успешно"
|
||||
error = "Неуспешно изтриване на потребител"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Промяна на парола"
|
||||
title = "Промяна на парола"
|
||||
subtitle = "Актуализирайте паролата за"
|
||||
newPassword = "Нова парола"
|
||||
confirmPassword = "Потвърдете паролата"
|
||||
placeholder = "Въведете нова парола"
|
||||
confirmPlaceholder = "Въведете отново новата парола"
|
||||
passwordRequired = "Моля, въведете нова парола"
|
||||
passwordMismatch = "Паролите не съвпадат"
|
||||
generateRandom = "Генерирайте сигурна парола"
|
||||
generatedPreview = "Генерирана парола:"
|
||||
copyTooltip = "Копиране в клипборда"
|
||||
copiedToClipboard = "Паролата е копирана в клипборда"
|
||||
copyFailed = "Неуспешно копиране на паролата"
|
||||
sendEmail = "Изпратете имейл на потребителя за тази промяна"
|
||||
includePassword = "Включете новата парола в имейла"
|
||||
forcePasswordChange = "Принудете потребителя да смени паролата при следващо влизане"
|
||||
emailUnavailable = "Имейлът на този потребител не е валиден адрес. Известията са изключени."
|
||||
smtpDisabled = "Имейл известията изискват SMTP да е активиран в настройките."
|
||||
notifyOnly = "Ще бъде изпратен имейл без паролата, за да уведоми потребителя, че администратор я е променил."
|
||||
submit = "Актуализиране на паролата"
|
||||
success = "Паролата е актуализирана успешно"
|
||||
error = "Неуспешно актуализиране на паролата"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Покана по имейл"
|
||||
description = "Въведете или поставете имейли по-долу, разделени със запетаи. Потребителите ще получат данни за вход по имейл."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Впишете се с вашия Stirling акаунт"
|
||||
[setup.selfhosted]
|
||||
title = "Впишете се в сървъра"
|
||||
subtitle = "Въведете своите данни за сървъра"
|
||||
link = "или се свържете със самостоятелно хостван акаунт"
|
||||
|
||||
[setup.server]
|
||||
title = "Свързване към сървър"
|
||||
@@ -5944,14 +5833,6 @@ description = "Въведете пълния URL на вашия самосто
|
||||
emptyUrl = "Моля, въведете URL на сървър"
|
||||
unreachable = "Неуспешна връзка със сървъра"
|
||||
testFailed = "Тестът на връзката е неуспешен"
|
||||
configFetch = "Неуспешно извличане на конфигурацията на сървъра. Моля, проверете URL адреса и опитайте отново."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Входът не е активиран"
|
||||
body = "На този сървър не е активиран вход. За да се свържете, трябва да активирате удостоверяване:"
|
||||
step1 = "Задайте DOCKER_ENABLE_SECURITY=true във вашата среда"
|
||||
step2 = "Или задайте security.enableLogin=true в settings.yml"
|
||||
step3 = "Рестартирайте сървъра"
|
||||
|
||||
[setup.login]
|
||||
title = "Вписване"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Ранен достъп"
|
||||
reset = "Отмени промените"
|
||||
downloadJson = "Изтегли JSON"
|
||||
generatePdf = "Генерирай PDF"
|
||||
saveChanges = "Запази промените"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Авто-мащабиране на текст за напасване в полетата"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Този алфа визуализатор все още се разв
|
||||
[pdfTextEditor.empty]
|
||||
title = "Няма зареден документ"
|
||||
subtitle = "Заредете PDF или JSON файл, за да започнете да редактирате текстовото съдържание."
|
||||
dropzone = "Плъзнете и пуснете тук PDF или JSON файл или щракнете, за да прегледате"
|
||||
dropzoneWithFiles = "Изберете файл от раздела Файлове или плъзнете и пуснете тук PDF или JSON файл, или щракнете, за да прегледате"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Добре дошли в PDF Text Editor (ранен достъп)"
|
||||
|
||||
@@ -352,7 +352,7 @@ teams = "Equips"
|
||||
title = "Configuració"
|
||||
systemSettings = "Configuració del sistema"
|
||||
features = "Funcions"
|
||||
endpoints = "Punts finals"
|
||||
endpoints = "Endpoints"
|
||||
database = "Base de dades"
|
||||
advanced = "Avançat"
|
||||
|
||||
@@ -561,7 +561,7 @@ totalEndpoints = "Total d'endpoints"
|
||||
totalVisits = "Total de visites"
|
||||
showing = "Mostrant"
|
||||
selectedVisits = "Visites seleccionades"
|
||||
endpoint = "Punt final"
|
||||
endpoint = "Endpoint"
|
||||
visits = "Visites"
|
||||
percentage = "Percentatge"
|
||||
loading = "Carregant..."
|
||||
@@ -3036,91 +3036,6 @@ title = "Obteniu Informació del PDF"
|
||||
header = "Obteniu Informació del PDF"
|
||||
submit = "Obteniu Informació"
|
||||
downloadJson = "Descarrega JSON"
|
||||
processing = "Extraient informació..."
|
||||
results = "Resultats"
|
||||
noResults = "Executeu l'eina per generar un informe."
|
||||
downloads = "Descàrregues"
|
||||
noneDetected = "No se n'ha detectat cap"
|
||||
indexTitle = "Índex"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Resum d'informació complet"
|
||||
shortTitle = "Informació del PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadades"
|
||||
formFields = "Camps de formulari"
|
||||
basicInfo = "Informació bàsica"
|
||||
documentInfo = "Informació del document"
|
||||
compliance = "Conformitat"
|
||||
encryption = "Xifratge"
|
||||
permissions = "Permisos"
|
||||
other = "Altres"
|
||||
perPageInfo = "Informació per pàgina"
|
||||
tableOfContents = "Taula de continguts"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Fitxers adjunts"
|
||||
embeddedFiles = "Fitxers incrustats"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Capes"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Mida"
|
||||
annotations = "Anotacions"
|
||||
images = "Imatges"
|
||||
links = "Enllaços"
|
||||
fonts = "Tipus de lletra"
|
||||
xobjects = "Recompte d'XObject"
|
||||
multimedia = "Multimèdia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pàgines"
|
||||
fileSize = "Mida del fitxer"
|
||||
pdfVersion = "Versió del PDF"
|
||||
language = "Idioma"
|
||||
title = "Resum del PDF"
|
||||
author = "Autor"
|
||||
created = "Creat"
|
||||
modified = "Modificat"
|
||||
permsAll = "Tots els permisos permesos"
|
||||
permsRestricted = "{{count}} restriccions"
|
||||
permsMixed = "Alguns permisos restringits"
|
||||
hasCompliance = "Té estàndards de conformitat"
|
||||
noCompliance = "Sense estàndards de conformitat"
|
||||
basic = "Informació bàsica"
|
||||
documentInfo = "Informació del document"
|
||||
securityTitle = "Estat de seguretat"
|
||||
technical = "Tècnic"
|
||||
overviewTitle = "Visió general del PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF xifrat - Protecció amb contrasenya present"
|
||||
unencrypted = "PDF no xifrat - Sense protecció amb contrasenya"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Imatges"
|
||||
fonts = "Tipus de lletra"
|
||||
formFields = "Camps de formulari"
|
||||
embeddedFiles = "Fitxers incrustats"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Capes"
|
||||
bookmarks = "Marcadors"
|
||||
multimedia = "Multimèdia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "un document sense títol"
|
||||
unknown = "Autor desconegut"
|
||||
text = "Aquest és un PDF de {{pages}} pàgines titulat {{title}} creat per {{author}} (versió del PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Alguns fitxers no s'han pogut processar."
|
||||
unexpected = "Error inesperat durant l'extracció."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extracció completada"
|
||||
|
||||
[extractPage]
|
||||
tags = "extreure"
|
||||
@@ -4451,7 +4366,7 @@ features = "Banderes de funcions"
|
||||
processing = "Processament"
|
||||
|
||||
[admin.settings.advanced.endpoints]
|
||||
label = "Punts finals"
|
||||
label = "Endpoints"
|
||||
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."
|
||||
|
||||
@@ -5262,7 +5177,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, recomanem el pla Stirling Server - <strong>places il·limitades</strong> i <strong>suport SSO</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 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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Baixa"
|
||||
@@ -5367,31 +5282,6 @@ error = "No s’ha pogut actualitzar l’estat de l’usuari"
|
||||
success = "Usuari suprimit correctament"
|
||||
error = "No s’ha pogut suprimir l’usuari"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Canvieu la contrasenya"
|
||||
title = "Canvi de contrasenya"
|
||||
subtitle = "Actualitza la contrasenya de"
|
||||
newPassword = "Contrasenya nova"
|
||||
confirmPassword = "Confirma la contrasenya"
|
||||
placeholder = "Introduïu una contrasenya nova"
|
||||
confirmPlaceholder = "Torneu a introduir la contrasenya nova"
|
||||
passwordRequired = "Introduïu una contrasenya nova"
|
||||
passwordMismatch = "Les contrasenyes no coincideixen"
|
||||
generateRandom = "Genereu una contrasenya segura"
|
||||
generatedPreview = "Contrasenya generada:"
|
||||
copyTooltip = "Copieu al portapapers"
|
||||
copiedToClipboard = "Contrasenya copiada al portapapers"
|
||||
copyFailed = "No s'ha pogut copiar la contrasenya"
|
||||
sendEmail = "Envieu un correu a l'usuari sobre aquest canvi"
|
||||
includePassword = "Incloeu la contrasenya nova al correu"
|
||||
forcePasswordChange = "Obligueu l'usuari a canviar la contrasenya en el pròxim inici de sessió"
|
||||
emailUnavailable = "El correu d'aquest usuari no és una adreça de correu vàlida. Les notificacions estan desactivades."
|
||||
smtpDisabled = "Les notificacions per correu electrònic requereixen habilitar SMTP als paràmetres."
|
||||
notifyOnly = "S'enviarà un correu sense la contrasenya, informant l'usuari que un administrador l'ha canviada."
|
||||
submit = "Actualitzeu la contrasenya"
|
||||
success = "La contrasenya s'ha actualitzat correctament"
|
||||
error = "No s'ha pogut actualitzar la contrasenya"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Invitació per correu"
|
||||
description = "Escriviu o enganxeu correus a continuació, separats per comes. Els usuaris rebran credencials d’inici de sessió per correu electrònic."
|
||||
@@ -5864,7 +5754,7 @@ title = "Gràfic d'ús dels endpoints"
|
||||
|
||||
[usage.table]
|
||||
title = "Estadístiques detallades"
|
||||
endpoint = "Punt final"
|
||||
endpoint = "Endpoint"
|
||||
visits = "Visites"
|
||||
percentage = "Percentatge"
|
||||
noData = "No hi ha dades disponibles"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Inicia sessió amb el teu compte de Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Inicia sessió al servidor"
|
||||
subtitle = "Introdueix les credencials del servidor"
|
||||
link = "o connecteu-vos a un compte autoallotjat"
|
||||
|
||||
[setup.server]
|
||||
title = "Connecta't al servidor"
|
||||
@@ -5944,14 +5833,6 @@ description = "Introdueix la URL completa del teu servidor autoallotjat de Stirl
|
||||
emptyUrl = "Introdueix una URL de servidor"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Inici de sessió no habilitat"
|
||||
body = "Aquest servidor no té l'inici de sessió habilitat. Per connectar-hi, heu d'habilitar l'autenticació:"
|
||||
step1 = "Establiu DOCKER_ENABLE_SECURITY=true al vostre entorn"
|
||||
step2 = "O establiu security.enableLogin=true a settings.yml"
|
||||
step3 = "Reinicieu el servidor"
|
||||
|
||||
[setup.login]
|
||||
title = "Inicia sessió"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Accés anticipat"
|
||||
reset = "Restableix els canvis"
|
||||
downloadJson = "Descarrega JSON"
|
||||
generatePdf = "Genera PDF"
|
||||
saveChanges = "Deseu els canvis"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoajusta el text a les caixes"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Aquest visor alfa encara evoluciona—certs tipus de lletra, colors, ef
|
||||
[pdfTextEditor.empty]
|
||||
title = "No s'ha carregat cap document"
|
||||
subtitle = "Carrega un fitxer PDF o JSON per començar a editar el contingut de text."
|
||||
dropzone = "Arrossegueu i deixeu anar un fitxer PDF o JSON aquí, o feu clic per explorar"
|
||||
dropzoneWithFiles = "Seleccioneu un fitxer de la pestanya Fitxers o arrossegueu i deixeu anar aquí un fitxer PDF o JSON, o feu clic per explorar"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Benvingut a l'Editor de text PDF (accés anticipat)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Získat informace o PDF"
|
||||
header = "Získat informace o PDF"
|
||||
submit = "Získat informace"
|
||||
downloadJson = "Stáhnout JSON"
|
||||
processing = "Probíhá extrahování informací..."
|
||||
results = "Výsledky"
|
||||
noResults = "Spusťte nástroj pro vygenerování zprávy."
|
||||
downloads = "Stažení"
|
||||
noneDetected = "Nic nebylo zjištěno"
|
||||
indexTitle = "Rejstřík"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Úplné shrnutí informací"
|
||||
shortTitle = "Informace o PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Formulářová pole"
|
||||
basicInfo = "Základní informace"
|
||||
documentInfo = "Informace o dokumentu"
|
||||
compliance = "Shoda"
|
||||
encryption = "Šifrování"
|
||||
permissions = "Oprávnění"
|
||||
other = "Ostatní"
|
||||
perPageInfo = "Informace po stránkách"
|
||||
tableOfContents = "Obsah"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Přílohy"
|
||||
embeddedFiles = "Vložené soubory"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Vrstvy"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Velikost"
|
||||
annotations = "Anotace"
|
||||
images = "Obrázky"
|
||||
links = "Odkazy"
|
||||
fonts = "Písma"
|
||||
xobjects = "Počty XObjectů"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Stránky"
|
||||
fileSize = "Velikost souboru"
|
||||
pdfVersion = "Verze PDF"
|
||||
language = "Jazyk"
|
||||
title = "Souhrn PDF"
|
||||
author = "Autor"
|
||||
created = "Vytvořeno"
|
||||
modified = "Upraveno"
|
||||
permsAll = "Všechna oprávnění povolena"
|
||||
permsRestricted = "{{count}} omezení"
|
||||
permsMixed = "Některá oprávnění jsou omezena"
|
||||
hasCompliance = "Obsahuje standardy shody"
|
||||
noCompliance = "Žádné standardy shody"
|
||||
basic = "Základní informace"
|
||||
documentInfo = "Informace o dokumentu"
|
||||
securityTitle = "Stav zabezpečení"
|
||||
technical = "Technické"
|
||||
overviewTitle = "Přehled PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Šifrované PDF – chráněno heslem"
|
||||
unencrypted = "Nešifrované PDF – bez ochrany heslem"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Obrázky"
|
||||
fonts = "Písma"
|
||||
formFields = "Formulářová pole"
|
||||
embeddedFiles = "Vložené soubory"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Vrstvy"
|
||||
bookmarks = "Záložky"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "nepojmenovaný dokument"
|
||||
unknown = "Neznámý autor"
|
||||
text = "Toto je PDF o {{pages}} stránkách s názvem {{title}} od autora {{author}} (verze PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Některé soubory se nepodařilo zpracovat."
|
||||
unexpected = "Během extrahování došlo k neočekávané chybě."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extrahování dokončeno"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrahovat"
|
||||
@@ -4261,7 +4176,7 @@ description = "Sledovat akce uživatelů a systémové události pro compliance
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Úroveň auditu"
|
||||
description = "0=VYPNUTO, 1=ZÁKLADNÍ, 2=STANDARDNÍ, 3=PODROBNÝ"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Doba uchování auditů (dny)"
|
||||
@@ -5262,7 +5177,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š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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Stáhnout"
|
||||
@@ -5367,31 +5282,6 @@ error = "Nepodařilo se aktualizovat stav uživatele"
|
||||
success = "Uživatel úspěšně smazán"
|
||||
error = "Nepodařilo se smazat uživatele"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Změnit heslo"
|
||||
title = "Změna hesla"
|
||||
subtitle = "Aktualizovat heslo pro"
|
||||
newPassword = "Nové heslo"
|
||||
confirmPassword = "Potvrzení hesla"
|
||||
placeholder = "Zadejte nové heslo"
|
||||
confirmPlaceholder = "Zadejte nové heslo znovu"
|
||||
passwordRequired = "Zadejte prosím nové heslo"
|
||||
passwordMismatch = "Hesla se neshodují"
|
||||
generateRandom = "Vygenerovat bezpečné heslo"
|
||||
generatedPreview = "Vygenerované heslo:"
|
||||
copyTooltip = "Zkopírovat do schránky"
|
||||
copiedToClipboard = "Heslo zkopírováno do schránky"
|
||||
copyFailed = "Heslo se nepodařilo zkopírovat"
|
||||
sendEmail = "Odeslat uživateli e-mail o této změně"
|
||||
includePassword = "Zahrnout nové heslo do e-mailu"
|
||||
forcePasswordChange = "Vynutit změnu hesla při příštím přihlášení"
|
||||
emailUnavailable = "E-mailová adresa tohoto uživatele není platná. Oznámení jsou deaktivována."
|
||||
smtpDisabled = "E-mailová oznámení vyžadují, aby bylo v nastavení povoleno SMTP."
|
||||
notifyOnly = "Bude odeslán e-mail bez hesla, který uživateli oznámí, že ho změnil administrátor."
|
||||
submit = "Aktualizovat heslo"
|
||||
success = "Heslo bylo úspěšně aktualizováno"
|
||||
error = "Heslo se nepodařilo aktualizovat"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Pozvánka e‑mailem"
|
||||
description = "Níže napište nebo vložte e‑maily oddělené čárkami. Uživatelé obdrží přihlašovací údaje e‑mailem."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Přihlaste se svým účtem Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Přihlásit se k serveru"
|
||||
subtitle = "Zadejte přihlašovací údaje k vašemu serveru"
|
||||
link = "nebo se připojte k účtu s vlastním hostováním"
|
||||
|
||||
[setup.server]
|
||||
title = "Připojit k serveru"
|
||||
@@ -5944,14 +5833,6 @@ description = "Zadejte úplnou URL vašeho samohostovaného serveru Stirling PDF
|
||||
emptyUrl = "Zadejte URL serveru"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Přihlášení není povoleno"
|
||||
body = "Na tomto serveru není povoleno přihlašování. Pokud se chcete připojit, musíte povolit ověřování:"
|
||||
step1 = "Nastavte DOCKER_ENABLE_SECURITY=true ve svém prostředí"
|
||||
step2 = "Nebo nastavte security.enableLogin=true v souboru settings.yml"
|
||||
step3 = "Restartujte server"
|
||||
|
||||
[setup.login]
|
||||
title = "Přihlášení"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Předběžný přístup"
|
||||
reset = "Obnovit změny"
|
||||
downloadJson = "Stáhnout JSON"
|
||||
generatePdf = "Vytvořit PDF"
|
||||
saveChanges = "Uložit změny"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automaticky přizpůsobit text rámečkům"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Tento alfa prohlížeč se stále vyvíjí — některé fonty, barvy,
|
||||
[pdfTextEditor.empty]
|
||||
title = "Není načten žádný dokument"
|
||||
subtitle = "Načtěte soubor PDF nebo JSON a začněte upravovat text."
|
||||
dropzone = "Sem přetáhněte soubor PDF nebo JSON, případně kliknutím vyberte"
|
||||
dropzoneWithFiles = "Vyberte soubor na kartě Soubory, nebo sem přetáhněte soubor PDF či JSON, případně kliknutím vyberte"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Vítejte v editoru textu PDF (předběžný přístup)"
|
||||
|
||||
@@ -1221,9 +1221,9 @@ pdfaDigitalSignatureWarning = "PDF'en indeholder en digital signatur. Dette vil
|
||||
fileFormat = "Filformat"
|
||||
wordDoc = "Word-dokument"
|
||||
wordDocExt = "Word-dokument (.docx)"
|
||||
odtExt = "OpenDocument-tekst (.odt)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument-præsentation (.odp)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
txtExt = "Almindelig tekst (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "Valgte filer"
|
||||
@@ -3036,91 +3036,6 @@ title = "Få Info om PDF"
|
||||
header = "Få Info om PDF"
|
||||
submit = "Få Info"
|
||||
downloadJson = "Download JSON"
|
||||
processing = "Udtrækker oplysninger..."
|
||||
results = "Resultater"
|
||||
noResults = "Kør værktøjet for at generere en rapport."
|
||||
downloads = "Downloads"
|
||||
noneDetected = "Ingen registreret"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Fuldt informationsresumé"
|
||||
shortTitle = "PDF-oplysninger"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Formularfelter"
|
||||
basicInfo = "Grundlæggende info"
|
||||
documentInfo = "Dokumentinfo"
|
||||
compliance = "Overensstemmelse"
|
||||
encryption = "Kryptering"
|
||||
permissions = "Tilladelser"
|
||||
other = "Andet"
|
||||
perPageInfo = "Info pr. side"
|
||||
tableOfContents = "Indholdsfortegnelse"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Vedhæftninger"
|
||||
embeddedFiles = "Indlejrede filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lag"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Størrelse"
|
||||
annotations = "Anmærkninger"
|
||||
images = "Billeder"
|
||||
links = "Links"
|
||||
fonts = "Skrifttyper"
|
||||
xobjects = "Antal XObjects"
|
||||
multimedia = "Multimedie"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Sider"
|
||||
fileSize = "Filstørrelse"
|
||||
pdfVersion = "PDF-version"
|
||||
language = "Sprog"
|
||||
title = "PDF-resumé"
|
||||
author = "Forfatter"
|
||||
created = "Oprettet"
|
||||
modified = "Ændret"
|
||||
permsAll = "Alle tilladelser tilladt"
|
||||
permsRestricted = "{{count}} begrænsninger"
|
||||
permsMixed = "Nogle tilladelser er begrænsede"
|
||||
hasCompliance = "Har overensstemmelsesstandarder"
|
||||
noCompliance = "Ingen overensstemmelsesstandarder"
|
||||
basic = "Grundlæggende oplysninger"
|
||||
documentInfo = "Dokumentoplysninger"
|
||||
securityTitle = "Sikkerhedsstatus"
|
||||
technical = "Teknisk"
|
||||
overviewTitle = "PDF-oversigt"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Krypteret PDF - med adgangskodebeskyttelse"
|
||||
unencrypted = "Ukrypteret PDF - ingen adgangskodebeskyttelse"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Billeder"
|
||||
fonts = "Skrifttyper"
|
||||
formFields = "Formularfelter"
|
||||
embeddedFiles = "Indlejrede filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lag"
|
||||
bookmarks = "Bogmærker"
|
||||
multimedia = "Multimedie"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "et dokument uden titel"
|
||||
unknown = "Ukendt forfatter"
|
||||
text = "Dette er en PDF på {{pages}} sider med titlen {{title}}, oprettet af {{author}} (PDF-version {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Nogle filer kunne ikke behandles."
|
||||
unexpected = "Uventet fejl under udtrækning."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Udtrækning fuldført"
|
||||
|
||||
[extractPage]
|
||||
tags = "udtræk"
|
||||
@@ -3875,7 +3790,7 @@ version = "Nuværende udgivelse"
|
||||
title = "API-dokumentation"
|
||||
header = "API-dokumentation"
|
||||
desc = "Se og test Stirling PDF API-endpoints"
|
||||
tags = "api,dokumentation,swagger,endepunkter,udvikling"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Sådan bruger vi cookies"
|
||||
@@ -4343,11 +4258,11 @@ label = "Issuer-URL"
|
||||
description = "OAuth2-udbyderens issuer-URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Klient-ID"
|
||||
label = "Client ID"
|
||||
description = "OAuth2 Client ID fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Klienthemmelighed"
|
||||
label = "Client Secret"
|
||||
description = "OAuth2 Client Secret fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -5262,7 +5177,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 anbefaler vi Stirling Server-planen – <strong>ubegrænsede pladser</strong> og <strong>SSO-understøttelse</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 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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5367,31 +5282,6 @@ error = "Kunne ikke opdatere brugerstatus"
|
||||
success = "Bruger slettet"
|
||||
error = "Kunne ikke slette bruger"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Skift adgangskode"
|
||||
title = "Skift adgangskode"
|
||||
subtitle = "Opdater adgangskoden for"
|
||||
newPassword = "Ny adgangskode"
|
||||
confirmPassword = "Bekræft adgangskode"
|
||||
placeholder = "Indtast en ny adgangskode"
|
||||
confirmPlaceholder = "Indtast den nye adgangskode igen"
|
||||
passwordRequired = "Angiv en ny adgangskode"
|
||||
passwordMismatch = "Adgangskoderne matcher ikke"
|
||||
generateRandom = "Generér sikker adgangskode"
|
||||
generatedPreview = "Genereret adgangskode:"
|
||||
copyTooltip = "Kopiér til udklipsholder"
|
||||
copiedToClipboard = "Adgangskode kopieret til udklipsholderen"
|
||||
copyFailed = "Kunne ikke kopiere adgangskoden"
|
||||
sendEmail = "Send en e-mail til brugeren om denne ændring"
|
||||
includePassword = "Medtag den nye adgangskode i e-mailen"
|
||||
forcePasswordChange = "Tving brugeren til at ændre adgangskode ved næste login"
|
||||
emailUnavailable = "Denne brugers e-mail er ikke en gyldig e-mailadresse. Meddelelser er deaktiveret."
|
||||
smtpDisabled = "E-mailmeddelelser kræver, at SMTP er aktiveret i indstillingerne."
|
||||
notifyOnly = "Der sendes en e-mail uden adgangskoden, som informerer brugeren om, at en administrator har ændret den."
|
||||
submit = "Opdater adgangskode"
|
||||
success = "Adgangskoden blev opdateret"
|
||||
error = "Kunne ikke opdatere adgangskoden"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-mailinvitation"
|
||||
description = "Skriv eller indsæt e-mails nedenfor, adskilt af kommaer. Brugere modtager loginoplysninger via e-mail."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Log ind med din Stirling-konto"
|
||||
[setup.selfhosted]
|
||||
title = "Log ind på server"
|
||||
subtitle = "Indtast dine server-loginoplysninger"
|
||||
link = "eller opret forbindelse til en selvhostet konto"
|
||||
|
||||
[setup.server]
|
||||
title = "Forbind til server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Indtast den fulde URL til din selvhostede Stirling PDF-server"
|
||||
emptyUrl = "Indtast en server-URL"
|
||||
unreachable = "Kunne ikke forbinde til server"
|
||||
testFailed = "Forbindelsestest mislykkedes"
|
||||
configFetch = "Kunne ikke hente serverkonfiguration. Kontrollér URL'en, og prøv igen."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Login ikke aktiveret"
|
||||
body = "Denne server har ikke login aktiveret. For at oprette forbindelse til denne server skal du aktivere godkendelse:"
|
||||
step1 = "Sæt DOCKER_ENABLE_SECURITY=true i dit miljø"
|
||||
step2 = "Eller sæt security.enableLogin=true i settings.yml"
|
||||
step3 = "Genstart serveren"
|
||||
|
||||
[setup.login]
|
||||
title = "Log ind"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Tidlig adgang"
|
||||
reset = "Nulstil ændringer"
|
||||
downloadJson = "Download JSON"
|
||||
generatePdf = "Generer PDF"
|
||||
saveChanges = "Gem ændringer"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoskalér tekst, så den passer i bokse"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Denne alpha-fremviser er stadig under udvikling—visse skrifttyper, fa
|
||||
[pdfTextEditor.empty]
|
||||
title = "Intet dokument indlæst"
|
||||
subtitle = "Indlæs en PDF- eller JSON-fil for at begynde at redigere tekstindhold."
|
||||
dropzone = "Træk og slip en PDF- eller JSON-fil her, eller klik for at gennemse"
|
||||
dropzoneWithFiles = "Vælg en fil fra fanen Filer, eller træk og slip en PDF- eller JSON-fil her, eller klik for at gennemse"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Velkommen til PDF-teksteditor (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Alle Informationen anzeigen"
|
||||
header = "Alle Informationen anzeigen"
|
||||
submit = "Informationen anzeigen"
|
||||
downloadJson = "Als JSON herunterladen"
|
||||
processing = "Informationen werden extrahiert..."
|
||||
results = "Ergebnisse"
|
||||
noResults = "Führen Sie das Tool aus, um einen Bericht zu erstellen."
|
||||
downloads = "Downloads"
|
||||
noneDetected = "Keine erkannt"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Vollständige Informationsübersicht"
|
||||
shortTitle = "PDF-Informationen"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadaten"
|
||||
formFields = "Formularfelder"
|
||||
basicInfo = "Grundlegende Informationen"
|
||||
documentInfo = "Dokumentinformationen"
|
||||
compliance = "Compliance"
|
||||
encryption = "Verschlüsselung"
|
||||
permissions = "Berechtigungen"
|
||||
other = "Sonstiges"
|
||||
perPageInfo = "Informationen pro Seite"
|
||||
tableOfContents = "Inhaltsverzeichnis"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Anhänge"
|
||||
embeddedFiles = "Eingebettete Dateien"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Ebenen"
|
||||
structureTree = "Strukturbaum"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Größe"
|
||||
annotations = "Anmerkungen"
|
||||
images = "Bilder"
|
||||
links = "Links"
|
||||
fonts = "Schriftarten"
|
||||
xobjects = "XObject-Anzahl"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Seiten"
|
||||
fileSize = "Dateigröße"
|
||||
pdfVersion = "PDF-Version"
|
||||
language = "Sprache"
|
||||
title = "PDF-Zusammenfassung"
|
||||
author = "Autor"
|
||||
created = "Erstellt"
|
||||
modified = "Geändert"
|
||||
permsAll = "Alle Berechtigungen erlaubt"
|
||||
permsRestricted = "{{count}} Einschränkungen"
|
||||
permsMixed = "Einige Berechtigungen eingeschränkt"
|
||||
hasCompliance = "Entspricht Compliance-Standards"
|
||||
noCompliance = "Keine Compliance-Standards"
|
||||
basic = "Grundlegende Informationen"
|
||||
documentInfo = "Dokumentinformationen"
|
||||
securityTitle = "Sicherheitsstatus"
|
||||
technical = "Technisch"
|
||||
overviewTitle = "PDF-Übersicht"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Verschlüsseltes PDF - Passwortschutz vorhanden"
|
||||
unencrypted = "Unverschlüsseltes PDF - Kein Passwortschutz"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Bilder"
|
||||
fonts = "Schriftarten"
|
||||
formFields = "Formularfelder"
|
||||
embeddedFiles = "Eingebettete Dateien"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Ebenen"
|
||||
bookmarks = "Lesezeichen"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "ein unbenanntes Dokument"
|
||||
unknown = "Unbekannter Autor"
|
||||
text = "Dies ist ein {{pages}}-seitiges PDF mit dem Titel {{title}}, erstellt von {{author}} (PDF-Version {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Einige Dateien konnten nicht verarbeitet werden."
|
||||
unexpected = "Unerwarteter Fehler während der Extraktion."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extraktion abgeschlossen"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrahieren,seite"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Jetzt upgraden →"
|
||||
freeTitle = "Server-Lizenz"
|
||||
overLimitTitle = "Server-Lizenz erforderlich"
|
||||
overLimitBody = "Unsere Lizenz erlaubt bis zu <strong>{{freeTierLimit}}</strong> Nutzer pro Server kostenlos. Sie haben <strong>{{overLimitUserCopy}}</strong> Stirling-Nutzer. Um ohne Unterbrechung fortzufahren, upgraden Sie auf den Stirling-Server-Plan – <strong>unbegrenzte Plätze</strong>, PDF-Textbearbeitung und volle Admin-Kontrolle für $99/Server/Monat."
|
||||
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."
|
||||
freeBody = "Unsere <strong>Open-Core</strong>-Lizenz erlaubt bis zu <strong>{{freeTierLimit}}</strong> Nutzer pro Server kostenlos. Für unterbrechungsfreies Skalieren und frühen Zugriff auf unser neues <strong>PDF-Textbearbeitungs-Tool</strong> empfehlen wir den Stirling-Server-Plan – volle Bearbeitung und <strong>unbegrenzte Plätze</strong> für $99/Server/Monat."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5367,31 +5282,6 @@ error = "Benutzerstatus konnte nicht aktualisiert werden"
|
||||
success = "Benutzer erfolgreich gelöscht"
|
||||
error = "Benutzer konnte nicht gelöscht werden"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Passwort ändern"
|
||||
title = "Passwort ändern"
|
||||
subtitle = "Passwort aktualisieren für"
|
||||
newPassword = "Neues Passwort"
|
||||
confirmPassword = "Passwort bestätigen"
|
||||
placeholder = "Neues Passwort eingeben"
|
||||
confirmPlaceholder = "Neues Passwort erneut eingeben"
|
||||
passwordRequired = "Bitte geben Sie ein neues Passwort ein"
|
||||
passwordMismatch = "Passwörter stimmen nicht überein"
|
||||
generateRandom = "Sicheres Passwort generieren"
|
||||
generatedPreview = "Generiertes Passwort:"
|
||||
copyTooltip = "In Zwischenablage kopieren"
|
||||
copiedToClipboard = "Passwort in die Zwischenablage kopiert"
|
||||
copyFailed = "Kopieren des Passworts fehlgeschlagen"
|
||||
sendEmail = "Den Benutzer per E-Mail über diese Änderung informieren"
|
||||
includePassword = "Neues Passwort in die E-Mail aufnehmen"
|
||||
forcePasswordChange = "Benutzer zwingen, das Passwort bei der nächsten Anmeldung zu ändern"
|
||||
emailUnavailable = "Die E-Mail-Adresse dieses Benutzers ist keine gültige E-Mail-Adresse. Benachrichtigungen sind deaktiviert."
|
||||
smtpDisabled = "E-Mail-Benachrichtigungen erfordern, dass SMTP in den Einstellungen aktiviert ist."
|
||||
notifyOnly = "Es wird eine E-Mail ohne das Passwort gesendet, die den Benutzer darüber informiert, dass ein Admin es geändert hat."
|
||||
submit = "Passwort aktualisieren"
|
||||
success = "Passwort erfolgreich aktualisiert"
|
||||
error = "Aktualisieren des Passworts fehlgeschlagen"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-Mail-Einladung"
|
||||
description = "Geben Sie unten E-Mails ein oder fügen Sie sie ein, getrennt durch Kommas. Benutzer erhalten Anmeldedaten per E-Mail."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Mit Ihrem Stirling-Konto anmelden"
|
||||
[setup.selfhosted]
|
||||
title = "Am Server anmelden"
|
||||
subtitle = "Geben Sie Ihre Server-Anmeldedaten ein"
|
||||
link = "oder mit einem selbstgehosteten Konto verbinden"
|
||||
|
||||
[setup.server]
|
||||
title = "Mit Server verbinden"
|
||||
@@ -5944,14 +5833,6 @@ description = "Geben Sie die vollständige URL Ihres selbst gehosteten Stirling
|
||||
emptyUrl = "Bitte eine Server-URL eingeben"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Anmeldung nicht aktiviert"
|
||||
body = "Auf diesem Server ist die Anmeldung nicht aktiviert. Um eine Verbindung zu diesem Server herzustellen, müssen Sie die Authentifizierung aktivieren:"
|
||||
step1 = "Setzen Sie DOCKER_ENABLE_SECURITY=true in Ihrer Umgebung"
|
||||
step2 = "Oder setzen Sie security.enableLogin=true in der settings.yml"
|
||||
step3 = "Starten Sie den Server neu"
|
||||
|
||||
[setup.login]
|
||||
title = "Anmelden"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Früher Zugriff"
|
||||
reset = "Änderungen zurücksetzen"
|
||||
downloadJson = "JSON herunterladen"
|
||||
generatePdf = "PDF generieren"
|
||||
saveChanges = "Änderungen speichern"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Text automatisch in Rahmen einpassen"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Dieser Alpha-Viewer entwickelt sich noch weiter – bestimmte Schriften
|
||||
[pdfTextEditor.empty]
|
||||
title = "Kein Dokument geladen"
|
||||
subtitle = "Laden Sie eine PDF- oder JSON-Datei, um mit der Textbearbeitung zu beginnen."
|
||||
dropzone = "Ziehen Sie eine PDF- oder JSON-Datei hierher, oder klicken Sie zum Durchsuchen"
|
||||
dropzoneWithFiles = "Wählen Sie eine Datei auf der Registerkarte Dateien aus oder ziehen Sie eine PDF- oder JSON-Datei hierher, oder klicken Sie zum Durchsuchen"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Willkommen beim PDF-Texteditor (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Λήψη πληροφοριών PDF"
|
||||
header = "Λήψη πληροφοριών PDF"
|
||||
submit = "Λήψη πληροφοριών"
|
||||
downloadJson = "Λήψη JSON"
|
||||
processing = "Εξαγωγή πληροφοριών..."
|
||||
results = "Αποτελέσματα"
|
||||
noResults = "Εκτελέστε το εργαλείο για να δημιουργήσετε αναφορά."
|
||||
downloads = "Λήψεις"
|
||||
noneDetected = "Δεν εντοπίστηκε κανένα"
|
||||
indexTitle = "Ευρετήριο"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Πλήρης σύνοψη πληροφοριών"
|
||||
shortTitle = "Πληροφορίες PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Μεταδεδομένα"
|
||||
formFields = "Πεδία φόρμας"
|
||||
basicInfo = "Βασικές πληροφορίες"
|
||||
documentInfo = "Πληροφορίες εγγράφου"
|
||||
compliance = "Συμμόρφωση"
|
||||
encryption = "Κρυπτογράφηση"
|
||||
permissions = "Δικαιώματα"
|
||||
other = "Άλλα"
|
||||
perPageInfo = "Πληροφορίες ανά σελίδα"
|
||||
tableOfContents = "Πίνακας περιεχομένων"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Συνημμένα"
|
||||
embeddedFiles = "Ενσωματωμένα αρχεία"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Επίπεδα"
|
||||
structureTree = "Δέντρο δομής"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Μέγεθος"
|
||||
annotations = "Επισημειώσεις"
|
||||
images = "Εικόνες"
|
||||
links = "Σύνδεσμοι"
|
||||
fonts = "Γραμματοσειρές"
|
||||
xobjects = "Πλήθος XObject"
|
||||
multimedia = "Πολυμέσα"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Σελίδες"
|
||||
fileSize = "Μέγεθος αρχείου"
|
||||
pdfVersion = "Έκδοση PDF"
|
||||
language = "Γλώσσα"
|
||||
title = "Σύνοψη PDF"
|
||||
author = "Συγγραφέας"
|
||||
created = "Δημιουργήθηκε"
|
||||
modified = "Τροποποιήθηκε"
|
||||
permsAll = "Όλα τα δικαιώματα επιτρέπονται"
|
||||
permsRestricted = "{{count}} περιορισμοί"
|
||||
permsMixed = "Ορισμένα δικαιώματα είναι περιορισμένα"
|
||||
hasCompliance = "Διαθέτει πρότυπα συμμόρφωσης"
|
||||
noCompliance = "Χωρίς πρότυπα συμμόρφωσης"
|
||||
basic = "Βασικές πληροφορίες"
|
||||
documentInfo = "Πληροφορίες εγγράφου"
|
||||
securityTitle = "Κατάσταση ασφάλειας"
|
||||
technical = "Τεχνικά"
|
||||
overviewTitle = "Επισκόπηση PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Κρυπτογραφημένο PDF - Υπάρχει προστασία με κωδικό πρόσβασης"
|
||||
unencrypted = "Μη κρυπτογραφημένο PDF - Χωρίς προστασία με κωδικό πρόσβασης"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Εικόνες"
|
||||
fonts = "Γραμματοσειρές"
|
||||
formFields = "Πεδία φόρμας"
|
||||
embeddedFiles = "Ενσωματωμένα αρχεία"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Επίπεδα"
|
||||
bookmarks = "Σελιδοδείκτες"
|
||||
multimedia = "Πολυμέσα"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "ένα έγγραφο χωρίς τίτλο"
|
||||
unknown = "Άγνωστος συγγραφέας"
|
||||
text = "Πρόκειται για ένα PDF {{pages}} σελίδων με τίτλο {{title}} που δημιουργήθηκε από τον/την {{author}} (έκδοση PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Δεν ήταν δυνατή η επεξεργασία ορισμένων αρχείων."
|
||||
unexpected = "Μη αναμενόμενο σφάλμα κατά την εξαγωγή."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Η εξαγωγή ολοκληρώθηκε"
|
||||
|
||||
[extractPage]
|
||||
tags = "εξαγωγή"
|
||||
@@ -3875,7 +3790,7 @@ version = "Τρέχουσα έκδοση"
|
||||
title = "Τεκμηρίωση API"
|
||||
header = "Τεκμηρίωση API"
|
||||
desc = "Προβάλετε και δοκιμάστε τα endpoints του Stirling PDF API"
|
||||
tags = "api,τεκμηρίωση,swagger,τελικά σημεία,ανάπτυξη"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Πώς χρησιμοποιούμε τα cookies"
|
||||
@@ -4567,7 +4482,7 @@ label = "Ενεργοποίηση προσκλήσεων μέσω email"
|
||||
description = "Να επιτρέπεται στους διαχειριστές να προσκαλούν χρήστες μέσω email με αυτόματα παραγόμενους κωδικούς"
|
||||
|
||||
[admin.settings.mail.frontendUrl]
|
||||
label = "URL front-end"
|
||||
label = "Frontend URL"
|
||||
description = "Βασικό URL για το frontend (π.χ. https://pdf.example.com). Χρησιμοποιείται για τη δημιουργία συνδέσμων πρόσκλησης στα email. Αφήστε κενό για χρήση του backend URL."
|
||||
|
||||
[admin.settings.legal]
|
||||
@@ -5262,7 +5177,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> χρήστες δωρεάν ανά διακομιστή. Για απρόσκοπτη κλιμάκωση, προτείνουμε το πλάνο Stirling Server - <strong>απεριόριστες θέσεις</strong> και <strong>υποστήριξη SSO</strong> με $99/διακομιστή/μήνα."
|
||||
freeBody = "Η αδειοδότηση <strong>Open-Core</strong> μας επιτρέπει έως <strong>{{freeTierLimit}}</strong> χρήστες δωρεάν ανά διακομιστή. Για απρόσκοπτη κλιμάκωση και έγκαιρη πρόσβαση στο νέο <strong>εργαλείο επεξεργασίας κειμένου PDF</strong>, προτείνουμε το πλάνο Stirling Server - πλήρης επεξεργασία και <strong>απεριόριστες θέσεις</strong> για $99/server/μήνα."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Λήψη"
|
||||
@@ -5367,31 +5282,6 @@ error = "Αποτυχία ενημέρωσης κατάστασης χρήστη
|
||||
success = "Ο χρήστης διαγράφηκε με επιτυχία"
|
||||
error = "Αποτυχία διαγραφής χρήστη"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Αλλαγή κωδικού πρόσβασης"
|
||||
title = "Αλλαγή κωδικού πρόσβασης"
|
||||
subtitle = "Ενημέρωση κωδικού πρόσβασης για"
|
||||
newPassword = "Νέος κωδικός πρόσβασης"
|
||||
confirmPassword = "Επιβεβαίωση κωδικού πρόσβασης"
|
||||
placeholder = "Εισαγάγετε νέο κωδικό πρόσβασης"
|
||||
confirmPlaceholder = "Εισαγάγετε ξανά τον νέο κωδικό πρόσβασης"
|
||||
passwordRequired = "Παρακαλούμε εισαγάγετε νέο κωδικό πρόσβασης"
|
||||
passwordMismatch = "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
|
||||
generateRandom = "Δημιουργία ασφαλούς κωδικού πρόσβασης"
|
||||
generatedPreview = "Δημιουργημένος κωδικός πρόσβασης:"
|
||||
copyTooltip = "Αντιγραφή στο πρόχειρο"
|
||||
copiedToClipboard = "Ο κωδικός πρόσβασης αντιγράφηκε στο πρόχειρο"
|
||||
copyFailed = "Αποτυχία αντιγραφής κωδικού πρόσβασης"
|
||||
sendEmail = "Αποστολή email στον χρήστη για αυτήν την αλλαγή"
|
||||
includePassword = "Να συμπεριληφθεί ο νέος κωδικός πρόσβασης στο email"
|
||||
forcePasswordChange = "Υποχρεωτική αλλαγή κωδικού πρόσβασης κατά την επόμενη σύνδεση"
|
||||
emailUnavailable = "Το email αυτού του χρήστη δεν είναι έγκυρη διεύθυνση email. Οι ειδοποιήσεις είναι απενεργοποιημένες."
|
||||
smtpDisabled = "Οι ειδοποιήσεις μέσω email απαιτούν την ενεργοποίηση του SMTP στις ρυθμίσεις."
|
||||
notifyOnly = "Θα σταλεί email χωρίς τον κωδικό πρόσβασης, ενημερώνοντας τον χρήστη ότι ένας διαχειριστής τον άλλαξε."
|
||||
submit = "Ενημέρωση κωδικού πρόσβασης"
|
||||
success = "Ο κωδικός πρόσβασης ενημερώθηκε με επιτυχία"
|
||||
error = "Αποτυχία ενημέρωσης κωδικού πρόσβασης"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Πρόσκληση μέσω Email"
|
||||
description = "Πληκτρολογήστε ή επικολλήστε emails παρακάτω, χωρισμένα με κόμμα. Οι χρήστες θα λάβουν στοιχεία σύνδεσης μέσω email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Συνδεθείτε με τον λογαριασμό Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Σύνδεση στον διακομιστή"
|
||||
subtitle = "Εισαγάγετε τα διαπιστευτήρια του διακομιστή σας"
|
||||
link = "ή συνδεθείτε σε έναν self-hosted λογαριασμό"
|
||||
|
||||
[setup.server]
|
||||
title = "Σύνδεση σε διακομιστή"
|
||||
@@ -5944,14 +5833,6 @@ description = "Εισαγάγετε το πλήρες URL του self-hosted δ
|
||||
emptyUrl = "Εισαγάγετε URL διακομιστή"
|
||||
unreachable = "Αδυναμία σύνδεσης με τον διακομιστή"
|
||||
testFailed = "Αποτυχία ελέγχου σύνδεσης"
|
||||
configFetch = "Αποτυχία ανάκτησης της διαμόρφωσης του διακομιστή. Ελέγξτε το URL και δοκιμάστε ξανά."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Η σύνδεση δεν είναι ενεργοποιημένη"
|
||||
body = "Σε αυτόν τον διακομιστή δεν είναι ενεργοποιημένη η σύνδεση. Για να συνδεθείτε σε αυτόν τον διακομιστή, πρέπει να ενεργοποιήσετε τον έλεγχο ταυτότητας:"
|
||||
step1 = "Ορίστε το DOCKER_ENABLE_SECURITY=true στο περιβάλλον σας"
|
||||
step2 = "Ή ορίστε security.enableLogin=true στο settings.yml"
|
||||
step3 = "Επανεκκινήστε τον διακομιστή"
|
||||
|
||||
[setup.login]
|
||||
title = "Σύνδεση"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Πρόωρη πρόσβαση"
|
||||
reset = "Επαναφορά αλλαγών"
|
||||
downloadJson = "Λήψη JSON"
|
||||
generatePdf = "Δημιουργία PDF"
|
||||
saveChanges = "Αποθήκευση αλλαγών"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Αυτόματη προσαρμογή κειμένου στα πλαίσια"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Αυτός ο προβολέας άλφα εξελίσσεται ακό
|
||||
[pdfTextEditor.empty]
|
||||
title = "Δεν φορτώθηκε έγγραφο"
|
||||
subtitle = "Φορτώστε ένα αρχείο PDF ή JSON για να ξεκινήσετε την επεξεργασία κειμένου."
|
||||
dropzone = "Σύρετε και αποθέστε εδώ ένα αρχείο PDF ή JSON, ή κάντε κλικ για περιήγηση"
|
||||
dropzoneWithFiles = "Επιλέξτε ένα αρχείο από την καρτέλα Αρχεία, ή σύρετε και αποθέστε εδώ ένα αρχείο PDF ή JSON, ή κάντε κλικ για περιήγηση"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Καλώς ορίσατε στο PDF Text Editor (Πρώιμη πρόσβαση)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Get Info on PDF"
|
||||
header = "Get Info on PDF"
|
||||
submit = "Get Info"
|
||||
downloadJson = "Download JSON"
|
||||
processing = "Extracting information..."
|
||||
results = "Results"
|
||||
noResults = "Run the tool to generate a report."
|
||||
downloads = "Downloads"
|
||||
noneDetected = "None detected"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Full information summary"
|
||||
shortTitle = "PDF Information"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Form Fields"
|
||||
basicInfo = "Basic Info"
|
||||
documentInfo = "Document Info"
|
||||
compliance = "Compliance"
|
||||
encryption = "Encryption"
|
||||
permissions = "Permissions"
|
||||
other = "Other"
|
||||
perPageInfo = "Per Page Info"
|
||||
tableOfContents = "Table of Contents"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Attachments"
|
||||
embeddedFiles = "Embedded Files"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Layers"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Size"
|
||||
annotations = "Annotations"
|
||||
images = "Images"
|
||||
links = "Links"
|
||||
fonts = "Fonts"
|
||||
xobjects = "XObject Counts"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pages"
|
||||
fileSize = "File Size"
|
||||
pdfVersion = "PDF Version"
|
||||
language = "Language"
|
||||
title = "PDF Summary"
|
||||
author = "Author"
|
||||
created = "Created"
|
||||
modified = "Modified"
|
||||
permsAll = "All Permissions Allowed"
|
||||
permsRestricted = "{{count}} restrictions"
|
||||
permsMixed = "Some permissions restricted"
|
||||
hasCompliance = "Has compliance standards"
|
||||
noCompliance = "No Compliance Standards"
|
||||
basic = "Basic Information"
|
||||
documentInfo = "Document Information"
|
||||
securityTitle = "Security Status"
|
||||
technical = "Technical"
|
||||
overviewTitle = "PDF Overview"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Encrypted PDF - Password protection present"
|
||||
unencrypted = "Unencrypted PDF - No password protection"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Images"
|
||||
fonts = "Fonts"
|
||||
formFields = "Form Fields"
|
||||
embeddedFiles = "Embedded Files"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Layers"
|
||||
bookmarks = "Bookmarks"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "an untitled document"
|
||||
unknown = "Unknown Author"
|
||||
text = "This is a {{pages}}-page PDF titled {{title}} created by {{author}} (PDF version {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Some files could not be processed."
|
||||
unexpected = "Unexpected error during extraction."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extraction complete"
|
||||
|
||||
[extractPage]
|
||||
tags = "extract"
|
||||
@@ -3539,8 +3454,8 @@ signinTitle = "Please sign in"
|
||||
ssoSignIn = "Login via Single Sign-on"
|
||||
oAuth2AutoCreateDisabled = "OAUTH2 Auto-Create User Disabled"
|
||||
oAuth2AdminBlockedUser = "Registration or logging in of non-registered users is currently blocked. Please contact the administrator."
|
||||
oAuth2RequiresLicense = "OAuth/SSO login requires a Server or Enterprise license. Please contact the administrator to upgrade your plan."
|
||||
saml2RequiresLicense = "SAML login requires an Enterprise license. Please contact the administrator to upgrade your plan."
|
||||
oAuth2RequiresLicense = "OAuth/SSO login requires a paid license (Server or Enterprise). Please contact the administrator to upgrade your plan."
|
||||
saml2RequiresLicense = "SAML login requires a paid license (Server or Enterprise). Please contact the administrator to upgrade your plan."
|
||||
maxUsersReached = "Maximum number of users reached for your current license. Please contact the administrator to upgrade your plan or add more seats."
|
||||
oauth2RequestNotFound = "Authorization request not found"
|
||||
oauth2InvalidUserInfoResponse = "Invalid User Info Response"
|
||||
@@ -5263,7 +5178,7 @@ upgrade = "Upgrade now →"
|
||||
freeTitle = "Server License"
|
||||
overLimitTitle = "Server License Needed"
|
||||
overLimitBody = "Our licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. You have <strong>{{overLimitUserCopy}}</strong> Stirling users. To continue uninterrupted, upgrade to the Stirling Server plan - <strong>unlimited seats</strong>, PDF text editing, and full admin control for $99/server/mo."
|
||||
freeBody = "Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. To scale uninterrupted, we recommend the Stirling Server plan - <strong>unlimited seats</strong> and <strong>SSO support</strong> for $99/server/mo."
|
||||
freeBody = "Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. To scale uninterrupted and get early access to our new <strong>PDF text editing tool</strong>, we recommend the Stirling Server plan - full editing and <strong>unlimited seats</strong> for $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5368,31 +5283,6 @@ error = "Failed to update user status"
|
||||
success = "User deleted successfully"
|
||||
error = "Failed to delete user"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Change password"
|
||||
title = "Change password"
|
||||
subtitle = "Update the password for"
|
||||
newPassword = "New password"
|
||||
confirmPassword = "Confirm password"
|
||||
placeholder = "Enter a new password"
|
||||
confirmPlaceholder = "Re-enter the new password"
|
||||
passwordRequired = "Please enter a new password"
|
||||
passwordMismatch = "Passwords do not match"
|
||||
generateRandom = "Generate secure password"
|
||||
generatedPreview = "Generated password:"
|
||||
copyTooltip = "Copy to clipboard"
|
||||
copiedToClipboard = "Password copied to clipboard"
|
||||
copyFailed = "Failed to copy password"
|
||||
sendEmail = "Email the user about this change"
|
||||
includePassword = "Include the new password in the email"
|
||||
forcePasswordChange = "Force user to change password on next login"
|
||||
emailUnavailable = "This user's email is not a valid email address. Notifications are disabled."
|
||||
smtpDisabled = "Email notifications require SMTP to be enabled in settings."
|
||||
notifyOnly = "An email will be sent without the password, letting the user know an admin changed it."
|
||||
submit = "Update password"
|
||||
success = "Password updated successfully"
|
||||
error = "Failed to update password"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Email Invite"
|
||||
description = "Type or paste in emails below, separated by commas. Users will receive login credentials via email."
|
||||
@@ -5569,28 +5459,6 @@ contactSales = "Contact Sales"
|
||||
contactToUpgrade = "Contact us to upgrade or customize your plan"
|
||||
maxUsers = "Max Users"
|
||||
upTo = "Up to"
|
||||
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 = "month"
|
||||
@@ -5948,7 +5816,6 @@ subtitle = "Sign in with your Stirling account"
|
||||
[setup.selfhosted]
|
||||
title = "Sign in to Server"
|
||||
subtitle = "Enter your server credentials"
|
||||
link = "or connect to a self-hosted account"
|
||||
|
||||
[setup.server]
|
||||
title = "Connect to Server"
|
||||
@@ -5967,14 +5834,6 @@ description = "Enter the full URL of your self-hosted Stirling PDF server"
|
||||
emptyUrl = "Please enter a server URL"
|
||||
unreachable = "Could not connect to server"
|
||||
testFailed = "Connection test failed"
|
||||
configFetch = "Failed to fetch server configuration. Please check the URL and try again."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Login Not Enabled"
|
||||
body = "This server does not have login enabled. To connect to this server, you must enable authentication:"
|
||||
step1 = "Set DOCKER_ENABLE_SECURITY=true in your environment"
|
||||
step2 = "Or set security.enableLogin=true in settings.yml"
|
||||
step3 = "Restart the server"
|
||||
|
||||
[setup.login]
|
||||
title = "Sign In"
|
||||
@@ -6047,7 +5906,6 @@ earlyAccess = "Early Access"
|
||||
reset = "Reset Changes"
|
||||
downloadJson = "Download JSON"
|
||||
generatePdf = "Generate PDF"
|
||||
saveChanges = "Save Changes"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Auto-scale text to fit boxes"
|
||||
@@ -6085,8 +5943,6 @@ alpha = "This alpha viewer is still evolving—certain fonts, colours, transpare
|
||||
[pdfTextEditor.empty]
|
||||
title = "No document loaded"
|
||||
subtitle = "Load a PDF or JSON file to begin editing text content."
|
||||
dropzone = "Drag and drop a PDF or JSON file here, or click to browse"
|
||||
dropzoneWithFiles = "Select a file from the Files tab, or drag and drop a PDF or JSON file here, or click to browse"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Welcome to PDF Text Editor (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Obtener Información del PDF"
|
||||
header = "Obtener Información del PDF"
|
||||
submit = "Obtener Información"
|
||||
downloadJson = "Descargar JSON"
|
||||
processing = "Extrayendo información..."
|
||||
results = "Resultados"
|
||||
noResults = "Ejecute la herramienta para generar un informe."
|
||||
downloads = "Descargas"
|
||||
noneDetected = "Ninguno detectado"
|
||||
indexTitle = "Índice"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Resumen completo de información"
|
||||
shortTitle = "Información del PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadatos"
|
||||
formFields = "Campos de formulario"
|
||||
basicInfo = "Información básica"
|
||||
documentInfo = "Información del documento"
|
||||
compliance = "Conformidad"
|
||||
encryption = "Cifrado"
|
||||
permissions = "Permisos"
|
||||
other = "Otros"
|
||||
perPageInfo = "Información por página"
|
||||
tableOfContents = "Tabla de contenidos"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Adjuntos"
|
||||
embeddedFiles = "Archivos incrustados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Capas"
|
||||
structureTree = "Árbol de estructura"
|
||||
xmp = "Metadatos XMP"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Tamaño"
|
||||
annotations = "Anotaciones"
|
||||
images = "Imágenes"
|
||||
links = "Enlaces"
|
||||
fonts = "Fuentes"
|
||||
xobjects = "Recuento de XObject"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Páginas"
|
||||
fileSize = "Tamaño del archivo"
|
||||
pdfVersion = "Versión de PDF"
|
||||
language = "Idioma"
|
||||
title = "Resumen del PDF"
|
||||
author = "Autor"
|
||||
created = "Creado"
|
||||
modified = "Modificado"
|
||||
permsAll = "Todos los permisos permitidos"
|
||||
permsRestricted = "{{count}} restricciones"
|
||||
permsMixed = "Algunos permisos restringidos"
|
||||
hasCompliance = "Cumple con estándares"
|
||||
noCompliance = "Sin estándares de conformidad"
|
||||
basic = "Información básica"
|
||||
documentInfo = "Información del documento"
|
||||
securityTitle = "Estado de seguridad"
|
||||
technical = "Técnico"
|
||||
overviewTitle = "Vista general del PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF cifrado: protección con contraseña presente"
|
||||
unencrypted = "PDF sin cifrar: sin protección con contraseña"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Imágenes"
|
||||
fonts = "Fuentes"
|
||||
formFields = "Campos de formulario"
|
||||
embeddedFiles = "Archivos incrustados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Capas"
|
||||
bookmarks = "Marcadores"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "un documento sin título"
|
||||
unknown = "Autor desconocido"
|
||||
text = "Este es un PDF de {{pages}} páginas titulado {{title}} creado por {{author}} (versión de PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Algunos archivos no se pudieron procesar."
|
||||
unexpected = "Error inesperado durante la extracción."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extracción completada"
|
||||
|
||||
[extractPage]
|
||||
tags = "extraer"
|
||||
@@ -5262,7 +5177,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, recomendamos el plan Stirling Server - <strong>plazas ilimitadas</strong> y <strong>soporte SSO</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 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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Descargar"
|
||||
@@ -5367,31 +5282,6 @@ error = "No se pudo actualizar el estado del usuario"
|
||||
success = "Usuario eliminado correctamente"
|
||||
error = "No se pudo eliminar el usuario"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Cambiar contraseña"
|
||||
title = "Cambiar contraseña"
|
||||
subtitle = "Actualizar la contraseña de"
|
||||
newPassword = "Nueva contraseña"
|
||||
confirmPassword = "Confirmar contraseña"
|
||||
placeholder = "Introduzca una nueva contraseña"
|
||||
confirmPlaceholder = "Vuelva a introducir la nueva contraseña"
|
||||
passwordRequired = "Introduzca una nueva contraseña"
|
||||
passwordMismatch = "Las contraseñas no coinciden"
|
||||
generateRandom = "Generar contraseña segura"
|
||||
generatedPreview = "Contraseña generada:"
|
||||
copyTooltip = "Copiar al portapapeles"
|
||||
copiedToClipboard = "Contraseña copiada al portapapeles"
|
||||
copyFailed = "Error al copiar la contraseña"
|
||||
sendEmail = "Enviar un correo al usuario sobre este cambio"
|
||||
includePassword = "Incluir la nueva contraseña en el correo"
|
||||
forcePasswordChange = "Obligar al usuario a cambiar la contraseña en el próximo inicio de sesión"
|
||||
emailUnavailable = "El correo de este usuario no es una dirección válida. Las notificaciones están desactivadas."
|
||||
smtpDisabled = "Las notificaciones por correo requieren que SMTP esté habilitado en la configuración."
|
||||
notifyOnly = "Se enviará un correo sin la contraseña, informando al usuario de que un administrador la cambió."
|
||||
submit = "Actualizar contraseña"
|
||||
success = "Contraseña actualizada correctamente"
|
||||
error = "No se pudo actualizar la contraseña"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
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."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Inicie sesión con su cuenta de Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Inicie sesión en el servidor"
|
||||
subtitle = "Introduzca las credenciales de su servidor"
|
||||
link = "o conectarse a una cuenta autoalojada"
|
||||
|
||||
[setup.server]
|
||||
title = "Conectar con el servidor"
|
||||
@@ -5944,14 +5833,6 @@ description = "Introduzca la URL completa de su servidor autoalojado de Stirling
|
||||
emptyUrl = "Introduzca una URL de servidor"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Inicio de sesión no habilitado"
|
||||
body = "Este servidor no tiene habilitado el inicio de sesión. Para conectarse a este servidor, debe habilitar la autenticación:"
|
||||
step1 = "Establezca DOCKER_ENABLE_SECURITY=true en su entorno"
|
||||
step2 = "O establezca security.enableLogin=true en settings.yml"
|
||||
step3 = "Reinicie el servidor"
|
||||
|
||||
[setup.login]
|
||||
title = "Iniciar sesión"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Acceso anticipado"
|
||||
reset = "Restablecer cambios"
|
||||
downloadJson = "Descargar JSON"
|
||||
generatePdf = "Generar PDF"
|
||||
saveChanges = "Guardar cambios"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Escalar texto automáticamente para ajustar a las cajas"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Este visor alfa sigue evolucionando: ciertas fuentes, colores, efectos
|
||||
[pdfTextEditor.empty]
|
||||
title = "Ningún documento cargado"
|
||||
subtitle = "Carga un archivo PDF o JSON para empezar a editar el contenido de texto."
|
||||
dropzone = "Arrastre y suelte un archivo PDF o JSON aquí, o haga clic para explorar"
|
||||
dropzoneWithFiles = "Seleccione un archivo de la pestaña Archivos, o arrastre y suelte un archivo PDF o JSON aquí, o haga clic para explorar"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Bienvenido a PDF Text Editor (Acceso anticipado)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Lortu informazioa PDFn"
|
||||
header = "Lortu informazioa PDFn"
|
||||
submit = "Lortu informazioa"
|
||||
downloadJson = "Deskargatu JSON"
|
||||
processing = "Informazioa erauzten..."
|
||||
results = "Emaitzak"
|
||||
noResults = "Exekutatu tresna txosten bat sortzeko."
|
||||
downloads = "Deskargak"
|
||||
noneDetected = "Ez da ezer detektatu"
|
||||
indexTitle = "Indizea"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Informazio osoaren laburpena"
|
||||
shortTitle = "PDFren informazioa"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadatuak"
|
||||
formFields = "Inprimaki-eremuak"
|
||||
basicInfo = "Oinarrizko informazioa"
|
||||
documentInfo = "Dokumentuaren informazioa"
|
||||
compliance = "Arauen betetzea"
|
||||
encryption = "Zifratzea"
|
||||
permissions = "Baimenak"
|
||||
other = "Bestelakoak"
|
||||
perPageInfo = "Orrialdeko informazioa"
|
||||
tableOfContents = "Aurkibidea"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Eranskinak"
|
||||
embeddedFiles = "Txertatutako fitxategiak"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Geruzak"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Tamaina"
|
||||
annotations = "Anotazioak"
|
||||
images = "Irudiak"
|
||||
links = "Estekak"
|
||||
fonts = "Letra-tipoak"
|
||||
xobjects = "XObject kopuruak"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Orriak"
|
||||
fileSize = "Fitxategi-tamaina"
|
||||
pdfVersion = "PDF bertsioa"
|
||||
language = "Hizkuntza"
|
||||
title = "PDFren laburpena"
|
||||
author = "Egilea"
|
||||
created = "Sortua"
|
||||
modified = "Aldatua"
|
||||
permsAll = "Baimen guztiak baimenduta"
|
||||
permsRestricted = "{{count}} murrizketa"
|
||||
permsMixed = "Zenbait baimen murriztuta"
|
||||
hasCompliance = "Betetze-estandarrak ditu"
|
||||
noCompliance = "Ez dago betetze-estandarrik"
|
||||
basic = "Oinarrizko informazioa"
|
||||
documentInfo = "Dokumentuaren informazioa"
|
||||
securityTitle = "Segurtasun-egoera"
|
||||
technical = "Teknikoa"
|
||||
overviewTitle = "PDFren ikuspegi orokorra"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Zifratutako PDFa - Pasahitz-babesa dago"
|
||||
unencrypted = "Zifratu gabeko PDFa - Ez dago pasahitz-babesik"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Irudiak"
|
||||
fonts = "Letra-tipoak"
|
||||
formFields = "Inprimaki-eremuak"
|
||||
embeddedFiles = "Txertatutako fitxategiak"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Geruzak"
|
||||
bookmarks = "Laster-markak"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "izenbururik gabeko dokumentu bat"
|
||||
unknown = "Egile ezezaguna"
|
||||
text = "Hau {{pages}} orrialdeko PDF bat da; izenburua: {{title}}, egilea: {{author}} (PDF bertsioa: {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Fitxategi batzuk ezin izan dira prozesatu."
|
||||
unexpected = "Ustekabeko errorea erauzketan zehar."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Erau zketa amaituta"
|
||||
|
||||
[extractPage]
|
||||
tags = "erauzi"
|
||||
@@ -5262,7 +5177,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 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Deskargatu"
|
||||
@@ -5367,31 +5282,6 @@ error = "Ezin izan da erabiltzailearen egoera eguneratu"
|
||||
success = "Erabiltzailea ongi ezabatu da"
|
||||
error = "Ezin izan da erabiltzailea ezabatu"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Pasahitza aldatu"
|
||||
title = "Pasahitza aldatu"
|
||||
subtitle = "Honetarako pasahitza eguneratu"
|
||||
newPassword = "Pasahitz berria"
|
||||
confirmPassword = "Berretsi pasahitza"
|
||||
placeholder = "Sartu pasahitz berria"
|
||||
confirmPlaceholder = "Sartu berriro pasahitz berria"
|
||||
passwordRequired = "Sartu pasahitz berria"
|
||||
passwordMismatch = "Pasahitzak ez datoz bat"
|
||||
generateRandom = "Sortu pasahitz segurua"
|
||||
generatedPreview = "Sortutako pasahitza:"
|
||||
copyTooltip = "Kopiatu arbelera"
|
||||
copiedToClipboard = "Pasahitza arbelera kopiatu da"
|
||||
copyFailed = "Pasahitza kopiatzeak huts egin du"
|
||||
sendEmail = "Bidali mezu elektronikoa erabiltzaileari aldaketa honi buruz"
|
||||
includePassword = "Sartu pasahitz berria mezu elektronikoan"
|
||||
forcePasswordChange = "Behartu erabiltzailea hurrengo saio-hasieran pasahitza aldatzera"
|
||||
emailUnavailable = "Erabiltzaile honen helbide elektronikoa ez da baliozkoa. Jakinarazpenak desgaituta daude."
|
||||
smtpDisabled = "Posta elektroniko bidezko jakinarazpenek SMTP gaituta egotea eskatzen dute ezarpenetan."
|
||||
notifyOnly = "Pasahitzik gabe bidaliko da mezu elektronikoa; erabiltzaileari jakinaraziko zaio administratzaile batek aldatu duela."
|
||||
submit = "Eguneratu pasahitza"
|
||||
success = "Pasahitza ongi eguneratu da"
|
||||
error = "Pasahitza eguneratzeak huts egin du"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-posta bidezko gonbidapena"
|
||||
description = "Idatzi edo itsatsi behean helbide elektronikoak, komaz bereizita. Erabiltzaileek saio-hasierako kredentzialak e-postaz jasoko dituzte."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Hasi saioa zure Stirling kontuarekin"
|
||||
[setup.selfhosted]
|
||||
title = "Hasi saioa zerbitzarian"
|
||||
subtitle = "Sartu zure zerbitzariaren kredentzialak"
|
||||
link = "edo konektatu autoostatutako kontu batera"
|
||||
|
||||
[setup.server]
|
||||
title = "Konektatu zerbitzarira"
|
||||
@@ -5944,14 +5833,6 @@ description = "Sartu zure auto-ostatuko Stirling PDF zerbitzariaren URLa osoa"
|
||||
emptyUrl = "Sartu zerbitzari baten URLa"
|
||||
unreachable = "Ezin izan da zerbitzarira konektatu"
|
||||
testFailed = "Konexio proba huts egin du"
|
||||
configFetch = "Ezin izan da zerbitzariaren konfigurazioa eskuratu. Egiaztatu URLa eta saiatu berriro."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Saio-hasiera ez dago gaituta"
|
||||
body = "Zerbitzari honek ez du saio-hasiera gaituta. Zerbitzari honekin konektatzeko, autentifikazioa gaitu behar duzu:"
|
||||
step1 = "Ezarri DOCKER_ENABLE_SECURITY=true zure ingurunean"
|
||||
step2 = "Edo ezarri security.enableLogin=true settings.yml fitxategian"
|
||||
step3 = "Berrabiarazi zerbitzaria"
|
||||
|
||||
[setup.login]
|
||||
title = "Hasi saioa"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Sarbide goiztiarra"
|
||||
reset = "Aldaketak berrezarri"
|
||||
downloadJson = "JSON deskargatu"
|
||||
generatePdf = "PDF sortu"
|
||||
saveChanges = "Gorde aldaketak"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Testua automatikoki eskalatu kutxetara egokitzeko"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ikusle alfa hau oraindik eboluzioan dago—zenbait letra-tipo, kolore,
|
||||
[pdfTextEditor.empty]
|
||||
title = "Ez da dokumenturik kargatu"
|
||||
subtitle = "Kargatu PDF edo JSON fitxategi bat testu-edukia editatzen hasteko."
|
||||
dropzone = "Arrastatu eta jaregin PDF edo JSON fitxategi bat hemen, edo egin klik arakatzeko"
|
||||
dropzoneWithFiles = "Hautatu fitxategi bat Fitxategiak fitxatik, edo arrastatu eta jaregin PDF edo JSON fitxategi bat hemen, edo egin klik arakatzeko"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Ongi etorri PDF Text Editor-era (Sarbide goiztiarra)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "اطلاعات PDF را دریافت کنید"
|
||||
header = "اطلاعات PDF را دریافت کنید"
|
||||
submit = "دریافت اطلاعات"
|
||||
downloadJson = "دانلود JSON"
|
||||
processing = "در حال استخراج اطلاعات..."
|
||||
results = "نتایج"
|
||||
noResults = "برای ایجاد گزارش، ابزار را اجرا کنید."
|
||||
downloads = "دانلودها"
|
||||
noneDetected = "هیچ موردی شناسایی نشد"
|
||||
indexTitle = "نمایه"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "خلاصهٔ کامل اطلاعات"
|
||||
shortTitle = "اطلاعات PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "فراداده"
|
||||
formFields = "فیلدهای فرم"
|
||||
basicInfo = "اطلاعات پایه"
|
||||
documentInfo = "اطلاعات سند"
|
||||
compliance = "انطباق"
|
||||
encryption = "رمزگذاری"
|
||||
permissions = "مجوزها"
|
||||
other = "سایر"
|
||||
perPageInfo = "اطلاعات هر صفحه"
|
||||
tableOfContents = "فهرست مطالب"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "پیوستها"
|
||||
embeddedFiles = "فایلهای جاسازیشده"
|
||||
javaScript = "JavaScript"
|
||||
layers = "لایهها"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "اندازه"
|
||||
annotations = "حاشیهنویسیها"
|
||||
images = "تصاویر"
|
||||
links = "پیوندها"
|
||||
fonts = "فونتها"
|
||||
xobjects = "تعداد XObject"
|
||||
multimedia = "چندرسانهای"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "صفحات"
|
||||
fileSize = "حجم فایل"
|
||||
pdfVersion = "نسخهٔ PDF"
|
||||
language = "زبان"
|
||||
title = "خلاصهٔ PDF"
|
||||
author = "نویسنده"
|
||||
created = "ایجاد شده"
|
||||
modified = "ویرایش شده"
|
||||
permsAll = "همهٔ مجوزها مجاز هستند"
|
||||
permsRestricted = "{{count}} محدودیت"
|
||||
permsMixed = "برخی مجوزها محدود شدهاند"
|
||||
hasCompliance = "دارای استانداردهای انطباق"
|
||||
noCompliance = "بدون استانداردهای انطباق"
|
||||
basic = "اطلاعات پایه"
|
||||
documentInfo = "اطلاعات سند"
|
||||
securityTitle = "وضعیت امنیتی"
|
||||
technical = "فنی"
|
||||
overviewTitle = "نمای کلی PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF رمزگذاریشده - دارای محافظت با گذرواژه"
|
||||
unencrypted = "PDF رمزگذارینشده - بدون محافظت با گذرواژه"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "تصاویر"
|
||||
fonts = "فونتها"
|
||||
formFields = "فیلدهای فرم"
|
||||
embeddedFiles = "فایلهای جاسازیشده"
|
||||
javaScript = "JavaScript"
|
||||
layers = "لایهها"
|
||||
bookmarks = "نشانکها"
|
||||
multimedia = "چندرسانهای"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "یک سند بدون عنوان"
|
||||
unknown = "نویسندهٔ نامشخص"
|
||||
text = "این یک PDF {{pages}} صفحهای با عنوان {{title}} است که توسط {{author}} ایجاد شده است (نسخهٔ PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "برخی فایلها قابل پردازش نبودند."
|
||||
unexpected = "خطای غیرمنتظره هنگام استخراج."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "استخراج کامل شد"
|
||||
|
||||
[extractPage]
|
||||
tags = "استخراج"
|
||||
@@ -4343,11 +4258,11 @@ label = "URL صادرکننده"
|
||||
description = "Issuer URL ارائهدهنده OAuth2"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "شناسهٔ کلاینت"
|
||||
label = "Client ID"
|
||||
description = "Client ID مربوط به OAuth2 از ارائهدهنده شما"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "راز کلاینت"
|
||||
label = "Client Secret"
|
||||
description = "Client Secret مربوط به OAuth2 از ارائهدهنده شما"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -4378,7 +4293,7 @@ label = "ارائهدهنده"
|
||||
description = "نام ارائهدهنده SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.registrationId]
|
||||
label = "شناسهٔ ثبتنام"
|
||||
label = "Registration ID"
|
||||
description = "شناسه ثبتنام SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.autoCreateUser]
|
||||
@@ -5262,7 +5177,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> کاربر را میدهد. برای مقیاسدهی بدون وقفه، طرح Stirling Server را توصیه میکنیم - <strong>تعداد کاربران نامحدود</strong> و <strong>پشتیبانی از SSO</strong> با $99/سرور/ماه."
|
||||
freeBody = "مجوز <strong>Open-Core</strong> ما تا <strong>{{freeTierLimit}}</strong> کاربر رایگان بهازای هر سرور را مجاز میداند. برای مقیاسپذیری بدون وقفه و دسترسی زودهنگام به <strong>ابزار ویرایش متن PDF</strong> جدیدمان، پلن Stirling Server را پیشنهاد میکنیم - ویرایش کامل و <strong>صندلی نامحدود</strong> با 99$ بهازای هر سرور در ماه."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "دانلود"
|
||||
@@ -5367,31 +5282,6 @@ error = "بهروزرسانی وضعیت کاربر ناموفق بود"
|
||||
success = "کاربر با موفقیت حذف شد"
|
||||
error = "حذف کاربر ناموفق بود"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "تغییر گذرواژه"
|
||||
title = "تغییر گذرواژه"
|
||||
subtitle = "بهروزرسانی گذرواژه برای"
|
||||
newPassword = "گذرواژهٔ جدید"
|
||||
confirmPassword = "تأیید گذرواژه"
|
||||
placeholder = "گذرواژهٔ جدید وارد کنید"
|
||||
confirmPlaceholder = "گذرواژهٔ جدید را دوباره وارد کنید"
|
||||
passwordRequired = "لطفاً یک گذرواژهٔ جدید وارد کنید"
|
||||
passwordMismatch = "گذرواژهها یکسان نیستند"
|
||||
generateRandom = "ایجاد گذرواژهٔ امن"
|
||||
generatedPreview = "گذرواژهٔ تولیدشده:"
|
||||
copyTooltip = "کپی در کلیپبورد"
|
||||
copiedToClipboard = "گذرواژه در کلیپبورد کپی شد"
|
||||
copyFailed = "کپی گذرواژه ناموفق بود"
|
||||
sendEmail = "به کاربر دربارهٔ این تغییر ایمیل ارسال کنید"
|
||||
includePassword = "گذرواژهٔ جدید را در ایمیل درج کنید"
|
||||
forcePasswordChange = "کاربر را ملزم کنید در ورود بعدی گذرواژه را تغییر دهد"
|
||||
emailUnavailable = "ایمیل این کاربر معتبر نیست. اعلانها غیرفعال شدهاند."
|
||||
smtpDisabled = "برای اعلانهای ایمیل باید SMTP در تنظیمات فعال باشد."
|
||||
notifyOnly = "ایمیلی بدون گذرواژه ارسال خواهد شد تا به کاربر اطلاع دهد که یک مدیر آن را تغییر داده است."
|
||||
submit = "بهروزرسانی گذرواژه"
|
||||
success = "گذرواژه با موفقیت بهروزرسانی شد"
|
||||
error = "بهروزرسانی گذرواژه ناموفق بود"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "دعوت ایمیلی"
|
||||
description = "در زیر ایمیلها را تایپ یا بچسبانید و با کاما جدا کنید. به کاربران اطلاعات ورود از طریق ایمیل ارسال میشود."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "با حساب Stirling خود وارد شوید"
|
||||
[setup.selfhosted]
|
||||
title = "ورود به سرور"
|
||||
subtitle = "اطلاعات کاربری سرور خود را وارد کنید"
|
||||
link = "یا به یک حساب خودمیزبان متصل شوید"
|
||||
|
||||
[setup.server]
|
||||
title = "اتصال به سرور"
|
||||
@@ -5944,14 +5833,6 @@ description = "URL کامل سرور خودمیزبان Stirling PDF خود را
|
||||
emptyUrl = "لطفاً URL سرور را وارد کنید"
|
||||
unreachable = "اتصال به سرور ممکن نشد"
|
||||
testFailed = "آزمون اتصال ناموفق بود"
|
||||
configFetch = "بازیابی پیکربندی سرور ناموفق بود. لطفاً URL را بررسی کنید و دوباره تلاش کنید."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "ورود فعال نیست"
|
||||
body = "ورود در این سرور فعال نشده است. برای اتصال به این سرور باید احراز هویت را فعال کنید:"
|
||||
step1 = "DOCKER_ENABLE_SECURITY=true را در محیط خود تنظیم کنید"
|
||||
step2 = "یا security.enableLogin=true را در settings.yml تنظیم کنید"
|
||||
step3 = "سرور را راهاندازی مجدد کنید"
|
||||
|
||||
[setup.login]
|
||||
title = "ورود"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "دسترسی زودهنگام"
|
||||
reset = "بازنشانی تغییرات"
|
||||
downloadJson = "دانلود JSON"
|
||||
generatePdf = "تولید PDF"
|
||||
saveChanges = "ذخیرهٔ تغییرات"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "مقیاس خودکار متن برای جا شدن در باکسها"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "این نمایشگر آلفا هنوز در حال تکامل است
|
||||
[pdfTextEditor.empty]
|
||||
title = "هیچ سندی بارگذاری نشده است"
|
||||
subtitle = "برای شروع ویرایش متن، یک فایل PDF یا JSON بارگذاری کنید."
|
||||
dropzone = "یک فایل PDF یا JSON را اینجا بکشید و رها کنید، یا برای مرور کلیک کنید"
|
||||
dropzoneWithFiles = "یک فایل را از برگهٔ فایلها انتخاب کنید، یا یک فایل PDF یا JSON را اینجا بکشید و رها کنید، یا برای مرور کلیک کنید"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "به ویرایشگر متن PDF (دسترسی زودهنگام) خوش آمدید"
|
||||
|
||||
@@ -363,7 +363,7 @@ connections = "Connexions"
|
||||
|
||||
[settings.licensingAnalytics]
|
||||
title = "Licences et analyses"
|
||||
plan = "Forfait"
|
||||
plan = "Plan"
|
||||
audit = "Audit"
|
||||
usageAnalytics = "Analyses d'utilisation"
|
||||
|
||||
@@ -1225,7 +1225,7 @@ odtExt = "Texte OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Présentation OpenDocument (.odp)"
|
||||
txtExt = "Texte brut (.txt)"
|
||||
rtfExt = "Format de texte enrichi (.rtf)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "Fichiers sélectionnés"
|
||||
noFileSelected = "Aucun fichier sélectionné. Utilisez le panneau de fichiers pour ajouter des fichiers."
|
||||
convertFiles = "Convertir les fichiers"
|
||||
@@ -3036,91 +3036,6 @@ title = "Récupérer les informations"
|
||||
header = "Récupérer les informations"
|
||||
submit = "Récupérer les informations"
|
||||
downloadJson = "Télécharger le JSON"
|
||||
processing = "Extraction des informations..."
|
||||
results = "Résultats"
|
||||
noResults = "Exécutez l'outil pour générer un rapport."
|
||||
downloads = "Téléchargements"
|
||||
noneDetected = "Aucun détecté"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Résumé complet des informations"
|
||||
shortTitle = "Informations PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Métadonnées"
|
||||
formFields = "Champs de formulaire"
|
||||
basicInfo = "Informations de base"
|
||||
documentInfo = "Informations sur le document"
|
||||
compliance = "Conformité"
|
||||
encryption = "Chiffrement"
|
||||
permissions = "Autorisations"
|
||||
other = "Autre"
|
||||
perPageInfo = "Informations par page"
|
||||
tableOfContents = "Table des matières"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Pièces jointes"
|
||||
embeddedFiles = "Fichiers intégrés"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Calques"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Taille"
|
||||
annotations = "Annotations"
|
||||
images = "Images"
|
||||
links = "Liens"
|
||||
fonts = "Polices"
|
||||
xobjects = "Nombre d'objets XObject"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pages"
|
||||
fileSize = "Taille du fichier"
|
||||
pdfVersion = "Version PDF"
|
||||
language = "Langue"
|
||||
title = "Résumé PDF"
|
||||
author = "Auteur"
|
||||
created = "Créé"
|
||||
modified = "Modifié"
|
||||
permsAll = "Toutes les autorisations accordées"
|
||||
permsRestricted = "{{count}} restrictions"
|
||||
permsMixed = "Certaines autorisations sont restreintes"
|
||||
hasCompliance = "Respecte des normes de conformité"
|
||||
noCompliance = "Aucune norme de conformité"
|
||||
basic = "Informations de base"
|
||||
documentInfo = "Informations sur le document"
|
||||
securityTitle = "État de sécurité"
|
||||
technical = "Technique"
|
||||
overviewTitle = "Aperçu du PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF chiffré - Protection par mot de passe présente"
|
||||
unencrypted = "PDF non chiffré - Aucune protection par mot de passe"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Images"
|
||||
fonts = "Polices"
|
||||
formFields = "Champs de formulaire"
|
||||
embeddedFiles = "Fichiers intégrés"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Calques"
|
||||
bookmarks = "Signets"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "un document sans titre"
|
||||
unknown = "Auteur inconnu"
|
||||
text = "Ceci est un PDF de {{pages}} pages intitulé {{title}} créé par {{author}} (version PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Certains fichiers n'ont pas pu être traités."
|
||||
unexpected = "Erreur inattendue lors de l'extraction."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extraction terminée"
|
||||
|
||||
[extractPage]
|
||||
tags = "extraire,extract"
|
||||
@@ -4635,7 +4550,7 @@ successMessage = "Fichier de licence téléversé et activé avec succès. Aucun
|
||||
title = "Licence active"
|
||||
file = "Source: Fichier de licence ({{path}})"
|
||||
key = "Source: Clé de licence"
|
||||
type = "Type : {{type}}"
|
||||
type = "Type: {{type}}"
|
||||
noInput = "Veuillez fournir une clé de licence ou téléverser un fichier de certificat"
|
||||
success = "Succès"
|
||||
|
||||
@@ -5262,7 +5177,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 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Télécharger"
|
||||
@@ -5367,31 +5282,6 @@ error = "Échec de la mise à jour du statut de l’utilisateur"
|
||||
success = "Utilisateur supprimé avec succès"
|
||||
error = "Échec de la suppression de l’utilisateur"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Changer le mot de passe"
|
||||
title = "Changer le mot de passe"
|
||||
subtitle = "Mettre à jour le mot de passe de"
|
||||
newPassword = "Nouveau mot de passe"
|
||||
confirmPassword = "Confirmer le mot de passe"
|
||||
placeholder = "Saisissez un nouveau mot de passe"
|
||||
confirmPlaceholder = "Saisissez à nouveau le nouveau mot de passe"
|
||||
passwordRequired = "Veuillez saisir un nouveau mot de passe"
|
||||
passwordMismatch = "Les mots de passe ne correspondent pas"
|
||||
generateRandom = "Générer un mot de passe sécurisé"
|
||||
generatedPreview = "Mot de passe généré :"
|
||||
copyTooltip = "Copier dans le presse-papiers"
|
||||
copiedToClipboard = "Mot de passe copié dans le presse-papiers"
|
||||
copyFailed = "Échec de la copie du mot de passe"
|
||||
sendEmail = "Envoyer un e-mail à l'utilisateur à propos de ce changement"
|
||||
includePassword = "Inclure le nouveau mot de passe dans l'e-mail"
|
||||
forcePasswordChange = "Forcer l'utilisateur à changer son mot de passe à la prochaine connexion"
|
||||
emailUnavailable = "L'e-mail de cet utilisateur n'est pas une adresse valide. Les notifications sont désactivées."
|
||||
smtpDisabled = "Les notifications par e-mail nécessitent l'activation de SMTP dans les paramètres."
|
||||
notifyOnly = "Un e-mail sera envoyé sans le mot de passe, informant l'utilisateur qu'un administrateur l'a modifié."
|
||||
submit = "Mettre à jour le mot de passe"
|
||||
success = "Mot de passe mis à jour avec succès"
|
||||
error = "Échec de la mise à jour du mot de passe"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Invitation par e-mail"
|
||||
description = "Saisissez ou collez des adresses e-mail ci-dessous, séparées par des virgules. Les utilisateurs recevront leurs identifiants de connexion par e-mail."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Connectez-vous avec votre compte Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Se connecter au serveur"
|
||||
subtitle = "Saisissez les identifiants du serveur"
|
||||
link = "ou connectez-vous à un compte auto-hébergé"
|
||||
|
||||
[setup.server]
|
||||
title = "Connexion au serveur"
|
||||
@@ -5944,14 +5833,6 @@ description = "Saisissez l’URL complète de votre serveur Stirling PDF auto‑
|
||||
emptyUrl = "Veuillez saisir une URL de serveur"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Connexion non activée"
|
||||
body = "La connexion n'est pas activée sur ce serveur. Pour vous y connecter, vous devez activer l'authentification :"
|
||||
step1 = "Définissez DOCKER_ENABLE_SECURITY=true dans votre environnement"
|
||||
step2 = "Ou définissez security.enableLogin=true dans settings.yml"
|
||||
step3 = "Redémarrez le serveur"
|
||||
|
||||
[setup.login]
|
||||
title = "Se connecter"
|
||||
@@ -6011,7 +5892,7 @@ paragraph = "Page de paragraphe"
|
||||
sparse = "Texte clairsemé"
|
||||
|
||||
[pdfTextEditor.groupingMode]
|
||||
auto = "Automatique"
|
||||
auto = "Auto"
|
||||
paragraph = "Paragraphe"
|
||||
singleLine = "Ligne unique"
|
||||
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Accès anticipé"
|
||||
reset = "Réinitialiser les modifications"
|
||||
downloadJson = "Télécharger le JSON"
|
||||
generatePdf = "Générer le PDF"
|
||||
saveChanges = "Enregistrer les modifications"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Ajuster automatiquement le texte aux cadres"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ce visualiseur alpha évolue encore — certaines polices, couleurs, ef
|
||||
[pdfTextEditor.empty]
|
||||
title = "Aucun document chargé"
|
||||
subtitle = "Chargez un fichier PDF ou JSON pour commencer à modifier le texte."
|
||||
dropzone = "Glissez-déposez un fichier PDF ou JSON ici, ou cliquez pour parcourir"
|
||||
dropzoneWithFiles = "Sélectionnez un fichier depuis l'onglet Fichiers, ou glissez-déposez un fichier PDF ou JSON ici, ou cliquez pour parcourir"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Bienvenue dans l'éditeur de texte PDF (accès anticipé)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Faigh eolas ar PDF"
|
||||
header = "Faigh eolas ar PDF"
|
||||
submit = "Faigh Eolas"
|
||||
downloadJson = "Íosluchtaigh ceol JSON"
|
||||
processing = "Ag eastóscadh faisnéise..."
|
||||
results = "Torthaí"
|
||||
noResults = "Rith an uirlis chun tuairisc a ghiniúint."
|
||||
downloads = "Íoslódálacha"
|
||||
noneDetected = "Níor braitheadh aon cheann"
|
||||
indexTitle = "Innéacs"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Achoimre iomlán eolais"
|
||||
shortTitle = "Eolas PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Meiteashonraí"
|
||||
formFields = "Réimsí Foirme"
|
||||
basicInfo = "Buneolas"
|
||||
documentInfo = "Eolas faoin Doiciméad"
|
||||
compliance = "Comhlíonadh"
|
||||
encryption = "Criptiú"
|
||||
permissions = "Ceadanna"
|
||||
other = "Eile"
|
||||
perPageInfo = "Eolas in aghaidh an leathanaigh"
|
||||
tableOfContents = "Clár Ábhair"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Iatáin"
|
||||
embeddedFiles = "Comhaid Leabaithe"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Sraitheanna"
|
||||
structureTree = "Crann Struchtúir"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Méid"
|
||||
annotations = "Anótálacha"
|
||||
images = "Íomhánna"
|
||||
links = "Naisc"
|
||||
fonts = "Clónna"
|
||||
xobjects = "Líon XObjectanna"
|
||||
multimedia = "Ilmheáin"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Leathanaigh"
|
||||
fileSize = "Méid Comhaid"
|
||||
pdfVersion = "Leagan PDF"
|
||||
language = "Teanga"
|
||||
title = "Achoimre PDF"
|
||||
author = "Údar"
|
||||
created = "Cruthaithe"
|
||||
modified = "Athraithe"
|
||||
permsAll = "Gach cead ceadaithe"
|
||||
permsRestricted = "{{count}} srianta"
|
||||
permsMixed = "Tá roinnt ceadanna srianta"
|
||||
hasCompliance = "Tá caighdeáin chomhlíonta ann"
|
||||
noCompliance = "Gan chaighdeáin chomhlíonta"
|
||||
basic = "Buneolas"
|
||||
documentInfo = "Eolas faoin Doiciméad"
|
||||
securityTitle = "Stádas Slándála"
|
||||
technical = "Teicniúil"
|
||||
overviewTitle = "Forbhreathnú PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF criptithe - cosaint le focal faire"
|
||||
unencrypted = "PDF neamchriptithe - gan chosaint le focal faire"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Íomhánna"
|
||||
fonts = "Clónna"
|
||||
formFields = "Réimsí Foirme"
|
||||
embeddedFiles = "Comhaid Leabaithe"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Sraitheanna"
|
||||
bookmarks = "Leabharmharcanna"
|
||||
multimedia = "Ilmheáin"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "doiciméad gan teideal"
|
||||
unknown = "Údar Anaithnid"
|
||||
text = "Is PDF {{pages}} leathanach dar teideal {{title}} é, a chruthaigh {{author}} (leagan PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Níorbh fhéidir roinnt comhad a phróiseáil."
|
||||
unexpected = "Earráid gan choinne le linn eastósctha."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Eastóscadh críochnaithe"
|
||||
|
||||
[extractPage]
|
||||
tags = "sliocht"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Uasghrádaigh anois →"
|
||||
freeTitle = "Ceadúnas Freastalaí"
|
||||
overLimitTitle = "Ceadúnas Freastalaí de dhíth"
|
||||
overLimitBody = "Ceadaíonn ár gceadúnú suas le <strong>{{freeTierLimit}}</strong> úsáideoir in aisce in aghaidh freastalaí. Tá <strong>{{overLimitUserCopy}}</strong> úsáideoir Stirling agat. Chun leanúint gan bhriseadh, uasghrádaigh go plean Freastalaí Stirling - <strong>suíocháin neamhtheoranta</strong>, eagarthóireacht téacs PDF, agus lánrialú riaracháin ar $99/freastalaí/mí."
|
||||
freeBody = "Ceadaíonn ár gceadúnú <strong>Open-Core</strong> suas le <strong>{{freeTierLimit}}</strong> úsáideoirí saor in aisce in aghaidh an fhreastalaí. Chun scálú gan bhriseadh, molaimid an plean Stirling Server - <strong>suíocháin neamhtheoranta</strong> agus <strong>tacaíocht SSO</strong> ar $99/server/mo."
|
||||
freeBody = "Ceadaíonn ár gceadúnú <strong>Open-Core</strong> suas le <strong>{{freeTierLimit}}</strong> úsáideoir in aisce in aghaidh freastalaí. Chun méadú gan bhriseadh agus rochtain luath a fháil ar ár <strong>uirlis eagarthóireachta téacs PDF</strong> nua, molaimid Plean Freastalaí Stirling - eagarthóireacht iomlán agus <strong>suíocháin neamhtheoranta</strong> ar $99/freastalaí/mí."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Íoslódáil"
|
||||
@@ -5367,31 +5282,6 @@ error = "Theip ar stádas úsáideora a nuashonrú"
|
||||
success = "Scriosadh an t-úsáideoir go rathúil"
|
||||
error = "Theip ar an úsáideoir a scriosadh"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Athraigh an focal faire"
|
||||
title = "Athraigh an focal faire"
|
||||
subtitle = "Nuashonraigh an focal faire do"
|
||||
newPassword = "Focal faire nua"
|
||||
confirmPassword = "Deimhnigh an focal faire"
|
||||
placeholder = "Cuir focal faire nua isteach"
|
||||
confirmPlaceholder = "Cuir an focal faire nua isteach arís"
|
||||
passwordRequired = "Cuir focal faire nua isteach le do thoil"
|
||||
passwordMismatch = "Ní hionann na focail faire"
|
||||
generateRandom = "Gin focal faire slán"
|
||||
generatedPreview = "Focal faire ginte:"
|
||||
copyTooltip = "Cóipeáil chuig an ngearrthaisce"
|
||||
copiedToClipboard = "Cóipeáladh an focal faire chuig an ngearrthaisce"
|
||||
copyFailed = "Níor éirigh le cóipeáil an fhocail fhaire"
|
||||
sendEmail = "Seol ríomhphost chuig an úsáideoir faoin athrú seo"
|
||||
includePassword = "Cuir an focal faire nua san ríomhphost"
|
||||
forcePasswordChange = "Cuir iallach ar an úsáideoir an focal faire a athrú ag an gcéad logáil isteach eile"
|
||||
emailUnavailable = "Níl seoladh ríomhphoist bailí ag an úsáideoir seo. Tá fógraí díchumasaithe."
|
||||
smtpDisabled = "Teastaíonn SMTP cumasaithe sna socruithe le haghaidh fógraí ríomhphoist."
|
||||
notifyOnly = "Seolfar ríomhphost gan an focal faire, ag cur in iúl don úsáideoir gur d’athraigh riarthóir é."
|
||||
submit = "Nuashonraigh an focal faire"
|
||||
success = "Nuashonraíodh an focal faire go rathúil"
|
||||
error = "Níor éirigh le focal faire a nuashonrú"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Cuireadh Ríomhphoist"
|
||||
description = "Clóscríobh nó greamaigh seoltaí ríomhphoist thíos, scartha le camóga. Gheobhaidh úsáideoirí dintiúir logála isteach trí r-phost."
|
||||
@@ -5443,8 +5333,8 @@ emailDisabled = "Teastaíonn cumraíocht SMTP agus mail.enableInvites=true sna s
|
||||
[workspace.people.license]
|
||||
users = "úsáideoirí"
|
||||
availableSlots = "Áiteanna Ar Fáil"
|
||||
grandfathered = "Ceadaithe roimhe seo"
|
||||
grandfatheredShort = "{{count}} ceadaithe roimhe seo"
|
||||
grandfathered = "Grandfathered"
|
||||
grandfatheredShort = "{{count}} grandfathered"
|
||||
fromLicense = "ón gceadúnas"
|
||||
slotsAvailable = "{{count}} áit(í) úsáideora ar fáil"
|
||||
noSlotsAvailable = "Níl aon áiteanna ar fáil"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Sínigh isteach le do chuntas Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Sínigh isteach chuig an bhFreastalaí"
|
||||
subtitle = "Cuir isteach dintiúir do fhreastalaí"
|
||||
link = "nó ceangail le cuntas féinóstáilte"
|
||||
|
||||
[setup.server]
|
||||
title = "Ceangail leis an bhFreastalaí"
|
||||
@@ -5944,14 +5833,6 @@ description = "Cuir isteach URL iomlán do fhreastalaí Stirling PDF féin-óst
|
||||
emptyUrl = "Cuir isteach URL freastalaí le do thoil"
|
||||
unreachable = "Níorbh fhéidir ceangal leis an bhfreastalaí"
|
||||
testFailed = "Theip ar thástáil an cheangail"
|
||||
configFetch = "Níor éirigh le cumraíocht an fhreastalaí a fháil. Seiceáil an URL agus bain triail eile as."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Níl an Logáil Isteach Cumasaithe"
|
||||
body = "Níl logáil isteach cumasaithe ar an bhfreastalaí seo. Chun ceangal leis an bhfreastalaí seo, ní mór duit fíordheimhniú a chumasú:"
|
||||
step1 = "Socraigh DOCKER_ENABLE_SECURITY=true i do thimpeallacht"
|
||||
step2 = "Nó socraigh security.enableLogin=true i settings.yml"
|
||||
step3 = "Atosaigh an freastalaí"
|
||||
|
||||
[setup.login]
|
||||
title = "Sínigh Isteach"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Rochtain Luath"
|
||||
reset = "Athshocraigh Athruithe"
|
||||
downloadJson = "Íoslódáil JSON"
|
||||
generatePdf = "Gin PDF"
|
||||
saveChanges = "Sábháil Athruithe"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Scálaigh téacs go huathoibríoch chun boscaí a fheistiú"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Tá an t-amharcóir alfa seo fós ag forbairt — d’fhéadfadh clónn
|
||||
[pdfTextEditor.empty]
|
||||
title = "Níl aon cháipéis luchtaithe"
|
||||
subtitle = "Luchtaigh comhad PDF nó JSON chun eagarthóireacht ar ábhar téacs a thosú."
|
||||
dropzone = "Tarraing agus scaoil comhad PDF nó JSON anseo, nó cliceáil chun brabhsáil"
|
||||
dropzoneWithFiles = "Roghnaigh comhad ón gcluaisín Comhaid, nó tarraing agus scaoil comhad PDF nó JSON anseo, nó cliceáil chun brabhsáil"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Fáilte go dtí Eagarthóir Téacs PDF (Rochtain Luath)"
|
||||
|
||||
@@ -834,7 +834,7 @@ title = "PDF हस्ताक्षर सत्यापित करें"
|
||||
desc = "PDF दस्तावेजों में डिजिटल हस्ताक्षर और प्रमाणपत्रों को सत्यापित करें"
|
||||
|
||||
[home.swagger]
|
||||
tags = "API,दस्तावेज़ीकरण,परीक्षण"
|
||||
tags = "API,documentation,test"
|
||||
title = "API दस्तावेज़ीकरण"
|
||||
desc = "API दस्तावेज़ देखें और एंडपॉइंट टेस्ट करें"
|
||||
|
||||
@@ -883,7 +883,7 @@ title = "रंग बदलें/उलटें"
|
||||
desc = "PDF दस्तावेज़ों में रंगों को प्रतिस्थापित या उलटें"
|
||||
|
||||
[home.devApi]
|
||||
tags = "API,विकास,दस्तावेज़ीकरण"
|
||||
tags = "API,development,documentation"
|
||||
title = "API"
|
||||
desc = "API दस्तावेज़ के लिए लिंक"
|
||||
|
||||
@@ -922,7 +922,7 @@ title = "PDF टेक्स्ट एडिटर"
|
||||
desc = "PDF फ़ाइलों के भीतर मौजूदा टेक्स्ट और इमेज संपादित करें"
|
||||
|
||||
[home.addText]
|
||||
tags = "पाठ,टिप्पणी,लेबल"
|
||||
tags = "text,annotation,label"
|
||||
title = "टेक्स्ट जोड़ें"
|
||||
desc = "अपने PDF में कहीं भी कस्टम टेक्स्ट जोड़ें"
|
||||
|
||||
@@ -1221,9 +1221,9 @@ pdfaDigitalSignatureWarning = "PDF में एक डिजिटल हस्
|
||||
fileFormat = "फ़ाइल फ़ॉर्मेट"
|
||||
wordDoc = "Word दस्तावेज़"
|
||||
wordDocExt = "Word दस्तावेज़ (.docx)"
|
||||
odtExt = "OpenDocument टेक्स्ट (.odt)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument प्रस्तुति (.odp)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
txtExt = "सादा पाठ (.txt)"
|
||||
rtfExt = "रिच टेक्स्ट फ़ॉर्मेट (.rtf)"
|
||||
selectedFiles = "चयनित फ़ाइलें"
|
||||
@@ -1840,7 +1840,7 @@ title = "उन्नत"
|
||||
tags = "कम्प्रेस,छोटा,छोटा"
|
||||
|
||||
[unlockPDFForms]
|
||||
tags = "हटाएं,मिटाएं,फॉर्म,फ़ील्ड,रीड-ओनली"
|
||||
tags = "remove,delete,form,field,readonly"
|
||||
title = "फॉर्म फ़ील्ड से Read-Only हटाएं"
|
||||
header = "PDF फॉर्म अनलॉक करें"
|
||||
submit = "Remove"
|
||||
@@ -2747,7 +2747,7 @@ submit = "जमा करें"
|
||||
failed = "मल्टी-पृष्ठ लेआउट बनाते समय त्रुटि हुई।"
|
||||
|
||||
[bookletImposition]
|
||||
tags = "बुकलेट,इम्पोज़िशन,प्रिंटिंग,बाइंडिंग,फोल्डिंग,सिग्नेचर"
|
||||
tags = "booklet,imposition,printing,binding,folding,signature"
|
||||
title = "बुकलेट इम्पोज़िशन"
|
||||
header = "बुकलेट इम्पोज़िशन"
|
||||
submit = "बुकलेट बनाएँ"
|
||||
@@ -2846,7 +2846,7 @@ scaleFactor = "एक पृष्ठ का ज़ूम स्तर (क्
|
||||
submit = "जमा करें"
|
||||
|
||||
[adjustPageScale]
|
||||
tags = "आकार बदलें,संशोधित करें,आयाम,अनुकूलित करें"
|
||||
tags = "resize,modify,dimension,adapt"
|
||||
title = "पृष्ठ स्केल समायोजित करें"
|
||||
header = "पृष्ठ स्केल समायोजित करें"
|
||||
submit = "पृष्ठ स्केल समायोजित करें"
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF की जानकारी प्राप्त करें"
|
||||
header = "PDF की जानकारी प्राप्त करें"
|
||||
submit = "जानकारी प्राप्त करें"
|
||||
downloadJson = "JSON डाउनलोड करें"
|
||||
processing = "जानकारी निकाली जा रही है..."
|
||||
results = "परिणाम"
|
||||
noResults = "रिपोर्ट बनाने के लिए टूल चलाएँ।"
|
||||
downloads = "डाउनलोड"
|
||||
noneDetected = "कुछ भी पता नहीं चला"
|
||||
indexTitle = "अनुक्रमणिका"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "पूरी जानकारी का सारांश"
|
||||
shortTitle = "PDF जानकारी"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "मेटाडेटा"
|
||||
formFields = "फ़ॉर्म फ़ील्ड्स"
|
||||
basicInfo = "मूल जानकारी"
|
||||
documentInfo = "दस्तावेज़ जानकारी"
|
||||
compliance = "अनुपालन"
|
||||
encryption = "एन्क्रिप्शन"
|
||||
permissions = "अनुमतियाँ"
|
||||
other = "अन्य"
|
||||
perPageInfo = "प्रति पेज जानकारी"
|
||||
tableOfContents = "विषय सूची"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "संलग्नक"
|
||||
embeddedFiles = "एम्बेडेड फ़ाइलें"
|
||||
javaScript = "JavaScript"
|
||||
layers = "लेयर्स"
|
||||
structureTree = "स्ट्रक्चर ट्री"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "आकार"
|
||||
annotations = "टिप्पणियाँ"
|
||||
images = "छवियाँ"
|
||||
links = "लिंक"
|
||||
fonts = "फ़ॉन्ट्स"
|
||||
xobjects = "XObject की संख्या"
|
||||
multimedia = "मल्टीमीडिया"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "पृष्ठ"
|
||||
fileSize = "फ़ाइल आकार"
|
||||
pdfVersion = "PDF संस्करण"
|
||||
language = "भाषा"
|
||||
title = "PDF सारांश"
|
||||
author = "लेखक"
|
||||
created = "निर्मित"
|
||||
modified = "संशोधित"
|
||||
permsAll = "सभी अनुमतियाँ स्वीकृत"
|
||||
permsRestricted = "{{count}} प्रतिबंध"
|
||||
permsMixed = "कुछ अनुमतियाँ प्रतिबंधित"
|
||||
hasCompliance = "अनुपालन मानक मौजूद हैं"
|
||||
noCompliance = "कोई अनुपालन मानक नहीं"
|
||||
basic = "मूल जानकारी"
|
||||
documentInfo = "दस्तावेज़ जानकारी"
|
||||
securityTitle = "सुरक्षा स्थिति"
|
||||
technical = "तकनीकी"
|
||||
overviewTitle = "PDF अवलोकन"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "एन्क्रिप्टेड PDF - पासवर्ड सुरक्षा मौजूद है"
|
||||
unencrypted = "बिना एन्क्रिप्शन वाला PDF - पासवर्ड सुरक्षा नहीं है"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "छवियाँ"
|
||||
fonts = "फ़ॉन्ट्स"
|
||||
formFields = "फ़ॉर्म फ़ील्ड्स"
|
||||
embeddedFiles = "एम्बेडेड फ़ाइलें"
|
||||
javaScript = "JavaScript"
|
||||
layers = "लेयर्स"
|
||||
bookmarks = "बुकमार्क"
|
||||
multimedia = "मल्टीमीडिया"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "एक बिना शीर्षक वाला दस्तावेज़"
|
||||
unknown = "अज्ञात लेखक"
|
||||
text = "यह {{pages}}-पृष्ठ वाला PDF है जिसका शीर्षक {{title}} है, जिसे {{author}} ने बनाया है (PDF संस्करण {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "कुछ फ़ाइलों का प्रसंस्करण नहीं हो सका।"
|
||||
unexpected = "निकालते समय अप्रत्याशित त्रुटि हुई।"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "एक्सट्रैक्शन पूर्ण"
|
||||
|
||||
[extractPage]
|
||||
tags = "निकालें"
|
||||
@@ -3481,7 +3396,7 @@ certHint = "कस्टम ट्रस्ट स्रोत के विर
|
||||
title = "सत्यापन सेटिंग्स"
|
||||
|
||||
[replaceColor]
|
||||
tags = "रंग बदलें,पृष्ठ संचालन,Back end,server side"
|
||||
tags = "Replace Colour,Page operations,Back end,server side"
|
||||
|
||||
[replaceColor.labels]
|
||||
settings = "सेटिंग्स"
|
||||
@@ -3875,7 +3790,7 @@ version = "वर्तमान रिलीज़"
|
||||
title = "API दस्तावेज़ीकरण"
|
||||
header = "API दस्तावेज़ीकरण"
|
||||
desc = "Stirling PDF API एंडपॉइंट्स देखें और परीक्षण करें"
|
||||
tags = "api,दस्तावेज़ीकरण,swagger,endpoints,विकास"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "हम कुकीज़ का उपयोग कैसे करते हैं"
|
||||
@@ -4343,11 +4258,11 @@ label = "जारीकर्ता URL"
|
||||
description = "OAuth2 प्रदाता का Issuer URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "क्लाइंट ID"
|
||||
label = "Client ID"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client ID"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "क्लाइंट सीक्रेट"
|
||||
label = "Client Secret"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client Secret"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -5262,7 +5177,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> उपयोगकर्ताओं को निःशुल्क अनुमति देता है। बिना रुकावट स्केल करने के लिए, हम Stirling Server प्लान की अनुशंसा करते हैं - <strong>असीमित सीटें</strong> और <strong>SSO समर्थन</strong> $99/सर्वर/माह पर।"
|
||||
freeBody = "हमारा <strong>Open-Core</strong> लाइसेंसिंग प्रति सर्वर अधिकतम <strong>{{freeTierLimit}}</strong> उपयोगकर्ताओं को मुफ्त अनुमति देता है। बिना बाधा स्केल करने और हमारे नए <strong>PDF टेक्स्ट एडिटिंग टूल</strong> की प्रारंभिक पहुँच पाने के लिए हम Stirling Server प्लान की सलाह देते हैं - पूर्ण एडिटिंग और <strong>अनलिमिटेड सीट्स</strong> $99/server/mo में।"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "डाउनलोड"
|
||||
@@ -5367,31 +5282,6 @@ error = "उपयोगकर्ता स्थिति अपडेट क
|
||||
success = "उपयोगकर्ता सफलतापूर्वक हटाया गया"
|
||||
error = "उपयोगकर्ता हटाने में विफल"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "पासवर्ड बदलें"
|
||||
title = "पासवर्ड बदलें"
|
||||
subtitle = "के लिए पासवर्ड अपडेट करें"
|
||||
newPassword = "नया पासवर्ड"
|
||||
confirmPassword = "पासवर्ड की पुष्टि करें"
|
||||
placeholder = "नया पासवर्ड दर्ज करें"
|
||||
confirmPlaceholder = "नया पासवर्ड फिर से दर्ज करें"
|
||||
passwordRequired = "कृपया नया पासवर्ड दर्ज करें"
|
||||
passwordMismatch = "पासवर्ड मेल नहीं खाते"
|
||||
generateRandom = "सुरक्षित पासवर्ड जनरेट करें"
|
||||
generatedPreview = "जनरेट किया गया पासवर्ड:"
|
||||
copyTooltip = "क्लिपबोर्ड पर कॉपी करें"
|
||||
copiedToClipboard = "पासवर्ड क्लिपबोर्ड पर कॉपी किया गया"
|
||||
copyFailed = "पासवर्ड कॉपी करने में विफल"
|
||||
sendEmail = "इस बदलाव के बारे में उपयोगकर्ता को ईमेल करें"
|
||||
includePassword = "ईमेल में नया पासवर्ड शामिल करें"
|
||||
forcePasswordChange = "अगले लॉगिन पर उपयोगकर्ता को पासवर्ड बदलने के लिए बाध्य करें"
|
||||
emailUnavailable = "इस उपयोगकर्ता का ईमेल एक मान्य ईमेल पता नहीं है। सूचनाएँ अक्षम हैं।"
|
||||
smtpDisabled = "ईमेल सूचनाओं के लिए सेटिंग्स में SMTP सक्षम होना आवश्यक है।"
|
||||
notifyOnly = "पासवर्ड के बिना एक ईमेल भेजा जाएगा, जिससे उपयोगकर्ता को पता चलेगा कि किसी व्यवस्थापक ने इसे बदला है।"
|
||||
submit = "पासवर्ड अपडेट करें"
|
||||
success = "पासवर्ड सफलतापूर्वक अपडेट किया गया"
|
||||
error = "पासवर्ड अपडेट करने में विफल"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "ईमेल आमंत्रण"
|
||||
description = "नीचे ईमेल टाइप या पेस्ट करें, अल्पविराम से अलग करें। उपयोगकर्ताओं को ईमेल के माध्यम से लॉगिन क्रेडेंशियल मिलेंगे।"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "अपने Stirling खाते से साइन इन कर
|
||||
[setup.selfhosted]
|
||||
title = "सर्वर में साइन इन"
|
||||
subtitle = "अपने सर्वर क्रेडेंशियल्स दर्ज करें"
|
||||
link = "या किसी स्व-होस्टेड खाते से कनेक्ट करें"
|
||||
|
||||
[setup.server]
|
||||
title = "सर्वर से कनेक्ट करें"
|
||||
@@ -5944,14 +5833,6 @@ description = "अपने सेल्फ-होस्टेड Stirling PDF
|
||||
emptyUrl = "कृपया सर्वर URL दर्ज करें"
|
||||
unreachable = "सर्वर से कनेक्ट नहीं हो सका"
|
||||
testFailed = "कनेक्शन परीक्षण विफल"
|
||||
configFetch = "सर्वर कॉन्फ़िगरेशन प्राप्त करने में विफल। कृपया URL जाँचें और फिर से प्रयास करें।"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "लॉगिन सक्षम नहीं है"
|
||||
body = "इस सर्वर पर लॉगिन सक्षम नहीं है। इस सर्वर से कनेक्ट करने के लिए, आपको प्रमाणीकरण सक्षम करना होगा:"
|
||||
step1 = "अपने एनवायरनमेंट में DOCKER_ENABLE_SECURITY=true सेट करें"
|
||||
step2 = "या settings.yml में security.enableLogin=true सेट करें"
|
||||
step3 = "सर्वर को पुनः प्रारंभ करें"
|
||||
|
||||
[setup.login]
|
||||
title = "साइन इन"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "अर्ली एक्सेस"
|
||||
reset = "परिवर्तन रीसेट करें"
|
||||
downloadJson = "JSON डाउनलोड करें"
|
||||
generatePdf = "PDF जनरेट करें"
|
||||
saveChanges = "परिवर्तन सहेजें"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "टेक्स्ट को बॉक्स में फिट करने हेतु ऑटो-स्केल"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "यह alpha व्यूअर अभी विकसित हो र
|
||||
[pdfTextEditor.empty]
|
||||
title = "कोई दस्तावेज़ लोड नहीं"
|
||||
subtitle = "टेक्स्ट सामग्री संपादित करने के लिए PDF या JSON फ़ाइल लोड करें."
|
||||
dropzone = "यहाँ PDF या JSON फ़ाइल खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें"
|
||||
dropzoneWithFiles = "फ़ाइलें टैब से कोई फ़ाइल चुनें, या यहाँ PDF या JSON फ़ाइल खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor में आपका स्वागत है (Early Access)"
|
||||
@@ -6106,7 +5984,7 @@ warnings = "चेतावनियाँ"
|
||||
suggestions = "नोट्स"
|
||||
currentPageFonts = "इस पेज के फ़ॉन्ट्स"
|
||||
allFonts = "सभी फ़ॉन्ट्स"
|
||||
fallback = "फॉलबैक"
|
||||
fallback = "fallback"
|
||||
missing = "गायब"
|
||||
perfectMessage = "सभी फ़ॉन्ट्स को पूरी तरह पुनरुत्पादित किया जा सकता है."
|
||||
warningMessage = "कुछ फ़ॉन्ट्स सही से रेंडर नहीं हो सकते हैं."
|
||||
@@ -6127,7 +6005,7 @@ insufficientPermissions = "आपके पास यह क्रिया क
|
||||
[addText]
|
||||
title = "टेक्स्ट जोड़ें"
|
||||
header = "PDFs में टेक्स्ट जोड़ें"
|
||||
tags = "पाठ,टिप्पणी,लेबल"
|
||||
tags = "text,annotation,label"
|
||||
applySignatures = "टेक्स्ट लागू करें"
|
||||
|
||||
[addText.text]
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Informacije o PDF-u"
|
||||
header = "Informacije o PDF-u"
|
||||
submit = "Informacije"
|
||||
downloadJson = "Preuzmite JSON"
|
||||
processing = "Izdvajanje informacija..."
|
||||
results = "Rezultati"
|
||||
noResults = "Pokrenite alat za generiranje izvješća."
|
||||
downloads = "Preuzimanja"
|
||||
noneDetected = "Ništa nije otkriveno"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Potpuni sažetak informacija"
|
||||
shortTitle = "Informacije o PDF-u"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metapodaci"
|
||||
formFields = "Polja obrasca"
|
||||
basicInfo = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
compliance = "Sukladnost"
|
||||
encryption = "Šifriranje"
|
||||
permissions = "Dozvole"
|
||||
other = "Ostalo"
|
||||
perPageInfo = "Informacije po stranici"
|
||||
tableOfContents = "Sadržaj"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Privici"
|
||||
embeddedFiles = "Ugrađene datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Slojevi"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Veličina"
|
||||
annotations = "Bilješke"
|
||||
images = "Slike"
|
||||
links = "Poveznice"
|
||||
fonts = "Fontovi"
|
||||
xobjects = "Broj XObjecta"
|
||||
multimedia = "Multimedija"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Stranice"
|
||||
fileSize = "Veličina datoteke"
|
||||
pdfVersion = "PDF verzija"
|
||||
language = "Jezik"
|
||||
title = "Sažetak PDF-a"
|
||||
author = "Autor"
|
||||
created = "Stvoreno"
|
||||
modified = "Izmijenjeno"
|
||||
permsAll = "Sve dozvole dopuštene"
|
||||
permsRestricted = "{{count}} ograničenja"
|
||||
permsMixed = "Neke dozvole su ograničene"
|
||||
hasCompliance = "Ima standarde sukladnosti"
|
||||
noCompliance = "Nema standarda sukladnosti"
|
||||
basic = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
securityTitle = "Status sigurnosti"
|
||||
technical = "Tehničko"
|
||||
overviewTitle = "Pregled PDF-a"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Šifrirani PDF - prisutna zaštita lozinkom"
|
||||
unencrypted = "Nešifrirani PDF - bez zaštite lozinkom"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Slike"
|
||||
fonts = "Fontovi"
|
||||
formFields = "Polja obrasca"
|
||||
embeddedFiles = "Ugrađene datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Slojevi"
|
||||
bookmarks = "Oznake"
|
||||
multimedia = "Multimedija"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "neimenovani dokument"
|
||||
unknown = "Nepoznat autor"
|
||||
text = "Ovo je PDF od {{pages}} stranica pod nazivom {{title}}, čiji je autor {{author}} (PDF verzija {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Neke datoteke nije bilo moguće obraditi."
|
||||
unexpected = "Neočekivana pogreška tijekom izdvajanja."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Izdvajanje dovršeno"
|
||||
|
||||
[extractPage]
|
||||
tags = "izdvajanje"
|
||||
@@ -5262,7 +5177,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 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Preuzimanje"
|
||||
@@ -5367,31 +5282,6 @@ error = "Nije uspjelo ažuriranje statusa korisnika"
|
||||
success = "Korisnik je uspješno izbrisan"
|
||||
error = "Nije uspjelo brisanje korisnika"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Promijeni lozinku"
|
||||
title = "Promijeni lozinku"
|
||||
subtitle = "Ažuriraj lozinku za"
|
||||
newPassword = "Nova lozinka"
|
||||
confirmPassword = "Potvrdi lozinku"
|
||||
placeholder = "Unesite novu lozinku"
|
||||
confirmPlaceholder = "Ponovno unesite novu lozinku"
|
||||
passwordRequired = "Unesite novu lozinku"
|
||||
passwordMismatch = "Lozinke se ne podudaraju"
|
||||
generateRandom = "Generiraj sigurnu lozinku"
|
||||
generatedPreview = "Generirana lozinka:"
|
||||
copyTooltip = "Kopiraj u međuspremnik"
|
||||
copiedToClipboard = "Lozinka kopirana u međuspremnik"
|
||||
copyFailed = "Nije uspjelo kopiranje lozinke"
|
||||
sendEmail = "Pošalji korisniku e-poruku o ovoj promjeni"
|
||||
includePassword = "Uključi novu lozinku u e-poruku"
|
||||
forcePasswordChange = "Prisili korisnika da promijeni lozinku pri sljedećoj prijavi"
|
||||
emailUnavailable = "E-adresa ovog korisnika nije valjana. Obavijesti su onemogućene."
|
||||
smtpDisabled = "Obavijesti e-poštom zahtijevaju da SMTP bude omogućen u postavkama."
|
||||
notifyOnly = "Poslat će se e-poruka bez lozinke kako bi se korisniku javilo da ju je administrator promijenio."
|
||||
submit = "Ažuriraj lozinku"
|
||||
success = "Lozinka je uspješno ažurirana"
|
||||
error = "Nije uspjelo ažuriranje lozinke"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Poziv e-poštom"
|
||||
description = "Utipkajte ili zalijepite e-adrese dolje, odvojene zarezima. Korisnici će putem e-pošte dobiti pristupne podatke."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Prijavite se svojim Stirling računom"
|
||||
[setup.selfhosted]
|
||||
title = "Prijavite se na poslužitelj"
|
||||
subtitle = "Unesite vjerodajnice poslužitelja"
|
||||
link = "ili se povežite sa samohostiranim računom"
|
||||
|
||||
[setup.server]
|
||||
title = "Povežite se s poslužiteljem"
|
||||
@@ -5944,14 +5833,6 @@ description = "Unesite puni URL svog self-hosted Stirling PDF poslužitelja"
|
||||
emptyUrl = "Unesite URL poslužitelja"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Prijava nije omogućena"
|
||||
body = "Na ovom poslužitelju prijava nije omogućena. Da biste se povezali s ovim poslužiteljem, morate omogućiti autentikaciju:"
|
||||
step1 = "Postavite DOCKER_ENABLE_SECURITY=true u svom okruženju"
|
||||
step2 = "Ili postavite security.enableLogin=true u settings.yml"
|
||||
step3 = "Ponovno pokrenite poslužitelj"
|
||||
|
||||
[setup.login]
|
||||
title = "Prijava"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Rani pristup"
|
||||
reset = "Poništi promjene"
|
||||
downloadJson = "Preuzmi JSON"
|
||||
generatePdf = "Generiraj PDF"
|
||||
saveChanges = "Spremi promjene"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automatski skaliraj tekst kako bi stao u okvire"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ovaj alfa preglednik još se razvija — određeni fontovi, boje, efekt
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nijedan dokument nije učitan"
|
||||
subtitle = "Učitajte PDF ili JSON datoteku kako biste započeli uređivanje teksta."
|
||||
dropzone = "Ovdje povucite i ispustite PDF ili JSON datoteku ili kliknite za pregledavanje"
|
||||
dropzoneWithFiles = "Odaberite datoteku s kartice Datoteke ili ovdje povucite i ispustite PDF ili JSON datoteku, ili kliknite za pregledavanje"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Dobrodošli u PDF uređivač teksta (rani pristup)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF információk lekérése"
|
||||
header = "PDF információk lekérése"
|
||||
submit = "Információk lekérése"
|
||||
downloadJson = "JSON letöltése"
|
||||
processing = "Információk kinyerése..."
|
||||
results = "Eredmények"
|
||||
noResults = "Futtassa az eszközt a jelentés létrehozásához."
|
||||
downloads = "Letöltések"
|
||||
noneDetected = "Nem található"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Teljes információs összefoglaló"
|
||||
shortTitle = "PDF-információk"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metaadatok"
|
||||
formFields = "Űrlapmezők"
|
||||
basicInfo = "Alapinformációk"
|
||||
documentInfo = "Dokumentuminformációk"
|
||||
compliance = "Megfelelőség"
|
||||
encryption = "Titkosítás"
|
||||
permissions = "Engedélyek"
|
||||
other = "Egyéb"
|
||||
perPageInfo = "Oldalankénti információk"
|
||||
tableOfContents = "Tartalomjegyzék"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Mellékletek"
|
||||
embeddedFiles = "Beágyazott fájlok"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Rétegek"
|
||||
structureTree = "Struktúrafa"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Méret"
|
||||
annotations = "Megjegyzések"
|
||||
images = "Képek"
|
||||
links = "Hivatkozások"
|
||||
fonts = "Betűtípusok"
|
||||
xobjects = "XObject-ek száma"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Oldalak"
|
||||
fileSize = "Fájlméret"
|
||||
pdfVersion = "PDF-verzió"
|
||||
language = "Nyelv"
|
||||
title = "PDF-összefoglaló"
|
||||
author = "Szerző"
|
||||
created = "Létrehozva"
|
||||
modified = "Módosítva"
|
||||
permsAll = "Minden jogosultság engedélyezve"
|
||||
permsRestricted = "{{count}} korlátozás"
|
||||
permsMixed = "Néhány jogosultság korlátozott"
|
||||
hasCompliance = "Megfelelőségi szabványokkal rendelkezik"
|
||||
noCompliance = "Nincsenek megfelelőségi szabványok"
|
||||
basic = "Alapinformációk"
|
||||
documentInfo = "Dokumentuminformációk"
|
||||
securityTitle = "Biztonsági állapot"
|
||||
technical = "Technikai"
|
||||
overviewTitle = "PDF-áttekintés"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Titkosított PDF – jelszóvédelemmel"
|
||||
unencrypted = "Titkosítatlan PDF – nincs jelszóvédelem"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Képek"
|
||||
fonts = "Betűtípusok"
|
||||
formFields = "Űrlapmezők"
|
||||
embeddedFiles = "Beágyazott fájlok"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Rétegek"
|
||||
bookmarks = "Könyvjelzők"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "egy cím nélküli dokumentum"
|
||||
unknown = "Ismeretlen szerző"
|
||||
text = "Ez egy {{pages}} oldalas, {{title}} című PDF, amelyet {{author}} készített (PDF-verzió: {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Néhány fájlt nem sikerült feldolgozni."
|
||||
unexpected = "Váratlan hiba a kinyerés során."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Kinyerés befejezve"
|
||||
|
||||
[extractPage]
|
||||
tags = "kinyerés"
|
||||
@@ -5262,7 +5177,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 = "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ó."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Letöltés"
|
||||
@@ -5367,31 +5282,6 @@ error = "Nem sikerült frissíteni a felhasználói állapotot"
|
||||
success = "Felhasználó sikeresen törölve"
|
||||
error = "Nem sikerült törölni a felhasználót"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Jelszó módosítása"
|
||||
title = "Jelszó módosítása"
|
||||
subtitle = "Jelszó frissítése ehhez:"
|
||||
newPassword = "Új jelszó"
|
||||
confirmPassword = "Jelszó megerősítése"
|
||||
placeholder = "Adjon meg egy új jelszót"
|
||||
confirmPlaceholder = "Adja meg újra az új jelszót"
|
||||
passwordRequired = "Kérjük, adjon meg egy új jelszót"
|
||||
passwordMismatch = "A jelszavak nem egyeznek"
|
||||
generateRandom = "Biztonságos jelszó generálása"
|
||||
generatedPreview = "Generált jelszó:"
|
||||
copyTooltip = "Másolás a vágólapra"
|
||||
copiedToClipboard = "A jelszó a vágólapra másolva"
|
||||
copyFailed = "A jelszó másolása nem sikerült"
|
||||
sendEmail = "E-mail küldése a felhasználónak a változásról"
|
||||
includePassword = "Az új jelszó szerepeljen az e-mailben"
|
||||
forcePasswordChange = "A felhasználó kényszerítése a jelszó megváltoztatására a következő bejelentkezéskor"
|
||||
emailUnavailable = "Ennek a felhasználónak az e-mail címe érvénytelen. Az értesítések le vannak tiltva."
|
||||
smtpDisabled = "Az e-mail értesítésekhez az SMTP engedélyezése szükséges a beállításokban."
|
||||
notifyOnly = "E-mailt küldünk jelszó nélkül, amelyben értesítjük a felhasználót, hogy egy admin módosította a jelszót."
|
||||
submit = "Jelszó frissítése"
|
||||
success = "A jelszó sikeresen frissítve"
|
||||
error = "A jelszó frissítése nem sikerült"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-mail meghívó"
|
||||
description = "Írja be vagy illessze be alább az e-mail címeket, vesszővel elválasztva. A felhasználók e-mailben kapják meg a bejelentkezési adatokat."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Jelentkezzen be Stirling-fiókjával"
|
||||
[setup.selfhosted]
|
||||
title = "Bejelentkezés a szerverre"
|
||||
subtitle = "Adja meg a szerver hitelesítő adatait"
|
||||
link = "vagy csatlakozzon egy saját üzemeltetésű fiókhoz"
|
||||
|
||||
[setup.server]
|
||||
title = "Csatlakozás a szerverhez"
|
||||
@@ -5944,14 +5833,6 @@ description = "Adja meg az önhostolt Stirling PDF szerver teljes URL-jét"
|
||||
emptyUrl = "Adjon meg egy szerver URL-t"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "A bejelentkezés nincs engedélyezve"
|
||||
body = "Ezen a szerveren a bejelentkezés nincs engedélyezve. A csatlakozáshoz engedélyeznie kell a hitelesítést:"
|
||||
step1 = "Állítsa be a DOCKER_ENABLE_SECURITY=true értéket a környezetében"
|
||||
step2 = "Vagy állítsa be a security.enableLogin=true értéket a settings.yml fájlban"
|
||||
step3 = "Indítsa újra a szervert"
|
||||
|
||||
[setup.login]
|
||||
title = "Bejelentkezés"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Korai hozzáférés"
|
||||
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"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Szöveg automatikus méretezése a dobozokhoz"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ez az alfa néző még fejlődik—bizonyos betűtípusok, színek, át
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nincs dokumentum betöltve"
|
||||
subtitle = "Töltsön be egy PDF- vagy JSON-fájlt a szövegtartalom szerkesztésének megkezdéséhez."
|
||||
dropzone = "Húzzon ide egy PDF vagy JSON fájlt, vagy kattintson a tallózáshoz"
|
||||
dropzoneWithFiles = "Válasszon fájlt a Fájlok fülön, vagy húzzon ide egy PDF vagy JSON fájlt, illetve kattintson a tallózáshoz"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Üdvözöljük a PDF Text Editorben (korai hozzáférés)"
|
||||
|
||||
@@ -353,7 +353,7 @@ title = "Konfigurasi"
|
||||
systemSettings = "Pengaturan Sistem"
|
||||
features = "Fitur"
|
||||
endpoints = "Endpoint"
|
||||
database = "Basis Data"
|
||||
database = "Database"
|
||||
advanced = "Lanjutan"
|
||||
|
||||
[settings.securityAuth]
|
||||
@@ -3036,91 +3036,6 @@ title = "Dapatkan Info tentang PDF"
|
||||
header = "Dapatkan Info tentang PDF"
|
||||
submit = "Dapatkan Info"
|
||||
downloadJson = "Unduh JSON"
|
||||
processing = "Mengekstrak informasi..."
|
||||
results = "Hasil"
|
||||
noResults = "Jalankan alat untuk menghasilkan laporan."
|
||||
downloads = "Unduhan"
|
||||
noneDetected = "Tidak ada yang terdeteksi"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Ringkasan informasi lengkap"
|
||||
shortTitle = "Informasi PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Bidang Formulir"
|
||||
basicInfo = "Info Dasar"
|
||||
documentInfo = "Info Dokumen"
|
||||
compliance = "Kepatuhan"
|
||||
encryption = "Enkripsi"
|
||||
permissions = "Izin"
|
||||
other = "Lainnya"
|
||||
perPageInfo = "Info per Halaman"
|
||||
tableOfContents = "Daftar Isi"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Lampiran"
|
||||
embeddedFiles = "File Tertanam"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lapisan"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Ukuran"
|
||||
annotations = "Anotasi"
|
||||
images = "Gambar"
|
||||
links = "Tautan"
|
||||
fonts = "Font"
|
||||
xobjects = "Jumlah XObject"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Halaman"
|
||||
fileSize = "Ukuran File"
|
||||
pdfVersion = "Versi PDF"
|
||||
language = "Bahasa"
|
||||
title = "Ringkasan PDF"
|
||||
author = "Penulis"
|
||||
created = "Dibuat"
|
||||
modified = "Diubah"
|
||||
permsAll = "Semua izin diperbolehkan"
|
||||
permsRestricted = "{{count}} pembatasan"
|
||||
permsMixed = "Beberapa izin dibatasi"
|
||||
hasCompliance = "Memiliki standar kepatuhan"
|
||||
noCompliance = "Tidak ada standar kepatuhan"
|
||||
basic = "Informasi Dasar"
|
||||
documentInfo = "Informasi Dokumen"
|
||||
securityTitle = "Status Keamanan"
|
||||
technical = "Teknis"
|
||||
overviewTitle = "Gambaran Umum PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF terenkripsi - Perlindungan kata sandi aktif"
|
||||
unencrypted = "PDF tidak terenkripsi - Tanpa perlindungan kata sandi"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Gambar"
|
||||
fonts = "Font"
|
||||
formFields = "Bidang Formulir"
|
||||
embeddedFiles = "File Tertanam"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lapisan"
|
||||
bookmarks = "Bookmark"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "dokumen tanpa judul"
|
||||
unknown = "Penulis tidak diketahui"
|
||||
text = "Ini adalah PDF {{pages}} halaman berjudul {{title}} yang dibuat oleh {{author}} (versi PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Beberapa file tidak dapat diproses."
|
||||
unexpected = "Kesalahan tak terduga saat ekstraksi."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Ekstraksi selesai"
|
||||
|
||||
[extractPage]
|
||||
tags = "ekstrak"
|
||||
@@ -4390,7 +4305,7 @@ label = "Blokir Pendaftaran"
|
||||
description = "Cegah pendaftaran pengguna baru melalui SAML2"
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Basis Data"
|
||||
title = "Database"
|
||||
description = "Konfigurasikan pengaturan koneksi database kustom untuk penerapan enterprise."
|
||||
configuration = "Konfigurasi Database"
|
||||
|
||||
@@ -5262,7 +5177,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 meningkatkan skala tanpa gangguan, kami merekomendasikan paket Stirling Server - <strong>pengguna tanpa batas</strong> dan <strong>dukungan SSO</strong> seharga $99/server/mo."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Unduh"
|
||||
@@ -5367,31 +5282,6 @@ error = "Gagal memperbarui status pengguna"
|
||||
success = "Pengguna berhasil dihapus"
|
||||
error = "Gagal menghapus pengguna"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Ubah kata sandi"
|
||||
title = "Ubah kata sandi"
|
||||
subtitle = "Perbarui kata sandi untuk"
|
||||
newPassword = "Kata sandi baru"
|
||||
confirmPassword = "Konfirmasi kata sandi"
|
||||
placeholder = "Masukkan kata sandi baru"
|
||||
confirmPlaceholder = "Masukkan ulang kata sandi baru"
|
||||
passwordRequired = "Silakan masukkan kata sandi baru"
|
||||
passwordMismatch = "Kata sandi tidak cocok"
|
||||
generateRandom = "Buat kata sandi aman"
|
||||
generatedPreview = "Kata sandi yang dibuat:"
|
||||
copyTooltip = "Salin ke papan klip"
|
||||
copiedToClipboard = "Kata sandi disalin ke papan klip"
|
||||
copyFailed = "Gagal menyalin kata sandi"
|
||||
sendEmail = "Kirim email kepada pengguna tentang perubahan ini"
|
||||
includePassword = "Sertakan kata sandi baru dalam email"
|
||||
forcePasswordChange = "Paksa pengguna mengganti kata sandi saat login berikutnya"
|
||||
emailUnavailable = "Email pengguna ini bukan alamat email yang valid. Notifikasi dinonaktifkan."
|
||||
smtpDisabled = "Notifikasi email memerlukan SMTP diaktifkan di pengaturan."
|
||||
notifyOnly = "Email akan dikirim tanpa kata sandi, memberi tahu pengguna bahwa admin telah mengubahnya."
|
||||
submit = "Perbarui kata sandi"
|
||||
success = "Kata sandi berhasil diperbarui"
|
||||
error = "Gagal memperbarui kata sandi"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Undangan Email"
|
||||
description = "Ketik atau tempel email di bawah, dipisahkan dengan koma. Pengguna akan menerima kredensial login melalui email."
|
||||
@@ -5543,7 +5433,7 @@ hideComparison = "Sembunyikan Perbandingan Fitur"
|
||||
featureComparison = "Perbandingan Fitur"
|
||||
from = "Mulai"
|
||||
perMonth = "/bulan"
|
||||
perSeat = "/pengguna"
|
||||
perSeat = "/seat"
|
||||
withServer = "+ Paket Server"
|
||||
licensedSeats = "Berlisensi: {{count}} seat"
|
||||
includedInCurrent = "Termasuk dalam Paket Anda"
|
||||
@@ -5704,7 +5594,7 @@ modalTitle = "Mulai - {{planName}}"
|
||||
title = "Pilih Periode Penagihan"
|
||||
savingsNote = "Hemat {{percent}}% dengan penagihan tahunan"
|
||||
basePrice = "Harga Dasar"
|
||||
seatPrice = "Per Pengguna"
|
||||
seatPrice = "Per Seat"
|
||||
totalForSeats = "Total ({{count}} seat)"
|
||||
selectMonthly = "Pilih Bulanan"
|
||||
selectYearly = "Pilih Tahunan"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Masuk dengan akun Stirling Anda"
|
||||
[setup.selfhosted]
|
||||
title = "Masuk ke Server"
|
||||
subtitle = "Masukkan kredensial server Anda"
|
||||
link = "atau hubungkan ke akun self-hosted"
|
||||
|
||||
[setup.server]
|
||||
title = "Sambungkan ke Server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Masukkan URL lengkap server Stirling PDF self-hosted Anda"
|
||||
emptyUrl = "Masukkan URL server"
|
||||
unreachable = "Tidak dapat terhubung ke server"
|
||||
testFailed = "Tes koneksi gagal"
|
||||
configFetch = "Gagal mengambil konfigurasi server. Periksa URL dan coba lagi."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Login Tidak Diaktifkan"
|
||||
body = "Server ini tidak mengaktifkan login. Untuk terhubung ke server ini, Anda harus mengaktifkan autentikasi:"
|
||||
step1 = "Setel DOCKER_ENABLE_SECURITY=true di lingkungan Anda"
|
||||
step2 = "Atau setel security.enableLogin=true di settings.yml"
|
||||
step3 = "Mulai ulang server"
|
||||
|
||||
[setup.login]
|
||||
title = "Masuk"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Akses Awal"
|
||||
reset = "Reset Perubahan"
|
||||
downloadJson = "Unduh JSON"
|
||||
generatePdf = "Buat PDF"
|
||||
saveChanges = "Simpan Perubahan"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Sesuaikan teks otomatis ke kotak"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Penampil alpha ini masih berkembang—beberapa font, warna, efek transp
|
||||
[pdfTextEditor.empty]
|
||||
title = "Tidak ada dokumen dimuat"
|
||||
subtitle = "Muat file PDF atau JSON untuk mulai mengedit konten teks."
|
||||
dropzone = "Seret dan letakkan file PDF atau JSON di sini, atau klik untuk memilih"
|
||||
dropzoneWithFiles = "Pilih file dari tab File, atau seret dan letakkan file PDF atau JSON di sini, atau klik untuk memilih"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Selamat datang di PDF Text Editor (Akses Awal)"
|
||||
|
||||
@@ -1408,7 +1408,7 @@ arabic = "Arabo"
|
||||
japanese = "Giapponese"
|
||||
korean = "Coreano"
|
||||
chinese = "Cinese"
|
||||
thai = "Tailandese"
|
||||
thai = "Thai"
|
||||
|
||||
[watermark.steps]
|
||||
type = "Tipo di filigrana"
|
||||
@@ -3036,91 +3036,6 @@ title = "Ottieni informazioni in PDF"
|
||||
header = "Ottieni informazioni in PDF"
|
||||
submit = "Ottieni informazioni"
|
||||
downloadJson = "Scarica JSON"
|
||||
processing = "Estrazione delle informazioni in corso..."
|
||||
results = "Risultati"
|
||||
noResults = "Esegui lo strumento per generare un report."
|
||||
downloads = "Download"
|
||||
noneDetected = "Nessuno rilevato"
|
||||
indexTitle = "Indice"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Riepilogo completo delle informazioni"
|
||||
shortTitle = "Informazioni PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadati"
|
||||
formFields = "Campi del modulo"
|
||||
basicInfo = "Informazioni di base"
|
||||
documentInfo = "Informazioni sul documento"
|
||||
compliance = "Conformità"
|
||||
encryption = "Crittografia"
|
||||
permissions = "Autorizzazioni"
|
||||
other = "Altro"
|
||||
perPageInfo = "Info per pagina"
|
||||
tableOfContents = "Sommario"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Allegati"
|
||||
embeddedFiles = "File incorporati"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Livelli"
|
||||
structureTree = "Albero della struttura"
|
||||
xmp = "Metadati XMP"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Dimensioni"
|
||||
annotations = "Annotazioni"
|
||||
images = "Immagini"
|
||||
links = "Link"
|
||||
fonts = "Font"
|
||||
xobjects = "Conteggi XObject"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pagine"
|
||||
fileSize = "Dimensione file"
|
||||
pdfVersion = "Versione PDF"
|
||||
language = "Lingua"
|
||||
title = "Riepilogo PDF"
|
||||
author = "Autore"
|
||||
created = "Creato"
|
||||
modified = "Modificato"
|
||||
permsAll = "Tutte le autorizzazioni consentite"
|
||||
permsRestricted = "{{count}} restrizioni"
|
||||
permsMixed = "Alcune autorizzazioni limitate"
|
||||
hasCompliance = "Conforme agli standard"
|
||||
noCompliance = "Nessuno standard di conformità"
|
||||
basic = "Informazioni di base"
|
||||
documentInfo = "Informazioni sul documento"
|
||||
securityTitle = "Stato della sicurezza"
|
||||
technical = "Tecnico"
|
||||
overviewTitle = "Panoramica PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF crittografato - Protezione tramite password presente"
|
||||
unencrypted = "PDF non crittografato - Nessuna protezione tramite password"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Immagini"
|
||||
fonts = "Font"
|
||||
formFields = "Campi del modulo"
|
||||
embeddedFiles = "File incorporati"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Livelli"
|
||||
bookmarks = "Segnalibri"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "un documento senza titolo"
|
||||
unknown = "Autore sconosciuto"
|
||||
text = "Questo è un PDF di {{pages}} pagine intitolato {{title}} creato da {{author}} (versione PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Non è stato possibile elaborare alcuni file."
|
||||
unexpected = "Errore imprevisto durante l'estrazione."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Estrazione completata"
|
||||
|
||||
[extractPage]
|
||||
tags = "estrarre"
|
||||
@@ -4261,7 +4176,7 @@ description = "Traccia azioni degli utenti ed eventi di sistema per conformità
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Livello audit"
|
||||
description = "0=SPENTO, 1=BASE, 2=STANDARD, 3=DETTAGLIATO"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Conservazione audit (giorni)"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Esegui upgrade ora →"
|
||||
freeTitle = "Licenza server"
|
||||
overLimitTitle = "Licenza server necessaria"
|
||||
overLimitBody = "La nostra licenza consente fino a <strong>{{freeTierLimit}}</strong> utenti gratuiti per server. Hai <strong>{{overLimitUserCopy}}</strong> utenti Stirling. Per continuare senza interruzioni, esegui l'upgrade al piano Stirling Server - <strong>posti illimitati</strong>, modifica del testo PDF e pieno controllo admin a $99/server/mese."
|
||||
freeBody = "La nostra licenza <strong>Open-Core</strong> consente fino a <strong>{{freeTierLimit}}</strong> utenti gratuiti per server. Per scalare senza interruzioni, consigliamo il piano Stirling Server - <strong>posti illimitati</strong> e <strong>supporto SSO</strong> a $99/server/mese."
|
||||
freeBody = "La nostra licenza <strong>Open-Core</strong> consente fino a <strong>{{freeTierLimit}}</strong> utenti gratuiti per server. Per scalare senza interruzioni e ottenere accesso anticipato al nuovo <strong>strumento di modifica testo PDF</strong>, consigliamo il piano Stirling Server - modifica completa e <strong>posti illimitati</strong> a $99/server/mese."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5367,31 +5282,6 @@ error = "Impossibile aggiornare lo stato utente"
|
||||
success = "Utente eliminato con successo"
|
||||
error = "Impossibile eliminare l'utente"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Cambia password"
|
||||
title = "Cambia password"
|
||||
subtitle = "Aggiorna la password per"
|
||||
newPassword = "Nuova password"
|
||||
confirmPassword = "Conferma password"
|
||||
placeholder = "Inserisci una nuova password"
|
||||
confirmPlaceholder = "Reinserisci la nuova password"
|
||||
passwordRequired = "Inserisci una nuova password"
|
||||
passwordMismatch = "Le password non coincidono"
|
||||
generateRandom = "Genera password sicura"
|
||||
generatedPreview = "Password generata:"
|
||||
copyTooltip = "Copia negli appunti"
|
||||
copiedToClipboard = "Password copiata negli appunti"
|
||||
copyFailed = "Impossibile copiare la password"
|
||||
sendEmail = "Invia un'email all'utente riguardo a questa modifica"
|
||||
includePassword = "Includi la nuova password nell'email"
|
||||
forcePasswordChange = "Obbliga l'utente a cambiare password al prossimo accesso"
|
||||
emailUnavailable = "L'email di questo utente non è un indirizzo valido. Le notifiche sono disabilitate."
|
||||
smtpDisabled = "Le notifiche email richiedono che SMTP sia abilitato nelle impostazioni."
|
||||
notifyOnly = "Verrà inviata un'email senza la password, informando l'utente che un amministratore l'ha modificata."
|
||||
submit = "Aggiorna password"
|
||||
success = "Password aggiornata correttamente"
|
||||
error = "Impossibile aggiornare la password"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Invito via email"
|
||||
description = "Digita o incolla le email qui sotto, separate da virgole. Gli utenti riceveranno le credenziali di accesso via email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Accedi con il tuo account Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Accedi al server"
|
||||
subtitle = "Inserisci le credenziali del server"
|
||||
link = "oppure connettiti a un account self-hosted"
|
||||
|
||||
[setup.server]
|
||||
title = "Connetti al server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Inserisci l'URL completo del tuo server Stirling PDF self-hosted"
|
||||
emptyUrl = "Inserisci un URL del server"
|
||||
unreachable = "Impossibile connettersi al server"
|
||||
testFailed = "Test di connessione non riuscito"
|
||||
configFetch = "Impossibile recuperare la configurazione del server. Controlla l'URL e riprova."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Accesso non abilitato"
|
||||
body = "L'accesso non è abilitato su questo server. Per connetterti, devi abilitare l'autenticazione:"
|
||||
step1 = "Imposta DOCKER_ENABLE_SECURITY=true nel tuo ambiente"
|
||||
step2 = "Oppure imposta security.enableLogin=true in settings.yml"
|
||||
step3 = "Riavvia il server"
|
||||
|
||||
[setup.login]
|
||||
title = "Accedi"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Accesso anticipato"
|
||||
reset = "Reimposta modifiche"
|
||||
downloadJson = "Scarica JSON"
|
||||
generatePdf = "Genera PDF"
|
||||
saveChanges = "Salva modifiche"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Ridimensiona automaticamente il testo alle caselle"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Questo visualizzatore alpha è in evoluzione: alcuni font, colori, effe
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nessun documento caricato"
|
||||
subtitle = "Carica un file PDF o JSON per iniziare a modificare il testo."
|
||||
dropzone = "Trascina qui un file PDF o JSON oppure fai clic per sfogliare"
|
||||
dropzoneWithFiles = "Seleziona un file dalla scheda File oppure trascina qui un file PDF o JSON, o fai clic per sfogliare"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Benvenuto in PDF Text Editor (Accesso anticipato)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDFの情報を入手"
|
||||
header = "PDFの情報を入手"
|
||||
submit = "情報を入手"
|
||||
downloadJson = "JSONでダウンロード"
|
||||
processing = "情報を抽出しています..."
|
||||
results = "結果"
|
||||
noResults = "レポートを生成するにはツールを実行してください。"
|
||||
downloads = "ダウンロード"
|
||||
noneDetected = "検出なし"
|
||||
indexTitle = "インデックス"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "全情報の概要"
|
||||
shortTitle = "PDF情報"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "メタデータ"
|
||||
formFields = "フォームフィールド"
|
||||
basicInfo = "基本情報"
|
||||
documentInfo = "ドキュメント情報"
|
||||
compliance = "準拠"
|
||||
encryption = "暗号化"
|
||||
permissions = "権限"
|
||||
other = "その他"
|
||||
perPageInfo = "ページごとの情報"
|
||||
tableOfContents = "目次"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "添付ファイル"
|
||||
embeddedFiles = "埋め込みファイル"
|
||||
javaScript = "JavaScript"
|
||||
layers = "レイヤー"
|
||||
structureTree = "構造ツリー"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "サイズ"
|
||||
annotations = "注釈"
|
||||
images = "画像"
|
||||
links = "リンク"
|
||||
fonts = "フォント"
|
||||
xobjects = "XObject の数"
|
||||
multimedia = "マルチメディア"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "ページ数"
|
||||
fileSize = "ファイルサイズ"
|
||||
pdfVersion = "PDF バージョン"
|
||||
language = "言語"
|
||||
title = "PDF 概要"
|
||||
author = "作成者"
|
||||
created = "作成日"
|
||||
modified = "更新日"
|
||||
permsAll = "すべての権限が許可されています"
|
||||
permsRestricted = "{{count}} 件の制限"
|
||||
permsMixed = "一部の権限が制限されています"
|
||||
hasCompliance = "準拠規格あり"
|
||||
noCompliance = "準拠規格なし"
|
||||
basic = "基本情報"
|
||||
documentInfo = "ドキュメント情報"
|
||||
securityTitle = "セキュリティ状態"
|
||||
technical = "技術情報"
|
||||
overviewTitle = "PDF 概要"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "暗号化された PDF - パスワード保護あり"
|
||||
unencrypted = "暗号化されていない PDF - パスワード保護なし"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "画像"
|
||||
fonts = "フォント"
|
||||
formFields = "フォームフィールド"
|
||||
embeddedFiles = "埋め込みファイル"
|
||||
javaScript = "JavaScript"
|
||||
layers = "レイヤー"
|
||||
bookmarks = "ブックマーク"
|
||||
multimedia = "マルチメディア"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "無題のドキュメント"
|
||||
unknown = "不明な作成者"
|
||||
text = "これは {{author}} によって作成された、タイトル {{title}} の {{pages}} ページの PDF です(PDF バージョン {{version}})。"
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "一部のファイルを処理できませんでした。"
|
||||
unexpected = "抽出中に予期しないエラーが発生しました。"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "抽出が完了しました"
|
||||
|
||||
[extractPage]
|
||||
tags = "抽出"
|
||||
@@ -5262,7 +5177,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>ユーザーまで無料でご利用いただけます。中断なくスケールするには、Stirling Server プランをおすすめします - <strong>無制限の席数</strong>と<strong>SSO サポート</strong>で $99/サーバー/月。"
|
||||
freeBody = "当社の <strong>オープンコア</strong> ライセンスでは、サーバーごとに最大 <strong>{{freeTierLimit}}</strong> ユーザーまで無料です。中断なく拡張し、新しい <strong>PDF テキスト編集ツール</strong> に早期アクセスするには、Stirling Server プランをお勧めします。完全編集と <strong>無制限席数</strong> が $99/サーバー/月 です。"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "ダウンロード"
|
||||
@@ -5367,31 +5282,6 @@ error = "ユーザーのステータスの更新に失敗しました"
|
||||
success = "ユーザーを削除しました"
|
||||
error = "ユーザーの削除に失敗しました"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "パスワードを変更"
|
||||
title = "パスワードを変更"
|
||||
subtitle = "のパスワードを更新"
|
||||
newPassword = "新しいパスワード"
|
||||
confirmPassword = "パスワードの確認"
|
||||
placeholder = "新しいパスワードを入力"
|
||||
confirmPlaceholder = "新しいパスワードを再入力"
|
||||
passwordRequired = "新しいパスワードを入力してください"
|
||||
passwordMismatch = "パスワードが一致しません"
|
||||
generateRandom = "安全なパスワードを生成"
|
||||
generatedPreview = "生成されたパスワード:"
|
||||
copyTooltip = "クリップボードにコピー"
|
||||
copiedToClipboard = "パスワードをクリップボードにコピーしました"
|
||||
copyFailed = "パスワードのコピーに失敗しました"
|
||||
sendEmail = "この変更についてユーザーにメールする"
|
||||
includePassword = "メールに新しいパスワードを含める"
|
||||
forcePasswordChange = "次回ログイン時にユーザーにパスワード変更を強制する"
|
||||
emailUnavailable = "このユーザーのメールは有効なメールアドレスではありません。通知は無効です。"
|
||||
smtpDisabled = "メール通知には設定で SMTP を有効にする必要があります。"
|
||||
notifyOnly = "パスワードを含めずにメールを送信し、管理者が変更したことをユーザーに知らせます。"
|
||||
submit = "パスワードを更新"
|
||||
success = "パスワードを更新しました"
|
||||
error = "パスワードの更新に失敗しました"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "メール招待"
|
||||
description = "下にメールアドレスをカンマ区切りで入力または貼り付けてください。ユーザーにはメールでログイン情報が届きます。"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Stirling アカウントでサインイン"
|
||||
[setup.selfhosted]
|
||||
title = "サーバーにサインイン"
|
||||
subtitle = "サーバーの認証情報を入力"
|
||||
link = "またはセルフホスト型アカウントに接続"
|
||||
|
||||
[setup.server]
|
||||
title = "サーバーに接続"
|
||||
@@ -5944,14 +5833,6 @@ description = "セルフホストの Stirling PDF サーバーの完全な URL
|
||||
emptyUrl = "サーバー URL を入力してください"
|
||||
unreachable = "サーバーに接続できませんでした"
|
||||
testFailed = "接続テストに失敗しました"
|
||||
configFetch = "サーバー構成の取得に失敗しました。URL を確認して、もう一度お試しください。"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "ログインが有効になっていません"
|
||||
body = "このサーバーではログインが有効になっていません。このサーバーに接続するには、認証を有効にする必要があります:"
|
||||
step1 = "環境で DOCKER_ENABLE_SECURITY=true を設定する"
|
||||
step2 = "または settings.yml で security.enableLogin=true を設定する"
|
||||
step3 = "サーバーを再起動する"
|
||||
|
||||
[setup.login]
|
||||
title = "サインイン"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "早期アクセス"
|
||||
reset = "変更をリセット"
|
||||
downloadJson = "JSON をダウンロード"
|
||||
generatePdf = "PDF を生成"
|
||||
saveChanges = "変更を保存"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ボックスに収まるようテキストを自動スケール"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "このアルファ版ビューアは開発途上です。一部のフ
|
||||
[pdfTextEditor.empty]
|
||||
title = "ドキュメントが読み込まれていません"
|
||||
subtitle = "テキスト編集を開始するにはPDFまたはJSONファイルを読み込んでください。"
|
||||
dropzone = "ここに PDF または JSON ファイルをドラッグ&ドロップするか、クリックして参照"
|
||||
dropzoneWithFiles = "ファイルタブからファイルを選択するか、ここに PDF または JSON ファイルをドラッグ&ドロップするか、クリックして参照"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor(早期アクセス)へようこそ"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF 정보 가져오기"
|
||||
header = "PDF 정보 가져오기"
|
||||
submit = "정보 가져오기"
|
||||
downloadJson = "JSON 다운로드"
|
||||
processing = "정보를 추출하는 중..."
|
||||
results = "결과"
|
||||
noResults = "보고서를 생성하려면 도구를 실행하세요."
|
||||
downloads = "다운로드"
|
||||
noneDetected = "감지되지 않음"
|
||||
indexTitle = "색인"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "전체 정보 요약"
|
||||
shortTitle = "PDF 정보"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "메타데이터"
|
||||
formFields = "양식 필드"
|
||||
basicInfo = "기본 정보"
|
||||
documentInfo = "문서 정보"
|
||||
compliance = "규격 준수"
|
||||
encryption = "암호화"
|
||||
permissions = "권한"
|
||||
other = "기타"
|
||||
perPageInfo = "페이지별 정보"
|
||||
tableOfContents = "목차"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "첨부 파일"
|
||||
embeddedFiles = "내장 파일"
|
||||
javaScript = "JavaScript"
|
||||
layers = "레이어"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "크기"
|
||||
annotations = "주석"
|
||||
images = "이미지"
|
||||
links = "링크"
|
||||
fonts = "글꼴"
|
||||
xobjects = "XObject 개수"
|
||||
multimedia = "멀티미디어"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "페이지 수"
|
||||
fileSize = "파일 크기"
|
||||
pdfVersion = "PDF 버전"
|
||||
language = "언어"
|
||||
title = "PDF 요약"
|
||||
author = "작성자"
|
||||
created = "생성됨"
|
||||
modified = "수정됨"
|
||||
permsAll = "모든 권한 허용"
|
||||
permsRestricted = "{{count}}개의 제한"
|
||||
permsMixed = "일부 권한이 제한됨"
|
||||
hasCompliance = "규격 준수 기준 있음"
|
||||
noCompliance = "규격 준수 기준 없음"
|
||||
basic = "기본 정보"
|
||||
documentInfo = "문서 정보"
|
||||
securityTitle = "보안 상태"
|
||||
technical = "기술 정보"
|
||||
overviewTitle = "PDF 개요"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "암호화된 PDF - 암호 보호 적용"
|
||||
unencrypted = "암호화되지 않은 PDF - 암호 보호 없음"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "이미지"
|
||||
fonts = "글꼴"
|
||||
formFields = "양식 필드"
|
||||
embeddedFiles = "내장 파일"
|
||||
javaScript = "JavaScript"
|
||||
layers = "레이어"
|
||||
bookmarks = "북마크"
|
||||
multimedia = "멀티미디어"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "제목 없는 문서"
|
||||
unknown = "알 수 없는 작성자"
|
||||
text = "이 문서는 {{pages}}페이지 분량의 PDF로, 제목은 {{title}}이며 작성자는 {{author}}입니다(PDF 버전 {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "일부 파일을 처리하지 못했습니다."
|
||||
unexpected = "추출 중 예기치 않은 오류가 발생했습니다."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "추출 완료"
|
||||
|
||||
[extractPage]
|
||||
tags = "추출"
|
||||
@@ -5262,7 +5177,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>명의 사용자를 무료로 허용합니다. 중단 없이 확장하려면 Stirling Server 플랜을 권장합니다 - <strong>무제한 좌석</strong> 및 <strong>SSO 지원</strong>, $99/서버/월."
|
||||
freeBody = "당사의 <strong>Open-Core</strong> 라이선스는 서버당 최대 <strong>{{freeTierLimit}}</strong>명의 사용자를 무료로 허용합니다. 중단 없이 확장하고 새로운 <strong>PDF 텍스트 편집 도구</strong>에 조기 액세스하려면 Stirling Server 플랜을 권장합니다 - 전체 편집과 <strong>무제한 좌석</strong>을 $99/서버/월에 제공합니다."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "다운로드"
|
||||
@@ -5367,31 +5282,6 @@ error = "사용자 상태 업데이트에 실패했습니다"
|
||||
success = "사용자를 성공적으로 삭제했습니다"
|
||||
error = "사용자 삭제에 실패했습니다"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "비밀번호 변경"
|
||||
title = "비밀번호 변경"
|
||||
subtitle = "다음 사용자의 비밀번호 업데이트"
|
||||
newPassword = "새 비밀번호"
|
||||
confirmPassword = "비밀번호 확인"
|
||||
placeholder = "새 비밀번호를 입력하세요"
|
||||
confirmPlaceholder = "새 비밀번호를 다시 입력하세요"
|
||||
passwordRequired = "새 비밀번호를 입력해 주세요"
|
||||
passwordMismatch = "비밀번호가 일치하지 않습니다"
|
||||
generateRandom = "안전한 비밀번호 생성"
|
||||
generatedPreview = "생성된 비밀번호:"
|
||||
copyTooltip = "클립보드에 복사"
|
||||
copiedToClipboard = "비밀번호를 클립보드에 복사했습니다"
|
||||
copyFailed = "비밀번호 복사 실패"
|
||||
sendEmail = "이 변경 사항을 사용자에게 이메일로 알리기"
|
||||
includePassword = "이메일에 새 비밀번호 포함"
|
||||
forcePasswordChange = "다음 로그인 시 비밀번호 변경 강제"
|
||||
emailUnavailable = "이 사용자의 이메일이 올바른 주소가 아니므로 알림이 비활성화되었습니다."
|
||||
smtpDisabled = "이메일 알림을 사용하려면 설정에서 SMTP를 활성화해야 합니다."
|
||||
notifyOnly = "비밀번호 없이 이메일이 발송되며, 관리자가 변경했음을 사용자에게 알려 줍니다."
|
||||
submit = "비밀번호 업데이트"
|
||||
success = "비밀번호가 성공적으로 업데이트되었습니다"
|
||||
error = "비밀번호 업데이트에 실패했습니다"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "이메일 초대"
|
||||
description = "아래에 이메일을 쉼표로 구분해 입력하거나 붙여넣으세요. 사용자는 이메일로 로그인 자격 증명을 받습니다."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Stirling 계정으로 로그인"
|
||||
[setup.selfhosted]
|
||||
title = "서버에 로그인"
|
||||
subtitle = "서버 자격 증명을 입력하세요"
|
||||
link = "또는 셀프 호스팅 계정에 연결"
|
||||
|
||||
[setup.server]
|
||||
title = "서버에 연결"
|
||||
@@ -5944,14 +5833,6 @@ description = "자가 호스팅 Stirling PDF 서버의 전체 URL을 입력하
|
||||
emptyUrl = "서버 URL을 입력하세요"
|
||||
unreachable = "서버에 연결할 수 없습니다"
|
||||
testFailed = "연결 테스트에 실패했습니다"
|
||||
configFetch = "서버 구성을 가져오지 못했습니다. URL을 확인하고 다시 시도하세요."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "로그인이 활성화되어 있지 않음"
|
||||
body = "이 서버에는 로그인이 활성화되어 있지 않습니다. 이 서버에 연결하려면 인증을 활성화해야 합니다:"
|
||||
step1 = "환경에서 DOCKER_ENABLE_SECURITY=true를 설정하세요"
|
||||
step2 = "또는 settings.yml에서 security.enableLogin=true를 설정하세요"
|
||||
step3 = "서버를 재시작하세요"
|
||||
|
||||
[setup.login]
|
||||
title = "로그인"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "얼리 액세스"
|
||||
reset = "변경 사항 초기화"
|
||||
downloadJson = "JSON 다운로드"
|
||||
generatePdf = "PDF 생성"
|
||||
saveChanges = "변경 사항 저장"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "텍스트 자동 크기 조정"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "이 알파 뷰어는 아직 발전 중입니다—일부 글꼴, 색상
|
||||
[pdfTextEditor.empty]
|
||||
title = "로드된 문서 없음"
|
||||
subtitle = "텍스트 편집을 시작하려면 PDF 또는 JSON 파일을 로드하세요."
|
||||
dropzone = "여기에 PDF 또는 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요"
|
||||
dropzoneWithFiles = "파일 탭에서 파일을 선택하거나, 여기에 PDF 또는 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF 텍스트 편집기(얼리 액세스)에 오신 것을 환영합니다"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF-നെക്കുറിച്ചുള്ള വിവരങ്ങ
|
||||
header = "PDF-നെക്കുറിച്ചുള്ള വിവരങ്ങൾ നേടുക"
|
||||
submit = "വിവരങ്ങൾ നേടുക"
|
||||
downloadJson = "JSON ഡൗൺലോഡ് ചെയ്യുക"
|
||||
processing = "വിവരങ്ങൾ പുറത്തെടുക്കുന്നു..."
|
||||
results = "ഫലങ്ങൾ"
|
||||
noResults = "ഒരു റിപ്പോർട്ട് സൃഷ്ടിക്കാൻ ഉപകരണം പ്രവർത്തിപ്പിക്കുക."
|
||||
downloads = "ഡൗൺലോഡുകൾ"
|
||||
noneDetected = "ഒന്നും കണ്ടെത്തിയില്ല"
|
||||
indexTitle = "സൂചിക"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "പൂർണ്ണ വിവര സംഗ്രഹം"
|
||||
shortTitle = "PDF വിവരം"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "മെറ്റാഡാറ്റ"
|
||||
formFields = "ഫോം ഫീൽഡുകൾ"
|
||||
basicInfo = "അടിസ്ഥാന വിവരം"
|
||||
documentInfo = "പ്രമാണ വിവരം"
|
||||
compliance = "അനുസരണം"
|
||||
encryption = "എൻക്രിപ്ഷൻ"
|
||||
permissions = "അനുമതികൾ"
|
||||
other = "മറ്റ്"
|
||||
perPageInfo = "ഓരോ പേജിലെ വിവരം"
|
||||
tableOfContents = "വിഷയസൂചിക"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "അറ്റാച്ച്മെന്റുകൾ"
|
||||
embeddedFiles = "എംബെഡ് ചെയ്ത ഫയലുകൾ"
|
||||
javaScript = "JavaScript"
|
||||
layers = "ലെയറുകൾ"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "വലുപ്പം"
|
||||
annotations = "അനോട്ടേഷനുകൾ"
|
||||
images = "ചിത്രങ്ങൾ"
|
||||
links = "ലിങ്കുകൾ"
|
||||
fonts = "ഫോണ്ടുകൾ"
|
||||
xobjects = "XObject എണ്ണങ്ങൾ"
|
||||
multimedia = "മൾട്ടിമീഡിയ"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "പേജുകൾ"
|
||||
fileSize = "ഫയൽ വലുപ്പം"
|
||||
pdfVersion = "PDF പതിപ്പ്"
|
||||
language = "ഭാഷ"
|
||||
title = "PDF സംഗ്രഹം"
|
||||
author = "രചയിതാവ്"
|
||||
created = "സൃഷ്ടിച്ചത്"
|
||||
modified = "തിരുത്തിയത്"
|
||||
permsAll = "എല്ലാ അനുമതികളും അനുവദിച്ചിട്ടുണ്ട്"
|
||||
permsRestricted = "{{count}} നിയന്ത്രണങ്ങൾ"
|
||||
permsMixed = "ചില അനുമതികൾ നിയന്ത്രിച്ചിരിക്കുന്നു"
|
||||
hasCompliance = "അനുസരണ മാനദണ്ഡങ്ങൾ ഉണ്ട്"
|
||||
noCompliance = "അനുസരണ മാനദണ്ഡങ്ങളില്ല"
|
||||
basic = "അടിസ്ഥാന വിവരം"
|
||||
documentInfo = "പ്രമാണ വിവരം"
|
||||
securityTitle = "സുരക്ഷാ നില"
|
||||
technical = "സാങ്കേതിക"
|
||||
overviewTitle = "PDF അവലോകനം"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "എൻക്രിപ്റ്റ് ചെയ്ത PDF - പാസ്വേഡ് സംരക്ഷണം ഉണ്ട്"
|
||||
unencrypted = "എൻക്രിപ്റ്റ് ചെയ്യാത്ത PDF - പാസ്വേഡ് സംരക്ഷണമില്ല"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "ചിത്രങ്ങൾ"
|
||||
fonts = "ഫോണ്ടുകൾ"
|
||||
formFields = "ഫോം ഫീൽഡുകൾ"
|
||||
embeddedFiles = "എംബെഡ് ചെയ്ത ഫയലുകൾ"
|
||||
javaScript = "JavaScript"
|
||||
layers = "ലെയറുകൾ"
|
||||
bookmarks = "ബുക്ക്മാർക്കുകൾ"
|
||||
multimedia = "മൾട്ടിമീഡിയ"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "ഒരു ശീർഷകമില്ലാത്ത പ്രമാണം"
|
||||
unknown = "അജ്ഞാത രചയിതാവ്"
|
||||
text = "ഇത് {{author}} സൃഷ്ടിച്ച, {{title}} എന്ന ശീർഷകമുള്ള {{pages}}-പേജ് PDF ആണ് (PDF പതിപ്പ് {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "ചില ഫയലുകൾ പ്രോസസ്സ് ചെയ്യാൻ കഴിഞ്ഞില്ല."
|
||||
unexpected = "പുറത്തെടുക്കുന്നതിനിടെ അപ്രതീക്ഷിത പിശക്."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "പുറത്തെടുക്കൽ പൂർത്തിയായി"
|
||||
|
||||
[extractPage]
|
||||
tags = "വേർതിരിച്ചെടുക്കുക"
|
||||
@@ -5262,7 +5177,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> ഉപയോക്താക്കളെ സൗജന്യമായി അനുവദിക്കുന്നു. തടസ്സമില്ലാതെ സ്കെയിൽ ചെയ്യാൻ, ഞങ്ങൾ Stirling Server പ്ലാൻ ശുപാർശ ചെയ്യുന്നു - <strong>പരിമിതിയില്ലാത്ത സീറ്റുകൾ</strong>യും <strong>SSO പിന്തുണ</strong>യും for $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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "ഡൗൺലോഡ്"
|
||||
@@ -5367,31 +5282,6 @@ error = "ഉപയോക്താവിന്റെ നില അപ്ഡേ
|
||||
success = "ഉപയോക്താവിനെ വിജയകരമായി ഇല്ലാതാക്കി"
|
||||
error = "ഉപയോക്താവിനെ ഇല്ലാതാക്കൽ പരാജയപ്പെട്ടു"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "പാസ്വേഡ് മാറ്റുക"
|
||||
title = "പാസ്വേഡ് മാറ്റുക"
|
||||
subtitle = "ഇതിനായുള്ള പാസ്വേഡ് പുതുക്കുക"
|
||||
newPassword = "പുതിയ പാസ്വേഡ്"
|
||||
confirmPassword = "പാസ്വേഡ് ശരിവെക്കുക"
|
||||
placeholder = "ഒരു പുതിയ പാസ്വേഡ് നൽകുക"
|
||||
confirmPlaceholder = "പുതിയ പാസ്വേഡ് വീണ്ടും നൽകുക"
|
||||
passwordRequired = "ദയവായി ഒരു പുതിയ പാസ്വേഡ് നൽകുക"
|
||||
passwordMismatch = "പാസ്വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"
|
||||
generateRandom = "സുരക്ഷിത പാസ്വേഡ് സൃഷ്ടിക്കുക"
|
||||
generatedPreview = "സൃഷ്ടിച്ച പാസ്വേഡ്:"
|
||||
copyTooltip = "ക്ലിപ്പ്ബോർഡിലേയ്ക്ക് പകർത്തുക"
|
||||
copiedToClipboard = "പാസ്വേഡ് ക്ലിപ്പ്ബോർഡിലേയ്ക്ക് പകർത്തി"
|
||||
copyFailed = "പാസ്വേഡ് പകർത്തൽ പരാജയപ്പെട്ടു"
|
||||
sendEmail = "ഈ മാറ്റത്തെക്കുറിച്ച് ഉപയോക്താവിന് ഇമെയിൽ അയയ്ക്കുക"
|
||||
includePassword = "പുതിയ പാസ്വേഡ് ഇമെയിലിൽ ഉൾപ്പെടുത്തുക"
|
||||
forcePasswordChange = "അടുത്ത ലോഗിനിൽ ഉപയോക്താവിനെ പാസ്വേഡ് മാറ്റാൻ നിർബന്ധിക്കുക"
|
||||
emailUnavailable = "ഈ ഉപയോക്താവിന്റെ ഇമെയിൽ ഒരു സാധുവായ ഇമെയിൽ വിലാസമല്ല. അറിയിപ്പുകൾ പ്രവർത്തനരഹിതമാണ്."
|
||||
smtpDisabled = "ഇമെയിൽ അറിയിപ്പുകൾക്കായി ക്രമീകരണങ്ങളിൽ SMTP സജീവമാക്കണം."
|
||||
notifyOnly = "പാസ്വേഡ് ഇല്ലാതെ ഒരു ഇമെയിൽ അയയ്ക്കപ്പെടും; അഡ്മിൻ അത് മാറ്റിയതായി ഉപയോക്താവിനെ അറിയിക്കും."
|
||||
submit = "പാസ്വേഡ് പുതുക്കുക"
|
||||
success = "പാസ്വേഡ് വിജയകരമായി പുതുക്കി"
|
||||
error = "പാസ്വേഡ് പുതുക്കൽ പരാജയപ്പെട്ടു"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "ഇമെയിൽ ക്ഷണം"
|
||||
description = "താഴെ ഇമെയിലുകൾ കോമ ഉപയോഗിച്ച് വേർതിരിച്ച് ടൈപ്പ് ചെയ്യുകയോ പതിക്കുകയോ ചെയ്യുക. ഉപയോക്താക്കൾക്ക് ലോഗിൻ വിവരങ്ങൾ ഇമെയിലിലൂടെ ലഭിക്കും."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "നിങ്ങളുടെ Stirling അക്കൗണ്ടില
|
||||
[setup.selfhosted]
|
||||
title = "സെർവറിൽ സൈൻ ഇൻ ചെയ്യുക"
|
||||
subtitle = "നിങ്ങളുടെ സെർവർ ക്രെഡൻഷ്യലുകൾ നൽകുക"
|
||||
link = "അല്ലെങ്കിൽ സ്വയം-ഹോസ്റ്റുചെയ്ത അക്കൗണ്ടുമായി ബന്ധിപ്പിക്കുക"
|
||||
|
||||
[setup.server]
|
||||
title = "സെർവറിലേക്ക് കണക്റ്റുചെയ്യുക"
|
||||
@@ -5944,14 +5833,6 @@ description = "നിങ്ങളുടെ സെൽഫ്-ഹോസ്റ്റ
|
||||
emptyUrl = "ദയവായി ഒരു സെർവർ URL നൽകുക"
|
||||
unreachable = "സെർവറുമായി ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല"
|
||||
testFailed = "കണക്ഷൻ ടെസ്റ്റ് പരാജയപ്പെട്ടു"
|
||||
configFetch = "സർവർ കോൺഫിഗറേഷൻ ലഭ്യമാക്കൽ പരാജയപ്പെട്ടു. ദയവായി URL പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "ലോഗിൻ സജീവമാക്കിയിട്ടില്ല"
|
||||
body = "ഈ സർവറിൽ ലോഗിൻ സജീവമാക്കിയിട്ടില്ല. ഈ സർവറുമായി ബന്ധപ്പെടാൻ, ഓതന്റിക്കേഷൻ സജീവമാക്കണം:"
|
||||
step1 = "നിങ്ങളുടെ പരിസ്ഥിതിയിൽ DOCKER_ENABLE_SECURITY=true ആയി ക്രമീകരിക്കുക"
|
||||
step2 = "അല്ലെങ്കിൽ settings.yml ൽ security.enableLogin=true ആയി ക്രമീകരിക്കുക"
|
||||
step3 = "സർവർ പുനരാരംഭിക്കുക"
|
||||
|
||||
[setup.login]
|
||||
title = "സൈൻ ഇൻ"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "എർലി ആക്സസ്"
|
||||
reset = "മാറ്റങ്ങൾ റീസെറ്റ് ചെയ്യുക"
|
||||
downloadJson = "JSON ഡൗൺലോഡ് ചെയ്യുക"
|
||||
generatePdf = "PDF സൃഷ്ടിക്കുക"
|
||||
saveChanges = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ബോക്സിൽ ഒതുങ്ങാൻ ടെക്സ്റ്റ് സ്വയം സ്കെയിൽ ചെയ്യുക"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "ഈ ആൽഫ വീവർ ഇനിയും വികസനത്ത
|
||||
[pdfTextEditor.empty]
|
||||
title = "പ്രമാണം ലോഡ് ചെയ്തിട്ടില്ല"
|
||||
subtitle = "ടെക്സ്റ്റ് എഡിറ്റ് ആരംഭിക്കാൻ PDF അല്ലെങ്കിൽ JSON ഫയൽ ലോഡ് ചെയ്യുക."
|
||||
dropzone = "ഒരു PDF അല്ലെങ്കിൽ JSON ഫയൽ ഇവിടെ വലിച്ചിടുക, അല്ലെങ്കിൽ ബ്രൗസ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"
|
||||
dropzoneWithFiles = "Files ടാബിൽ നിന്ന് ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക, അല്ലെങ്കിൽ ഒരു PDF അല്ലെങ്കിൽ JSON ഫയൽ ഇവിടെ വലിച്ചിടുക, അല്ലെങ്കിൽ ബ്രൗസ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor-ലേക്ക് സ്വാഗതം (Early Access)"
|
||||
|
||||
@@ -131,7 +131,7 @@ unsupported = "Niet ondersteund"
|
||||
|
||||
[toolPanel]
|
||||
placeholder = "Kies een tool om te beginnen"
|
||||
alpha = "Alfa"
|
||||
alpha = "Alpha"
|
||||
premiumFeature = "Premiumfunctie:"
|
||||
comingSoon = "Binnenkort beschikbaar:"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Informatie over PDF ophalen"
|
||||
header = "Informatie over PDF ophalen"
|
||||
submit = "Haal informatie op"
|
||||
downloadJson = "JSON downloaden"
|
||||
processing = "Informatie wordt geëxtraheerd..."
|
||||
results = "Resultaten"
|
||||
noResults = "Voer de tool uit om een rapport te genereren."
|
||||
downloads = "Downloads"
|
||||
noneDetected = "Niets gedetecteerd"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Volledig informatieoverzicht"
|
||||
shortTitle = "PDF-informatie"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Formuliervelden"
|
||||
basicInfo = "Basisinformatie"
|
||||
documentInfo = "Documentinformatie"
|
||||
compliance = "Compliance"
|
||||
encryption = "Versleuteling"
|
||||
permissions = "Machtigingen"
|
||||
other = "Overig"
|
||||
perPageInfo = "Informatie per pagina"
|
||||
tableOfContents = "Inhoudsopgave"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Bijlagen"
|
||||
embeddedFiles = "Ingesloten bestanden"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lagen"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Grootte"
|
||||
annotations = "Annotaties"
|
||||
images = "Afbeeldingen"
|
||||
links = "Koppelingen"
|
||||
fonts = "Lettertypen"
|
||||
xobjects = "Aantal XObjects"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pagina's"
|
||||
fileSize = "Bestandsgrootte"
|
||||
pdfVersion = "PDF-versie"
|
||||
language = "Taal"
|
||||
title = "PDF-samenvatting"
|
||||
author = "Auteur"
|
||||
created = "Gemaakt"
|
||||
modified = "Gewijzigd"
|
||||
permsAll = "Alle machtigingen toegestaan"
|
||||
permsRestricted = "{{count}} beperkingen"
|
||||
permsMixed = "Sommige machtigingen beperkt"
|
||||
hasCompliance = "Voldoet aan compliancestandaarden"
|
||||
noCompliance = "Geen compliancestandaarden"
|
||||
basic = "Basisinformatie"
|
||||
documentInfo = "Documentinformatie"
|
||||
securityTitle = "Beveiligingsstatus"
|
||||
technical = "Technisch"
|
||||
overviewTitle = "PDF-overzicht"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Versleutelde PDF - Wachtwoordbeveiliging aanwezig"
|
||||
unencrypted = "Onversleutelde PDF - Geen wachtwoordbeveiliging"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Afbeeldingen"
|
||||
fonts = "Lettertypen"
|
||||
formFields = "Formuliervelden"
|
||||
embeddedFiles = "Ingesloten bestanden"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lagen"
|
||||
bookmarks = "Bladwijzers"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "een document zonder titel"
|
||||
unknown = "Onbekende auteur"
|
||||
text = "Dit is een PDF van {{pages}} pagina's met de titel {{title}}, gemaakt door {{author}} (PDF-versie {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Sommige bestanden konden niet worden verwerkt."
|
||||
unexpected = "Onverwachte fout tijdens het extraheren."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extractie voltooid"
|
||||
|
||||
[extractPage]
|
||||
tags = "extraheren"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Nu upgraden →"
|
||||
freeTitle = "Serverlicentie"
|
||||
overLimitTitle = "Serverlicentie vereist"
|
||||
overLimitBody = "Onze licentie staat tot <strong>{{freeTierLimit}}</strong> gebruikers gratis per server toe. Je hebt <strong>{{overLimitUserCopy}}</strong> Stirling-gebruikers. Om zonder onderbreking door te gaan, upgrade naar het Stirling Server-plan - <strong>onbeperkte plaatsen</strong>, PDF-tekstbewerking en volledige admincontrole voor $99/server/maand."
|
||||
freeBody = "Onze <strong>Open-Core</strong>-licentie staat tot <strong>{{freeTierLimit}}</strong> gebruikers per server gratis toe. Om ononderbroken op te schalen, raden we het Stirling Server-abonnement aan - <strong>onbeperkte plaatsen</strong> en <strong>SSO-ondersteuning</strong> voor $99/server/maand."
|
||||
freeBody = "Onze <strong>Open-Core</strong>-licentie staat tot <strong>{{freeTierLimit}}</strong> gebruikers gratis per server toe. Om ononderbroken te schalen en vroege toegang te krijgen tot onze nieuwe <strong>PDF-tekstbewerkingstool</strong>, raden we het Stirling Server-plan aan - volledige bewerking en <strong>onbeperkte plaatsen</strong> voor $99/server/maand."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Downloaden"
|
||||
@@ -5367,31 +5282,6 @@ error = "Bijwerken van gebruikersstatus is mislukt"
|
||||
success = "Gebruiker succesvol verwijderd"
|
||||
error = "Gebruiker verwijderen is mislukt"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Wachtwoord wijzigen"
|
||||
title = "Wachtwoord wijzigen"
|
||||
subtitle = "Wachtwoord bijwerken voor"
|
||||
newPassword = "Nieuw wachtwoord"
|
||||
confirmPassword = "Wachtwoord bevestigen"
|
||||
placeholder = "Voer een nieuw wachtwoord in"
|
||||
confirmPlaceholder = "Voer het nieuwe wachtwoord opnieuw in"
|
||||
passwordRequired = "Voer een nieuw wachtwoord in"
|
||||
passwordMismatch = "Wachtwoorden komen niet overeen"
|
||||
generateRandom = "Beveiligd wachtwoord genereren"
|
||||
generatedPreview = "Gegenereerd wachtwoord:"
|
||||
copyTooltip = "Kopiëren naar klembord"
|
||||
copiedToClipboard = "Wachtwoord gekopieerd naar klembord"
|
||||
copyFailed = "Kopiëren van wachtwoord mislukt"
|
||||
sendEmail = "Gebruiker per e-mail informeren over deze wijziging"
|
||||
includePassword = "Nieuw wachtwoord in de e-mail opnemen"
|
||||
forcePasswordChange = "Gebruiker dwingen het wachtwoord bij de volgende aanmelding te wijzigen"
|
||||
emailUnavailable = "Het e-mailadres van deze gebruiker is ongeldig. Meldingen zijn uitgeschakeld."
|
||||
smtpDisabled = "E-mailmeldingen vereisen dat SMTP is ingeschakeld in de instellingen."
|
||||
notifyOnly = "Er wordt een e-mail verzonden zonder het wachtwoord, om de gebruiker te laten weten dat een beheerder het heeft gewijzigd."
|
||||
submit = "Wachtwoord bijwerken"
|
||||
success = "Wachtwoord succesvol bijgewerkt"
|
||||
error = "Bijwerken van wachtwoord mislukt"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-mailuitnodiging"
|
||||
description = "Typ of plak hieronder e-mailadressen, gescheiden door komma's. Gebruikers ontvangen inloggegevens via e-mail."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Log in met je Stirling-account"
|
||||
[setup.selfhosted]
|
||||
title = "Inloggen bij server"
|
||||
subtitle = "Vul je servergegevens in"
|
||||
link = "of maak verbinding met een zelfgehost account"
|
||||
|
||||
[setup.server]
|
||||
title = "Verbinden met server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Voer de volledige URL van je self-hosted Stirling PDF-server in"
|
||||
emptyUrl = "Voer een server-URL in"
|
||||
unreachable = "Kan geen verbinding maken met server"
|
||||
testFailed = "Verbindingstest mislukt"
|
||||
configFetch = "Ophalen van serverconfiguratie mislukt. Controleer de URL en probeer het opnieuw."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Inloggen niet ingeschakeld"
|
||||
body = "Op deze server is inloggen niet ingeschakeld. Om verbinding te maken met deze server moet u authenticatie inschakelen:"
|
||||
step1 = "Stel DOCKER_ENABLE_SECURITY=true in in uw omgeving"
|
||||
step2 = "Of stel security.enableLogin=true in in settings.yml"
|
||||
step3 = "Start de server opnieuw"
|
||||
|
||||
[setup.login]
|
||||
title = "Inloggen"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Vroege toegang"
|
||||
reset = "Wijzigingen resetten"
|
||||
downloadJson = "JSON downloaden"
|
||||
generatePdf = "PDF genereren"
|
||||
saveChanges = "Wijzigingen opslaan"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Tekst automatisch schalen zodat deze in vakken past"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Deze alpha-viewer is nog in ontwikkeling—bepaalde lettertypen, kleure
|
||||
[pdfTextEditor.empty]
|
||||
title = "Geen document geladen"
|
||||
subtitle = "Laad een PDF- of JSON-bestand om tekst te bewerken."
|
||||
dropzone = "Sleep hier een PDF- of JSON-bestand naartoe, of klik om te bladeren"
|
||||
dropzoneWithFiles = "Selecteer een bestand op het tabblad Bestanden, of sleep hier een PDF- of JSON-bestand naartoe, of klik om te bladeren"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Welkom bij PDF-teksteditor (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Få Info om PDF"
|
||||
header = "Få Info om PDF"
|
||||
submit = "Få Info"
|
||||
downloadJson = "Last ned JSON"
|
||||
processing = "Henter ut informasjon..."
|
||||
results = "Resultater"
|
||||
noResults = "Kjør verktøyet for å generere en rapport."
|
||||
downloads = "Nedlastinger"
|
||||
noneDetected = "Ingen funnet"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Fullstendig informasjonsoppsummering"
|
||||
shortTitle = "PDF-informasjon"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Skjemafelt"
|
||||
basicInfo = "Grunnleggende info"
|
||||
documentInfo = "Dokumentinformasjon"
|
||||
compliance = "Samsvar"
|
||||
encryption = "Kryptering"
|
||||
permissions = "Tillatelser"
|
||||
other = "Annet"
|
||||
perPageInfo = "Informasjon per side"
|
||||
tableOfContents = "Innholdsfortegnelse"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Vedlegg"
|
||||
embeddedFiles = "Innebygde filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lag"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Størrelse"
|
||||
annotations = "Merknader"
|
||||
images = "Bilder"
|
||||
links = "Lenker"
|
||||
fonts = "Skrifter"
|
||||
xobjects = "XObject-antall"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Sider"
|
||||
fileSize = "Filstørrelse"
|
||||
pdfVersion = "PDF-versjon"
|
||||
language = "Språk"
|
||||
title = "PDF-sammendrag"
|
||||
author = "Forfatter"
|
||||
created = "Opprettet"
|
||||
modified = "Endret"
|
||||
permsAll = "Alle tillatelser tillatt"
|
||||
permsRestricted = "{{count}} begrensninger"
|
||||
permsMixed = "Noen tillatelser begrenset"
|
||||
hasCompliance = "Har samsvarsstandarder"
|
||||
noCompliance = "Ingen samsvarsstandarder"
|
||||
basic = "Grunnleggende informasjon"
|
||||
documentInfo = "Dokumentinformasjon"
|
||||
securityTitle = "Sikkerhetsstatus"
|
||||
technical = "Teknisk"
|
||||
overviewTitle = "PDF-oversikt"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Kryptert PDF - passordbeskyttelse er aktiv"
|
||||
unencrypted = "Ukryptert PDF - ingen passordbeskyttelse"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Bilder"
|
||||
fonts = "Skrifter"
|
||||
formFields = "Skjemafelt"
|
||||
embeddedFiles = "Innebygde filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lag"
|
||||
bookmarks = "Bokmerker"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "et navnløst dokument"
|
||||
unknown = "Ukjent forfatter"
|
||||
text = "Dette er en PDF på {{pages}} sider med tittelen {{title}}, opprettet av {{author}} (PDF-versjon {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Noen filer kunne ikke behandles."
|
||||
unexpected = "Uventet feil under uttrekk."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Uttrekk fullført"
|
||||
|
||||
[extractPage]
|
||||
tags = "ekstrahere"
|
||||
@@ -5262,7 +5177,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 anbefaler vi Stirling Server-planen - <strong>ubegrensede plasser</strong> og <strong>SSO-støtte</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 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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Last ned"
|
||||
@@ -5367,31 +5282,6 @@ error = "Kunne ikke oppdatere brukerstatus"
|
||||
success = "Bruker slettet"
|
||||
error = "Kunne ikke slette bruker"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Endre passord"
|
||||
title = "Endre passord"
|
||||
subtitle = "Oppdater passordet for"
|
||||
newPassword = "Nytt passord"
|
||||
confirmPassword = "Bekreft passord"
|
||||
placeholder = "Angi et nytt passord"
|
||||
confirmPlaceholder = "Skriv inn det nye passordet på nytt"
|
||||
passwordRequired = "Angi et nytt passord"
|
||||
passwordMismatch = "Passordene samsvarer ikke"
|
||||
generateRandom = "Generer sikkert passord"
|
||||
generatedPreview = "Generert passord:"
|
||||
copyTooltip = "Kopier til utklippstavle"
|
||||
copiedToClipboard = "Passord kopiert til utklippstavle"
|
||||
copyFailed = "Kunne ikke kopiere passord"
|
||||
sendEmail = "Send e-post til brukeren om denne endringen"
|
||||
includePassword = "Inkluder det nye passordet i e-posten"
|
||||
forcePasswordChange = "Tving brukeren til å endre passord ved neste innlogging"
|
||||
emailUnavailable = "Denne brukerens e-post er ikke en gyldig e-postadresse. Varsler er deaktivert."
|
||||
smtpDisabled = "E-postvarsler krever at SMTP er aktivert i innstillingene."
|
||||
notifyOnly = "Det sendes en e-post uten passordet som informerer brukeren om at en admin har endret det."
|
||||
submit = "Oppdater passord"
|
||||
success = "Passord oppdatert"
|
||||
error = "Kunne ikke oppdatere passord"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-postinvitasjon"
|
||||
description = "Skriv eller lim inn e-poster nedenfor, separert med komma. Brukere vil motta innloggingsdetaljer via e-post."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Logg inn med Stirling-kontoen din"
|
||||
[setup.selfhosted]
|
||||
title = "Logg inn på server"
|
||||
subtitle = "Oppgi serverlegitimasjonen din"
|
||||
link = "eller koble til en selvhostet konto"
|
||||
|
||||
[setup.server]
|
||||
title = "Koble til server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Skriv inn full URL til din selvhostede Stirling PDF-server"
|
||||
emptyUrl = "Skriv inn en server-URL"
|
||||
unreachable = "Kunne ikke koble til server"
|
||||
testFailed = "Tilkoblingstest mislyktes"
|
||||
configFetch = "Kunne ikke hente serverkonfigurasjon. Kontroller URL-en og prøv igjen."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Innlogging ikke aktivert"
|
||||
body = "Denne serveren har ikke innlogging aktivert. For å koble til denne serveren må du aktivere autentisering:"
|
||||
step1 = "Angi DOCKER_ENABLE_SECURITY=true i miljøet ditt"
|
||||
step2 = "Eller angi security.enableLogin=true i settings.yml"
|
||||
step3 = "Start serveren på nytt"
|
||||
|
||||
[setup.login]
|
||||
title = "Logg inn"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Tidlig tilgang"
|
||||
reset = "Tilbakestill endringer"
|
||||
downloadJson = "Last ned JSON"
|
||||
generatePdf = "Generer PDF"
|
||||
saveChanges = "Lagre endringer"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Autoskalere tekst til å passe i bokser"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Denne alfa-visningen er fortsatt under utvikling—visse skrifttyper, f
|
||||
[pdfTextEditor.empty]
|
||||
title = "Ingen dokument lastet inn"
|
||||
subtitle = "Last inn en PDF- eller JSON-fil for å begynne å redigere tekstinnhold."
|
||||
dropzone = "Dra og slipp en PDF- eller JSON-fil her, eller klikk for å bla gjennom"
|
||||
dropzoneWithFiles = "Velg en fil fra fanen Filer, eller dra og slipp en PDF- eller JSON-fil her, eller klikk for å bla gjennom"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Velkommen til PDF Text Editor (Tidlig tilgang)"
|
||||
|
||||
@@ -568,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 = "Najlepsze"
|
||||
top = "Top"
|
||||
numberOfVisits = "Liczba wizyt"
|
||||
visitsTooltip = "Wizyty: {0} ({1}% całości)"
|
||||
retry = "Spróbuj ponownie"
|
||||
@@ -1225,7 +1225,7 @@ odtExt = "Tekst OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Prezentacja OpenDocument (.odp)"
|
||||
txtExt = "Tekst niesformatowany (.txt)"
|
||||
rtfExt = "Format RTF (.rtf)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "Wybrane pliki"
|
||||
noFileSelected = "Nie wybrano pliku. Użyj panelu plików, aby dodać pliki."
|
||||
convertFiles = "Konwertuj pliki"
|
||||
@@ -3036,91 +3036,6 @@ title = "Pobierz informacje o pliku PDF"
|
||||
header = "Pobierz informacje o pliku PDF"
|
||||
submit = "Pobierz informacje"
|
||||
downloadJson = "Pobierz JSON z zawartością"
|
||||
processing = "Wyodrębnianie informacji..."
|
||||
results = "Wyniki"
|
||||
noResults = "Uruchom narzędzie, aby wygenerować raport."
|
||||
downloads = "Pobrania"
|
||||
noneDetected = "Nic nie wykryto"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Pełne podsumowanie informacji"
|
||||
shortTitle = "Informacje o PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadane"
|
||||
formFields = "Pola formularza"
|
||||
basicInfo = "Informacje podstawowe"
|
||||
documentInfo = "Informacje o dokumencie"
|
||||
compliance = "Zgodność"
|
||||
encryption = "Szyfrowanie"
|
||||
permissions = "Uprawnienia"
|
||||
other = "Inne"
|
||||
perPageInfo = "Informacje dla każdej strony"
|
||||
tableOfContents = "Spis treści"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Załączniki"
|
||||
embeddedFiles = "Osadzone pliki"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Warstwy"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Rozmiar"
|
||||
annotations = "Adnotacje"
|
||||
images = "Obrazy"
|
||||
links = "Linki"
|
||||
fonts = "Czcionki"
|
||||
xobjects = "Liczba XObject"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Strony"
|
||||
fileSize = "Rozmiar pliku"
|
||||
pdfVersion = "Wersja PDF"
|
||||
language = "Język"
|
||||
title = "Podsumowanie PDF"
|
||||
author = "Autor"
|
||||
created = "Utworzono"
|
||||
modified = "Zmodyfikowano"
|
||||
permsAll = "Wszystkie uprawnienia dozwolone"
|
||||
permsRestricted = "{{count}} ograniczeń"
|
||||
permsMixed = "Niektóre uprawnienia ograniczone"
|
||||
hasCompliance = "Spełnia standardy zgodności"
|
||||
noCompliance = "Brak standardów zgodności"
|
||||
basic = "Informacje podstawowe"
|
||||
documentInfo = "Informacje o dokumencie"
|
||||
securityTitle = "Stan zabezpieczeń"
|
||||
technical = "Techniczne"
|
||||
overviewTitle = "Przegląd PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Zaszyfrowany PDF - obecne zabezpieczenie hasłem"
|
||||
unencrypted = "Niezaszyfrowany PDF - brak zabezpieczenia hasłem"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Obrazy"
|
||||
fonts = "Czcionki"
|
||||
formFields = "Pola formularza"
|
||||
embeddedFiles = "Osadzone pliki"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Warstwy"
|
||||
bookmarks = "Zakładki"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "niezatytułowany dokument"
|
||||
unknown = "Nieznany autor"
|
||||
text = "To jest {{pages}}-stronicowy plik PDF zatytułowany {{title}}, utworzony przez {{author}} (wersja PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Niektórych plików nie udało się przetworzyć."
|
||||
unexpected = "Nieoczekiwany błąd podczas wyodrębniania."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Zakończono wyodrębnianie"
|
||||
|
||||
[extractPage]
|
||||
tags = "wydobycie,separacja,wyciaganie"
|
||||
@@ -5262,7 +5177,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 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Pobierz"
|
||||
@@ -5367,31 +5282,6 @@ error = "Nie udało się zaktualizować statusu użytkownika"
|
||||
success = "Użytkownik usunięty pomyślnie"
|
||||
error = "Nie udało się usunąć użytkownika"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Zmień hasło"
|
||||
title = "Zmień hasło"
|
||||
subtitle = "Zaktualizuj hasło dla"
|
||||
newPassword = "Nowe hasło"
|
||||
confirmPassword = "Potwierdź hasło"
|
||||
placeholder = "Wprowadź nowe hasło"
|
||||
confirmPlaceholder = "Wprowadź ponownie nowe hasło"
|
||||
passwordRequired = "Wprowadź nowe hasło"
|
||||
passwordMismatch = "Hasła nie są zgodne"
|
||||
generateRandom = "Wygeneruj bezpieczne hasło"
|
||||
generatedPreview = "Wygenerowane hasło:"
|
||||
copyTooltip = "Kopiuj do schowka"
|
||||
copiedToClipboard = "Hasło skopiowano do schowka"
|
||||
copyFailed = "Nie udało się skopiować hasła"
|
||||
sendEmail = "Wyślij użytkownikowi e-mail o tej zmianie"
|
||||
includePassword = "Dołącz nowe hasło do e-maila"
|
||||
forcePasswordChange = "Wymuś zmianę hasła przy następnym logowaniu"
|
||||
emailUnavailable = "E-mail tego użytkownika nie jest prawidłowym adresem. Powiadomienia są wyłączone."
|
||||
smtpDisabled = "Powiadomienia e-mail wymagają włączenia SMTP w ustawieniach."
|
||||
notifyOnly = "Zostanie wysłany e-mail bez hasła, informujący użytkownika, że administrator je zmienił."
|
||||
submit = "Zaktualizuj hasło"
|
||||
success = "Hasło zaktualizowano pomyślnie"
|
||||
error = "Nie udało się zaktualizować hasła"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Zaproszenie e‑mail"
|
||||
description = "Wpisz lub wklej e‑maile poniżej, rozdzielone przecinkami. Użytkownicy otrzymają dane logowania e‑mailem."
|
||||
@@ -5696,7 +5586,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 = "twoj@email.com"
|
||||
emailPlaceholder = "your@email.com"
|
||||
continue = "Kontynuuj"
|
||||
modalTitle = "Zaczynamy – {{planName}}"
|
||||
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Zaloguj się na konto Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Zaloguj się do serwera"
|
||||
subtitle = "Wprowadź dane logowania do serwera"
|
||||
link = "lub połącz się z kontem hostowanym samodzielnie"
|
||||
|
||||
[setup.server]
|
||||
title = "Połącz z serwerem"
|
||||
@@ -5944,14 +5833,6 @@ description = "Wpisz pełny URL własnego serwera Stirling PDF"
|
||||
emptyUrl = "Wpisz URL serwera"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Logowanie nie jest włączone"
|
||||
body = "Na tym serwerze logowanie nie jest włączone. Aby się połączyć, musisz włączyć uwierzytelnianie:"
|
||||
step1 = "Ustaw w środowisku DOCKER_ENABLE_SECURITY=true"
|
||||
step2 = "Lub ustaw security.enableLogin=true w pliku settings.yml"
|
||||
step3 = "Uruchom ponownie serwer"
|
||||
|
||||
[setup.login]
|
||||
title = "Zaloguj się"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Wczesny dostęp"
|
||||
reset = "Resetuj zmiany"
|
||||
downloadJson = "Pobierz JSON"
|
||||
generatePdf = "Generuj PDF"
|
||||
saveChanges = "Zapisz zmiany"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automatycznie skaluj tekst do pól"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ten podgląd alfa jest wciąż rozwijany — niektóre czcionki, kolory
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nie wczytano dokumentu"
|
||||
subtitle = "Wczytaj plik PDF lub JSON, aby rozpocząć edycję treści tekstowych."
|
||||
dropzone = "Przeciągnij i upuść tutaj plik PDF lub JSON albo kliknij, aby przeglądać"
|
||||
dropzoneWithFiles = "Wybierz plik z karty Pliki, przeciągnij i upuść tutaj plik PDF lub JSON albo kliknij, aby przeglądać"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Witamy w edytorze tekstu PDF (wczesny dostęp)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Obter Informações do PDF"
|
||||
header = "Obter Informações do PDF"
|
||||
submit = "Obter Informações"
|
||||
downloadJson = "Baixar JSON"
|
||||
processing = "Extraindo informações..."
|
||||
results = "Resultados"
|
||||
noResults = "Execute a ferramenta para gerar um relatório."
|
||||
downloads = "Downloads"
|
||||
noneDetected = "Nenhum detectado"
|
||||
indexTitle = "Índice"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Resumo completo das informações"
|
||||
shortTitle = "Informações do PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadados"
|
||||
formFields = "Campos de formulário"
|
||||
basicInfo = "Informações básicas"
|
||||
documentInfo = "Informações do documento"
|
||||
compliance = "Conformidade"
|
||||
encryption = "Criptografia"
|
||||
permissions = "Permissões"
|
||||
other = "Outros"
|
||||
perPageInfo = "Informações por página"
|
||||
tableOfContents = "Sumário"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Anexos"
|
||||
embeddedFiles = "Arquivos incorporados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Camadas"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Tamanho"
|
||||
annotations = "Anotações"
|
||||
images = "Imagens"
|
||||
links = "Links"
|
||||
fonts = "Fontes"
|
||||
xobjects = "Contagem de XObjects"
|
||||
multimedia = "Multimídia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Páginas"
|
||||
fileSize = "Tamanho do arquivo"
|
||||
pdfVersion = "Versão do PDF"
|
||||
language = "Idioma"
|
||||
title = "Resumo do PDF"
|
||||
author = "Autor"
|
||||
created = "Criado"
|
||||
modified = "Modificado"
|
||||
permsAll = "Todas as permissões permitidas"
|
||||
permsRestricted = "{{count}} restrições"
|
||||
permsMixed = "Algumas permissões restritas"
|
||||
hasCompliance = "Possui padrões de conformidade"
|
||||
noCompliance = "Sem padrões de conformidade"
|
||||
basic = "Informações básicas"
|
||||
documentInfo = "Informações do documento"
|
||||
securityTitle = "Status de segurança"
|
||||
technical = "Técnico"
|
||||
overviewTitle = "Visão geral do PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF criptografado - Proteção por senha ativada"
|
||||
unencrypted = "PDF não criptografado - Sem proteção por senha"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Imagens"
|
||||
fonts = "Fontes"
|
||||
formFields = "Campos de formulário"
|
||||
embeddedFiles = "Arquivos incorporados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Camadas"
|
||||
bookmarks = "Marcadores"
|
||||
multimedia = "Multimídia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "um documento sem título"
|
||||
unknown = "Autor desconhecido"
|
||||
text = "Este é um PDF de {{pages}} páginas intitulado {{title}} criado por {{author}} (versão do PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Alguns arquivos não puderam ser processados."
|
||||
unexpected = "Erro inesperado durante a extração."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extração concluída"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrair"
|
||||
@@ -5262,7 +5177,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 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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Download"
|
||||
@@ -5367,31 +5282,6 @@ error = "Falha ao atualizar o status do usuário"
|
||||
success = "Usuário excluído com sucesso"
|
||||
error = "Falha ao excluir usuário"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Alterar senha"
|
||||
title = "Alterar senha"
|
||||
subtitle = "Atualizar a senha de"
|
||||
newPassword = "Nova senha"
|
||||
confirmPassword = "Confirmar senha"
|
||||
placeholder = "Insira uma nova senha"
|
||||
confirmPlaceholder = "Digite novamente a nova senha"
|
||||
passwordRequired = "Por favor, insira uma nova senha"
|
||||
passwordMismatch = "As senhas não coincidem"
|
||||
generateRandom = "Gerar senha segura"
|
||||
generatedPreview = "Senha gerada:"
|
||||
copyTooltip = "Copiar para a área de transferência"
|
||||
copiedToClipboard = "Senha copiada para a área de transferência"
|
||||
copyFailed = "Falha ao copiar a senha"
|
||||
sendEmail = "Enviar email ao usuário sobre esta alteração"
|
||||
includePassword = "Incluir a nova senha no email"
|
||||
forcePasswordChange = "Exigir que o usuário altere a senha no próximo login"
|
||||
emailUnavailable = "O email deste usuário não é um endereço válido. As notificações estão desativadas."
|
||||
smtpDisabled = "As notificações por email exigem que o SMTP esteja habilitado nas configurações."
|
||||
notifyOnly = "Um email será enviado sem a senha, informando ao usuário que um administrador a alterou."
|
||||
submit = "Atualizar senha"
|
||||
success = "Senha atualizada com sucesso"
|
||||
error = "Falha ao atualizar a senha"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Convite por email"
|
||||
description = "Digite ou cole emails abaixo, separados por vírgulas. Os usuários receberão credenciais de login por email."
|
||||
@@ -5696,7 +5586,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 = "seu@email.com"
|
||||
emailPlaceholder = "your@email.com"
|
||||
continue = "Continuar"
|
||||
modalTitle = "Começar - {{planName}}"
|
||||
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Entre com sua conta do Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Entrar no servidor"
|
||||
subtitle = "Informe suas credenciais do servidor"
|
||||
link = "ou conecte-se a uma conta auto-hospedada"
|
||||
|
||||
[setup.server]
|
||||
title = "Conectar ao servidor"
|
||||
@@ -5944,14 +5833,6 @@ description = "Informe a URL completa do seu servidor self-hosted Stirling PDF"
|
||||
emptyUrl = "Informe uma URL de servidor"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Login não habilitado"
|
||||
body = "Este servidor não tem o login habilitado. Para conectar-se a este servidor, você deve habilitar a autenticação:"
|
||||
step1 = "Defina DOCKER_ENABLE_SECURITY=true no seu ambiente"
|
||||
step2 = "Ou defina security.enableLogin=true em settings.yml"
|
||||
step3 = "Reinicie o servidor"
|
||||
|
||||
[setup.login]
|
||||
title = "Entrar"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Acesso antecipado"
|
||||
reset = "Reverter alterações"
|
||||
downloadJson = "Baixar JSON"
|
||||
generatePdf = "Gerar PDF"
|
||||
saveChanges = "Salvar alterações"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Dimensionar texto automaticamente para caber nas caixas"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Este visualizador alpha ainda está evoluindo—certas fontes, cores, e
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nenhum documento carregado"
|
||||
subtitle = "Carregue um PDF ou JSON para começar a editar texto."
|
||||
dropzone = "Arraste e solte um arquivo PDF ou JSON aqui, ou clique para procurar"
|
||||
dropzoneWithFiles = "Selecione um arquivo na aba Arquivos ou arraste e solte um arquivo PDF ou JSON aqui, ou clique para procurar"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Bem-vindo ao Editor de Texto PDF (Acesso antecipado)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Obter Informação do PDF"
|
||||
header = "Obter Informação do PDF"
|
||||
submit = "Obter Informação"
|
||||
downloadJson = "Transferir JSON"
|
||||
processing = "A extrair informações..."
|
||||
results = "Resultados"
|
||||
noResults = "Execute a ferramenta para gerar um relatório."
|
||||
downloads = "Transferências"
|
||||
noneDetected = "Nenhum detetado"
|
||||
indexTitle = "Índice"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Resumo completo das informações"
|
||||
shortTitle = "Informações do PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadados"
|
||||
formFields = "Campos do formulário"
|
||||
basicInfo = "Informações básicas"
|
||||
documentInfo = "Informações do documento"
|
||||
compliance = "Conformidade"
|
||||
encryption = "Encriptação"
|
||||
permissions = "Permissões"
|
||||
other = "Outros"
|
||||
perPageInfo = "Informações por página"
|
||||
tableOfContents = "Índice"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Anexos"
|
||||
embeddedFiles = "Ficheiros incorporados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Camadas"
|
||||
structureTree = "Árvore de estrutura"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Tamanho"
|
||||
annotations = "Anotações"
|
||||
images = "Imagens"
|
||||
links = "Ligações"
|
||||
fonts = "Tipos de letra"
|
||||
xobjects = "Contagens de XObject"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Páginas"
|
||||
fileSize = "Tamanho do ficheiro"
|
||||
pdfVersion = "Versão do PDF"
|
||||
language = "Idioma"
|
||||
title = "Resumo do PDF"
|
||||
author = "Autor"
|
||||
created = "Criado"
|
||||
modified = "Modificado"
|
||||
permsAll = "Todas as permissões autorizadas"
|
||||
permsRestricted = "{{count}} restrições"
|
||||
permsMixed = "Algumas permissões restritas"
|
||||
hasCompliance = "Tem normas de conformidade"
|
||||
noCompliance = "Sem normas de conformidade"
|
||||
basic = "Informações básicas"
|
||||
documentInfo = "Informações do documento"
|
||||
securityTitle = "Estado de segurança"
|
||||
technical = "Técnico"
|
||||
overviewTitle = "Visão geral do PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF encriptado - Proteção por palavra-passe presente"
|
||||
unencrypted = "PDF não encriptado - Sem proteção por palavra-passe"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Imagens"
|
||||
fonts = "Tipos de letra"
|
||||
formFields = "Campos do formulário"
|
||||
embeddedFiles = "Ficheiros incorporados"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Camadas"
|
||||
bookmarks = "Marcadores"
|
||||
multimedia = "Multimédia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "um documento sem título"
|
||||
unknown = "Autor desconhecido"
|
||||
text = "Este é um PDF de {{pages}} páginas intitulado {{title}}, criado por {{author}} (versão do PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Alguns ficheiros não puderam ser processados."
|
||||
unexpected = "Erro inesperado durante a extração."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extração concluída"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrair"
|
||||
@@ -5262,7 +5177,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 = "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."
|
||||
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."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Transferir"
|
||||
@@ -5367,31 +5282,6 @@ error = "Falha ao atualizar o estado do utilizador"
|
||||
success = "Utilizador eliminado com sucesso"
|
||||
error = "Falha ao eliminar utilizador"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Alterar palavra-passe"
|
||||
title = "Alterar palavra-passe"
|
||||
subtitle = "Atualizar a palavra-passe de"
|
||||
newPassword = "Nova palavra-passe"
|
||||
confirmPassword = "Confirmar palavra-passe"
|
||||
placeholder = "Introduza uma nova palavra-passe"
|
||||
confirmPlaceholder = "Introduza novamente a nova palavra-passe"
|
||||
passwordRequired = "Por favor, introduza uma nova palavra-passe"
|
||||
passwordMismatch = "As palavras-passe não coincidem"
|
||||
generateRandom = "Gerar palavra-passe segura"
|
||||
generatedPreview = "Palavra-passe gerada:"
|
||||
copyTooltip = "Copiar para a área de transferência"
|
||||
copiedToClipboard = "Palavra-passe copiada para a área de transferência"
|
||||
copyFailed = "Falha ao copiar a palavra-passe"
|
||||
sendEmail = "Enviar email ao utilizador sobre esta alteração"
|
||||
includePassword = "Incluir a nova palavra-passe no email"
|
||||
forcePasswordChange = "Obrigar o utilizador a alterar a palavra-passe no próximo início de sessão"
|
||||
emailUnavailable = "O email deste utilizador não é um endereço válido. As notificações estão desativadas."
|
||||
smtpDisabled = "As notificações por email requerem que o SMTP esteja ativado nas definições."
|
||||
notifyOnly = "Será enviado um email sem a palavra-passe, informando o utilizador de que um administrador a alterou."
|
||||
submit = "Guardar palavra-passe"
|
||||
success = "Palavra-passe atualizada com sucesso"
|
||||
error = "Falha ao atualizar a palavra-passe"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Convite por email"
|
||||
description = "Escreva ou cole emails abaixo, separados por vírgulas. Os utilizadores receberão credenciais de login por email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Inicie sessão com a sua conta Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Iniciar sessão no servidor"
|
||||
subtitle = "Introduza as credenciais do seu servidor"
|
||||
link = "ou ligue-se a uma conta autoalojada"
|
||||
|
||||
[setup.server]
|
||||
title = "Ligar ao servidor"
|
||||
@@ -5944,14 +5833,6 @@ description = "Introduza o URL completo do seu servidor Stirling PDF autoalojado
|
||||
emptyUrl = "Introduza um URL de servidor"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Início de sessão não ativado"
|
||||
body = "Este servidor não tem o início de sessão ativado. Para se ligar a este servidor, tem de ativar a autenticação:"
|
||||
step1 = "Defina DOCKER_ENABLE_SECURITY=true no seu ambiente"
|
||||
step2 = "Ou defina security.enableLogin=true no settings.yml"
|
||||
step3 = "Reinicie o servidor"
|
||||
|
||||
[setup.login]
|
||||
title = "Iniciar sessão"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Acesso antecipado"
|
||||
reset = "Repor alterações"
|
||||
downloadJson = "Transferir JSON"
|
||||
generatePdf = "Gerar PDF"
|
||||
saveChanges = "Guardar alterações"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Dimensionar texto automaticamente para caber nas caixas"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Este visualizador alpha ainda está a evoluir—certas fontes, cores, e
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nenhum documento carregado"
|
||||
subtitle = "Carregue um ficheiro PDF ou JSON para começar a editar o conteúdo de texto."
|
||||
dropzone = "Arraste e largue aqui um ficheiro PDF ou JSON, ou clique para procurar"
|
||||
dropzoneWithFiles = "Selecione um ficheiro no separador Ficheiros, ou arraste e largue aqui um ficheiro PDF ou JSON, ou clique para procurar"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Bem-vindo ao PDF Text Editor (Acesso Antecipado)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Obține Informații despre PDF"
|
||||
header = "Obține Informații despre PDF"
|
||||
submit = "Obține Informații"
|
||||
downloadJson = "Descarcă JSON"
|
||||
processing = "Se extrag informațiile..."
|
||||
results = "Rezultate"
|
||||
noResults = "Rulați instrumentul pentru a genera un raport."
|
||||
downloads = "Descărcări"
|
||||
noneDetected = "Nu s-a detectat nimic"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Rezumat complet al informațiilor"
|
||||
shortTitle = "Informații PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadate"
|
||||
formFields = "Câmpuri de formular"
|
||||
basicInfo = "Informații de bază"
|
||||
documentInfo = "Informații despre document"
|
||||
compliance = "Conformitate"
|
||||
encryption = "Criptare"
|
||||
permissions = "Permisiuni"
|
||||
other = "Altele"
|
||||
perPageInfo = "Informații pe pagină"
|
||||
tableOfContents = "Cuprins"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Atașamente"
|
||||
embeddedFiles = "Fișiere încorporate"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Straturi"
|
||||
structureTree = "Arbore de structură"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Dimensiune"
|
||||
annotations = "Adnotări"
|
||||
images = "Imagini"
|
||||
links = "Linkuri"
|
||||
fonts = "Fonturi"
|
||||
xobjects = "Număr de XObject-uri"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Pagini"
|
||||
fileSize = "Dimensiune fișier"
|
||||
pdfVersion = "Versiune PDF"
|
||||
language = "Limbă"
|
||||
title = "Rezumat PDF"
|
||||
author = "Autor"
|
||||
created = "Creat"
|
||||
modified = "Modificat"
|
||||
permsAll = "Toate permisiunile sunt acordate"
|
||||
permsRestricted = "{{count}} restricții"
|
||||
permsMixed = "Unele permisiuni sunt restricționate"
|
||||
hasCompliance = "Are standarde de conformitate"
|
||||
noCompliance = "Fără standarde de conformitate"
|
||||
basic = "Informații de bază"
|
||||
documentInfo = "Informații despre document"
|
||||
securityTitle = "Starea securității"
|
||||
technical = "Tehnic"
|
||||
overviewTitle = "Prezentare generală PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF criptat - Protejat cu parolă"
|
||||
unencrypted = "PDF necriptat - Fără protecție prin parolă"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Imagini"
|
||||
fonts = "Fonturi"
|
||||
formFields = "Câmpuri de formular"
|
||||
embeddedFiles = "Fișiere încorporate"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Straturi"
|
||||
bookmarks = "Marcaje"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "un document fără titlu"
|
||||
unknown = "Autor necunoscut"
|
||||
text = "Acesta este un PDF de {{pages}} pagini, intitulat {{title}}, creat de {{author}} (versiune PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Unele fișiere nu au putut fi procesate."
|
||||
unexpected = "Eroare neașteptată în timpul extragerii."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extragere finalizată"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrage"
|
||||
@@ -4033,7 +3948,7 @@ files = "Fișiere"
|
||||
activity = "Jurnal"
|
||||
help = "Ajutor"
|
||||
account = "Cont"
|
||||
config = "Configurare"
|
||||
config = "Config"
|
||||
settings = "Setări"
|
||||
adminSettings = "Setări admin"
|
||||
allTools = "All Tools"
|
||||
@@ -4261,7 +4176,7 @@ description = "Urmărește acțiunile utilizatorilor și evenimentele de sistem
|
||||
|
||||
[admin.settings.security.audit.level]
|
||||
label = "Nivel audit"
|
||||
description = "0=OPRIT, 1=DE BAZĂ, 2=STANDARD, 3=DETALIAT"
|
||||
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
|
||||
|
||||
[admin.settings.security.audit.retentionDays]
|
||||
label = "Păstrare audit (zile)"
|
||||
@@ -5262,7 +5177,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 scalare fără întreruperi, recomandăm planul Stirling Server - <strong>locuri nelimitate</strong> și <strong>suport SSO</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 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ă."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Descărcare"
|
||||
@@ -5367,31 +5282,6 @@ error = "Actualizarea stării utilizatorului a eșuat"
|
||||
success = "Utilizator șters cu succes"
|
||||
error = "Ștergerea utilizatorului a eșuat"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Schimbă parola"
|
||||
title = "Schimbă parola"
|
||||
subtitle = "Actualizați parola pentru"
|
||||
newPassword = "Parolă nouă"
|
||||
confirmPassword = "Confirmă parola"
|
||||
placeholder = "Introduceți o parolă nouă"
|
||||
confirmPlaceholder = "Reintroduceți parola nouă"
|
||||
passwordRequired = "Introduceți o parolă nouă"
|
||||
passwordMismatch = "Parolele nu coincid"
|
||||
generateRandom = "Generează o parolă sigură"
|
||||
generatedPreview = "Parolă generată:"
|
||||
copyTooltip = "Copiază în clipboard"
|
||||
copiedToClipboard = "Parola a fost copiată în clipboard"
|
||||
copyFailed = "Copierea parolei a eșuat"
|
||||
sendEmail = "Trimite un email utilizatorului despre această modificare"
|
||||
includePassword = "Include parola nouă în email"
|
||||
forcePasswordChange = "Forțează utilizatorul să schimbe parola la următoarea autentificare"
|
||||
emailUnavailable = "Emailul acestui utilizator nu este o adresă de email validă. Notificările sunt dezactivate."
|
||||
smtpDisabled = "Notificările prin email necesită activarea SMTP în setări."
|
||||
notifyOnly = "Se va trimite un email fără parolă, informând utilizatorul că un administrator a schimbat-o."
|
||||
submit = "Actualizează parola"
|
||||
success = "Parola a fost actualizată cu succes"
|
||||
error = "Actualizarea parolei a eșuat"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Invitație prin email"
|
||||
description = "Tastați sau lipiți emailuri mai jos, separate prin virgule. Utilizatorii vor primi datele de conectare prin email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Autentifică-te cu contul tău Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Autentifică-te pe server"
|
||||
subtitle = "Introdu acreditările serverului tău"
|
||||
link = "sau conectați-vă la un cont self-hosted"
|
||||
|
||||
[setup.server]
|
||||
title = "Conectează-te la server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Introdu URL-ul complet al serverului tău Stirling PDF găzduit l
|
||||
emptyUrl = "Te rugăm să introduci un URL de server"
|
||||
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."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Autentificarea nu este activată"
|
||||
body = "Acest server nu are autentificarea activată. Pentru a vă conecta la acest server, trebuie să activați autentificarea:"
|
||||
step1 = "Setați DOCKER_ENABLE_SECURITY=true în mediul dvs."
|
||||
step2 = "Sau setați security.enableLogin=true în settings.yml"
|
||||
step3 = "Reporniți serverul"
|
||||
|
||||
[setup.login]
|
||||
title = "Autentificare"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Acces timpuriu"
|
||||
reset = "Resetați modificările"
|
||||
downloadJson = "Descărcați JSON"
|
||||
generatePdf = "Generați PDF"
|
||||
saveChanges = "Salvează modificările"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Scalare automată a textului pentru a se potrivi în casete"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Acest vizualizator alpha este încă în dezvoltare — anumite fonturi
|
||||
[pdfTextEditor.empty]
|
||||
title = "Niciun document încărcat"
|
||||
subtitle = "Încărcați un fișier PDF sau JSON pentru a începe editarea conținutului text."
|
||||
dropzone = "Glisați și fixați aici un fișier PDF sau JSON, sau faceți clic pentru a răsfoi"
|
||||
dropzoneWithFiles = "Selectați un fișier din fila Fișiere sau glisați și fixați aici un fișier PDF sau JSON, sau faceți clic pentru a răsfoi"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Bine ați venit la Editor text PDF (Acces timpuriu)"
|
||||
@@ -6106,7 +5984,7 @@ warnings = "Avertizări"
|
||||
suggestions = "Note"
|
||||
currentPageFonts = "Fonturi pe această pagină"
|
||||
allFonts = "Toate fonturile"
|
||||
fallback = "rezervă"
|
||||
fallback = "fallback"
|
||||
missing = "lipsește"
|
||||
perfectMessage = "Toate fonturile pot fi redate perfect."
|
||||
warningMessage = "Unele fonturi pot să nu fie redate corect."
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Получить информацию о PDF"
|
||||
header = "Получить информацию о PDF"
|
||||
submit = "Получить информацию"
|
||||
downloadJson = "Скачать JSON"
|
||||
processing = "Извлечение информации..."
|
||||
results = "Результаты"
|
||||
noResults = "Запустите инструмент, чтобы создать отчет."
|
||||
downloads = "Загрузки"
|
||||
noneDetected = "Ничего не обнаружено"
|
||||
indexTitle = "Индекс"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Полная сводка информации"
|
||||
shortTitle = "Информация о PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Метаданные"
|
||||
formFields = "Поля формы"
|
||||
basicInfo = "Основная информация"
|
||||
documentInfo = "Сведения о документе"
|
||||
compliance = "Соответствие"
|
||||
encryption = "Шифрование"
|
||||
permissions = "Разрешения"
|
||||
other = "Другое"
|
||||
perPageInfo = "Информация по страницам"
|
||||
tableOfContents = "Оглавление"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Вложения"
|
||||
embeddedFiles = "Встроенные файлы"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Слои"
|
||||
structureTree = "Дерево структуры"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Размер"
|
||||
annotations = "Аннотации"
|
||||
images = "Изображения"
|
||||
links = "Ссылки"
|
||||
fonts = "Шрифты"
|
||||
xobjects = "Количество XObject"
|
||||
multimedia = "Мультимедиа"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Страницы"
|
||||
fileSize = "Размер файла"
|
||||
pdfVersion = "Версия PDF"
|
||||
language = "Язык"
|
||||
title = "Сводка по PDF"
|
||||
author = "Автор"
|
||||
created = "Создано"
|
||||
modified = "Изменено"
|
||||
permsAll = "Все разрешения доступны"
|
||||
permsRestricted = "{{count}} ограничений"
|
||||
permsMixed = "Некоторые разрешения ограничены"
|
||||
hasCompliance = "Есть стандарты соответствия"
|
||||
noCompliance = "Нет стандартов соответствия"
|
||||
basic = "Основная информация"
|
||||
documentInfo = "Сведения о документе"
|
||||
securityTitle = "Статус безопасности"
|
||||
technical = "Технические сведения"
|
||||
overviewTitle = "Обзор PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Зашифрованный PDF — используется защита паролем"
|
||||
unencrypted = "Нешифрованный PDF — защита паролем отсутствует"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Изображения"
|
||||
fonts = "Шрифты"
|
||||
formFields = "Поля формы"
|
||||
embeddedFiles = "Встроенные файлы"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Слои"
|
||||
bookmarks = "Закладки"
|
||||
multimedia = "Мультимедиа"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "документ без названия"
|
||||
unknown = "Неизвестный автор"
|
||||
text = "Это PDF из {{pages}} страниц под названием {{title}}, создан {{author}} (версия PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Некоторые файлы не удалось обработать."
|
||||
unexpected = "Непредвиденная ошибка при извлечении."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Извлечение завершено"
|
||||
|
||||
[extractPage]
|
||||
tags = "извлечение"
|
||||
@@ -5262,7 +5177,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> пользователей на сервер. Для бесшовного масштабирования мы рекомендуем план Stirling Server - <strong>неограниченное число мест</strong> и <strong>поддержка SSO</strong> за $99/сервер/мес."
|
||||
freeBody = "Наша лицензия <strong>Open-Core</strong> допускает до <strong>{{freeTierLimit}}</strong> пользователей бесплатно на сервер. Чтобы масштабироваться без ограничений и раньше получить доступ к новому <strong>инструменту редактирования текста в PDF</strong>, рекомендуем тариф Stirling Server — полный редактор и <strong>неограниченные места</strong> за $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Скачать"
|
||||
@@ -5367,31 +5282,6 @@ error = "Не удалось обновить статус пользовате
|
||||
success = "Пользователь успешно удален"
|
||||
error = "Не удалось удалить пользователя"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Изменить пароль"
|
||||
title = "Изменить пароль"
|
||||
subtitle = "Обновить пароль для"
|
||||
newPassword = "Новый пароль"
|
||||
confirmPassword = "Подтвердите пароль"
|
||||
placeholder = "Введите новый пароль"
|
||||
confirmPlaceholder = "Повторно введите новый пароль"
|
||||
passwordRequired = "Пожалуйста, введите новый пароль"
|
||||
passwordMismatch = "Пароли не совпадают"
|
||||
generateRandom = "Сгенерировать безопасный пароль"
|
||||
generatedPreview = "Сгенерированный пароль:"
|
||||
copyTooltip = "Копировать в буфер обмена"
|
||||
copiedToClipboard = "Пароль скопирован в буфер обмена"
|
||||
copyFailed = "Не удалось скопировать пароль"
|
||||
sendEmail = "Отправить пользователю письмо об этом изменении"
|
||||
includePassword = "Включить новый пароль в письмо"
|
||||
forcePasswordChange = "Потребовать смену пароля при следующем входе"
|
||||
emailUnavailable = "Адрес электронной почты этого пользователя недействителен. Уведомления отключены."
|
||||
smtpDisabled = "Для уведомлений по электронной почте необходимо включить SMTP в настройках."
|
||||
notifyOnly = "Будет отправлено письмо без пароля с уведомлением, что администратор его изменил."
|
||||
submit = "Обновить пароль"
|
||||
success = "Пароль успешно обновлён"
|
||||
error = "Не удалось обновить пароль"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Приглашение по email"
|
||||
description = "Введите или вставьте ниже адреса email, разделяя их запятыми. Пользователи получат учетные данные для входа по email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Войдите в аккаунт Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Вход на сервер"
|
||||
subtitle = "Введите учётные данные сервера"
|
||||
link = "или подключитесь к самохостируемой учётной записи"
|
||||
|
||||
[setup.server]
|
||||
title = "Подключение к серверу"
|
||||
@@ -5944,14 +5833,6 @@ description = "Введите полный URL вашего self-hosted серв
|
||||
emptyUrl = "Введите URL сервера"
|
||||
unreachable = "Не удалось подключиться к серверу"
|
||||
testFailed = "Тест подключения не пройден"
|
||||
configFetch = "Не удалось получить конфигурацию сервера. Проверьте URL и попробуйте ещё раз."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Вход не включён"
|
||||
body = "На этом сервере вход не включён. Чтобы подключиться к этому серверу, необходимо включить аутентификацию:"
|
||||
step1 = "Установите DOCKER_ENABLE_SECURITY=true в вашей среде"
|
||||
step2 = "Или установите security.enableLogin=true в settings.yml"
|
||||
step3 = "Перезапустите сервер"
|
||||
|
||||
[setup.login]
|
||||
title = "Вход"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Ранний доступ"
|
||||
reset = "Сбросить изменения"
|
||||
downloadJson = "Скачать JSON"
|
||||
generatePdf = "Сформировать PDF"
|
||||
saveChanges = "Сохранить изменения"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Автоматически подгонять текст по рамке"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Этот альфа‑просмотрщик ещё развивает
|
||||
[pdfTextEditor.empty]
|
||||
title = "Документ не загружен"
|
||||
subtitle = "Загрузите файл PDF или JSON, чтобы начать редактирование текста."
|
||||
dropzone = "Перетащите сюда файл PDF или JSON, или нажмите, чтобы выбрать"
|
||||
dropzoneWithFiles = "Выберите файл на вкладке «Файлы» или перетащите сюда файл PDF или JSON, или нажмите, чтобы выбрать"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Добро пожаловать в редактор текста PDF (ранний доступ)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Získať informácie o PDF"
|
||||
header = "Získať informácie o PDF"
|
||||
submit = "Získať info"
|
||||
downloadJson = "Stiahnuť JSON"
|
||||
processing = "Extrahujú sa informácie..."
|
||||
results = "Výsledky"
|
||||
noResults = "Spustite nástroj na vygenerovanie prehľadu."
|
||||
downloads = "Sťahovania"
|
||||
noneDetected = "Nič nebolo zistené"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Úplné zhrnutie informácií"
|
||||
shortTitle = "Informácie o PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadáta"
|
||||
formFields = "Polia formulára"
|
||||
basicInfo = "Základné informácie"
|
||||
documentInfo = "Informácie o dokumente"
|
||||
compliance = "Súlad"
|
||||
encryption = "Šifrovanie"
|
||||
permissions = "Oprávnenia"
|
||||
other = "Iné"
|
||||
perPageInfo = "Informácie pre strany"
|
||||
tableOfContents = "Obsah"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Prílohy"
|
||||
embeddedFiles = "Vložené súbory"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Vrstvy"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Veľkosť"
|
||||
annotations = "Anotácie"
|
||||
images = "Obrázky"
|
||||
links = "Odkazy"
|
||||
fonts = "Písma"
|
||||
xobjects = "Počty XObjectov"
|
||||
multimedia = "Multimédiá"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Strany"
|
||||
fileSize = "Veľkosť súboru"
|
||||
pdfVersion = "Verzia PDF"
|
||||
language = "Jazyk"
|
||||
title = "Súhrn PDF"
|
||||
author = "Autor"
|
||||
created = "Vytvorené"
|
||||
modified = "Upravené"
|
||||
permsAll = "Všetky oprávnenia povolené"
|
||||
permsRestricted = "{{count}} obmedzení"
|
||||
permsMixed = "Niektoré oprávnenia obmedzené"
|
||||
hasCompliance = "Spĺňa štandardy súladu"
|
||||
noCompliance = "Žiadne štandardy súladu"
|
||||
basic = "Základné informácie"
|
||||
documentInfo = "Informácie o dokumente"
|
||||
securityTitle = "Stav zabezpečenia"
|
||||
technical = "Technické"
|
||||
overviewTitle = "Prehľad PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Šifrované PDF - prítomná ochrana heslom"
|
||||
unencrypted = "Nešifrované PDF - Bez ochrany heslom"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Obrázky"
|
||||
fonts = "Písma"
|
||||
formFields = "Polia formulára"
|
||||
embeddedFiles = "Vložené súbory"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Vrstvy"
|
||||
bookmarks = "Záložky"
|
||||
multimedia = "Multimédiá"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "nepomenovaný dokument"
|
||||
unknown = "Neznámy autor"
|
||||
text = "Toto je {{pages}}-stranové PDF s názvom {{title}} od autora {{author}} (verzia PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Niektoré súbory sa nepodarilo spracovať."
|
||||
unexpected = "Počas extrahovania došlo k neočakávanej chybe."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extrahovanie dokončené"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrahovať"
|
||||
@@ -3637,7 +3552,7 @@ title = "PDF na jednu stránku"
|
||||
header = "PDF na jednu stránku"
|
||||
submit = "Konvertovať na jednu stránku"
|
||||
description = "Tento nástroj zlúči všetky strany vášho PDF do jednej veľkej stránky. Šírka zostane rovnaká ako pri pôvodných stranách, výška bude súčtom výšok všetkých strán."
|
||||
filenamePrefix = "jedna_strana"
|
||||
filenamePrefix = "single_page"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Vyberte súbor PDF v hlavnom zobrazení, aby ste začali"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Upgradovať teraz →"
|
||||
freeTitle = "Serverová licencia"
|
||||
overLimitTitle = "Potrebná serverová licencia"
|
||||
overLimitBody = "Naše licencovanie povoľuje až <strong>{{freeTierLimit}}</strong> používateľov zdarma na server. Máte <strong>{{overLimitUserCopy}}</strong> používateľov Stirling. Ak chcete pokračovať bez prerušenia, prejdite na plán Stirling Server - <strong>neobmedzené miesta</strong>, úpravy textu PDF a plná správa pre $99/server/mo."
|
||||
freeBody = "Naše licencovanie <strong>Open-Core</strong> umožňuje až <strong>{{freeTierLimit}}</strong> používateľov zadarmo na server. Na plynulé škálovanie odporúčame plán Stirling Server - <strong>neobmedzený počet používateľov</strong> a <strong>podporu SSO</strong> za $99/server/mes."
|
||||
freeBody = "Naše licencovanie <strong>Open-Core</strong> povoľuje až <strong>{{freeTierLimit}}</strong> používateľov zdarma na server. Ak chcete škálovať bez prerušenia a získať skorý prístup k nášmu novému <strong>nástroju na úpravu textu PDF</strong>, odporúčame plán Stirling Server - plné úpravy a <strong>neobmedzené miesta</strong> za $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Stiahnuť"
|
||||
@@ -5367,31 +5282,6 @@ error = "Nepodarilo sa aktualizovať stav používateľa"
|
||||
success = "Používateľ bol úspešne odstránený"
|
||||
error = "Nepodarilo sa odstrániť používateľa"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Zmeniť heslo"
|
||||
title = "Zmeniť heslo"
|
||||
subtitle = "Aktualizovať heslo pre"
|
||||
newPassword = "Nové heslo"
|
||||
confirmPassword = "Potvrdiť heslo"
|
||||
placeholder = "Zadajte nové heslo"
|
||||
confirmPlaceholder = "Zadajte nové heslo ešte raz"
|
||||
passwordRequired = "Zadajte nové heslo"
|
||||
passwordMismatch = "Heslá sa nezhodujú"
|
||||
generateRandom = "Vygenerovať bezpečné heslo"
|
||||
generatedPreview = "Vygenerované heslo:"
|
||||
copyTooltip = "Kopírovať do schránky"
|
||||
copiedToClipboard = "Heslo skopírované do schránky"
|
||||
copyFailed = "Heslo sa nepodarilo skopírovať"
|
||||
sendEmail = "Odoslať používateľovi e-mail o tejto zmene"
|
||||
includePassword = "Zahrnúť nové heslo do e-mailu"
|
||||
forcePasswordChange = "Vynútiť zmenu hesla pri najbližšom prihlásení"
|
||||
emailUnavailable = "E-mailová adresa tohto používateľa nie je platná. Upozornenia sú vypnuté."
|
||||
smtpDisabled = "E-mailové upozornenia vyžadujú, aby bolo v nastaveniach povolené SMTP."
|
||||
notifyOnly = "Odošle sa e-mail bez hesla, ktorý používateľa informuje, že ho zmenil administrátor."
|
||||
submit = "Aktualizovať heslo"
|
||||
success = "Heslo bolo úspešne aktualizované"
|
||||
error = "Heslo sa nepodarilo aktualizovať"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Pozvánka e-mailom"
|
||||
description = "Nižšie napíšte alebo vložte e-mailové adresy oddelené čiarkami. Používatelia dostanú prihlasovacie údaje e-mailom."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Prihláste sa pomocou svojho účtu Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Prihlásiť sa na server"
|
||||
subtitle = "Zadajte prihlasovacie údaje k serveru"
|
||||
link = "alebo sa pripojte k self-hosted účtu"
|
||||
|
||||
[setup.server]
|
||||
title = "Pripojiť sa na server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Zadajte úplnú URL svojho self-hostovaného servera Stirling PDF
|
||||
emptyUrl = "Zadajte URL servera"
|
||||
unreachable = "Nedá sa pripojiť k serveru"
|
||||
testFailed = "Test pripojenia zlyhal"
|
||||
configFetch = "Nepodarilo sa načítať konfiguráciu servera. Skontrolujte URL a skúste to znova."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Prihlásenie nie je povolené"
|
||||
body = "Na tomto serveri nie je povolené prihlásenie. Ak sa chcete pripojiť k tomuto serveru, musíte povoliť overenie:"
|
||||
step1 = "Nastavte DOCKER_ENABLE_SECURITY=true vo svojom prostredí"
|
||||
step2 = "Alebo nastavte security.enableLogin=true v súbore settings.yml"
|
||||
step3 = "Reštartujte server"
|
||||
|
||||
[setup.login]
|
||||
title = "Prihlásiť sa"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Skorý prístup"
|
||||
reset = "Resetovať zmeny"
|
||||
downloadJson = "Stiahnuť JSON"
|
||||
generatePdf = "Vygenerovať PDF"
|
||||
saveChanges = "Uložiť zmeny"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automaticky prispôsobiť text do boxov"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Tento alfa prehliadač sa stále vyvíja—niektoré písma, farby, efe
|
||||
[pdfTextEditor.empty]
|
||||
title = "Žiadny dokument nie je načítaný"
|
||||
subtitle = "Načítajte súbor PDF alebo JSON a začnite upravovať textový obsah."
|
||||
dropzone = "Pretiahnite sem súbor PDF alebo JSON, alebo kliknite pre prehľadanie"
|
||||
dropzoneWithFiles = "Vyberte súbor na karte Súbory, alebo sem presuňte súbor PDF alebo JSON, prípadne kliknite pre prehľadanie"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Vitajte v PDF Text Editore (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Pridobite informacije o PDF-ju"
|
||||
header = "Pridobite informacije o PDF-ju"
|
||||
submit = "Pridobi informacije"
|
||||
downloadJson = "Prenesite JSON"
|
||||
processing = "Pridobivanje informacij..."
|
||||
results = "Rezultati"
|
||||
noResults = "Za ustvarjanje poročila zaženite orodje."
|
||||
downloads = "Prenosi"
|
||||
noneDetected = "Ni zaznanih"
|
||||
indexTitle = "Kazalo"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Celoviti povzetek informacij"
|
||||
shortTitle = "Informacije o PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metapodatki"
|
||||
formFields = "Polja obrazca"
|
||||
basicInfo = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
compliance = "Skladnost"
|
||||
encryption = "Šifriranje"
|
||||
permissions = "Dovoljenja"
|
||||
other = "Drugo"
|
||||
perPageInfo = "Informacije po strani"
|
||||
tableOfContents = "Kazalo vsebine"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Priloge"
|
||||
embeddedFiles = "Vdelane datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Plasti"
|
||||
structureTree = "Drevo strukture"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Velikost"
|
||||
annotations = "Opombe"
|
||||
images = "Slike"
|
||||
links = "Povezave"
|
||||
fonts = "Pisave"
|
||||
xobjects = "Število XObject"
|
||||
multimedia = "Večpredstavnost"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Strani"
|
||||
fileSize = "Velikost datoteke"
|
||||
pdfVersion = "Različica PDF"
|
||||
language = "Jezik"
|
||||
title = "Povzetek PDF"
|
||||
author = "Avtor"
|
||||
created = "Ustvarjeno"
|
||||
modified = "Spremenjeno"
|
||||
permsAll = "Vsa dovoljenja so dovoljena"
|
||||
permsRestricted = "{{count}} omejitev"
|
||||
permsMixed = "Nekatera dovoljenja omejena"
|
||||
hasCompliance = "Ima standarde skladnosti"
|
||||
noCompliance = "Brez standardov skladnosti"
|
||||
basic = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
securityTitle = "Varnostno stanje"
|
||||
technical = "Tehnično"
|
||||
overviewTitle = "Pregled PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Šifriran PDF - prisotna zaščita z geslom"
|
||||
unencrypted = "Nešifriran PDF - brez zaščite z geslom"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Slike"
|
||||
fonts = "Pisave"
|
||||
formFields = "Polja obrazca"
|
||||
embeddedFiles = "Vdelane datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Plasti"
|
||||
bookmarks = "Zaznamki"
|
||||
multimedia = "Večpredstavnost"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "neimenovan dokument"
|
||||
unknown = "Neznani avtor"
|
||||
text = "To je {{pages}}-stranski PDF z naslovom {{title}}, ki ga je ustvaril {{author}} (različica PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Nekaterih datotek ni bilo mogoče obdelati."
|
||||
unexpected = "Nepričakovana napaka med pridobivanjem."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Pridobivanje zaključeno"
|
||||
|
||||
[extractPage]
|
||||
tags = "izvleček"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Nadgradi zdaj →"
|
||||
freeTitle = "Licenca strežnika"
|
||||
overLimitTitle = "Potrebna licenca strežnika"
|
||||
overLimitBody = "Naše licenciranje brezplačno omogoča do <strong>{{freeTierLimit}}</strong> uporabnikov na strežnik. Imate <strong>{{overLimitUserCopy}}</strong> uporabnikov Stirling. Za nemoteno uporabo nadgradite na načrt Stirling Server – <strong>neomejena mesta</strong>, urejanje besedila PDF in popoln skrbniški nadzor za $99/strežnik/mesec."
|
||||
freeBody = "Naše licenciranje <strong>Open-Core</strong> omogoča do <strong>{{freeTierLimit}}</strong> uporabnikov brezplačno na strežnik. Za nemoteno skaliranje priporočamo načrt Stirling Server - <strong>neomejena mesta</strong> in <strong>podpora za SSO</strong> za $99/strežnik/mesec."
|
||||
freeBody = "Naše licenciranje <strong>Open-Core</strong> brezplačno omogoča do <strong>{{freeTierLimit}}</strong> uporabnikov na strežnik. Za nemoteno rast in zgodnji dostop do našega novega <strong>orodja za urejanje besedila PDF</strong> priporočamo načrt Stirling Server – polno urejanje in <strong>neomejena mesta</strong> za $99/strežnik/mesec."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Prenesi"
|
||||
@@ -5367,31 +5282,6 @@ error = "Stanja uporabnika ni bilo mogoče posodobiti"
|
||||
success = "Uporabnik uspešno izbrisan"
|
||||
error = "Uporabnika ni bilo mogoče izbrisati"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Spremeni geslo"
|
||||
title = "Spremeni geslo"
|
||||
subtitle = "Posodobite geslo za"
|
||||
newPassword = "Novo geslo"
|
||||
confirmPassword = "Potrdi geslo"
|
||||
placeholder = "Vnesite novo geslo"
|
||||
confirmPlaceholder = "Znova vnesite novo geslo"
|
||||
passwordRequired = "Prosimo, vnesite novo geslo"
|
||||
passwordMismatch = "Gesli se ne ujemata"
|
||||
generateRandom = "Ustvari varno geslo"
|
||||
generatedPreview = "Ustvarjeno geslo:"
|
||||
copyTooltip = "Kopiraj v odložišče"
|
||||
copiedToClipboard = "Geslo je kopirano v odložišče"
|
||||
copyFailed = "Kopiranje gesla ni uspelo"
|
||||
sendEmail = "Uporabniku pošlji e-pošto o tej spremembi"
|
||||
includePassword = "V e-pošto vključi novo geslo"
|
||||
forcePasswordChange = "Prisili uporabnika, da ob naslednji prijavi spremeni geslo"
|
||||
emailUnavailable = "E-poštni naslov tega uporabnika ni veljaven. Obvestila so onemogočena."
|
||||
smtpDisabled = "Za e-poštna obvestila mora biti v nastavitvah omogočen SMTP."
|
||||
notifyOnly = "Poslano bo e-poštno sporočilo brez gesla, ki bo uporabnika obvestilo, da ga je skrbnik spremenil."
|
||||
submit = "Posodobi geslo"
|
||||
success = "Geslo je bilo uspešno posodobljeno"
|
||||
error = "Posodobitev gesla ni uspela"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-poštno povabilo"
|
||||
description = "Spodaj vnesite ali prilepite e-poštne naslove, ločene z vejicami. Uporabniki bodo prejeli prijavne podatke po e-pošti."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Prijavite se s svojim računom Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Prijavite se v strežnik"
|
||||
subtitle = "Vnesite poverilnice strežnika"
|
||||
link = "ali se povežite z računom na lastnem strežniku"
|
||||
|
||||
[setup.server]
|
||||
title = "Poveži se s strežnikom"
|
||||
@@ -5944,14 +5833,6 @@ description = "Vnesite celoten URL svojega samogostovanega strežnika Stirling P
|
||||
emptyUrl = "Vnesite URL strežnika"
|
||||
unreachable = "Povezava s strežnikom ni uspela"
|
||||
testFailed = "Preizkus povezave ni uspel"
|
||||
configFetch = "Pridobitev konfiguracije strežnika ni uspela. Preverite URL in poskusite znova."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Prijava ni omogočena"
|
||||
body = "Na tem strežniku prijava ni omogočena. Za povezavo s tem strežnikom morate omogočiti overjanje:"
|
||||
step1 = "V svojem okolju nastavite DOCKER_ENABLE_SECURITY=true"
|
||||
step2 = "Ali nastavite security.enableLogin=true v settings.yml"
|
||||
step3 = "Znova zaženite strežnik"
|
||||
|
||||
[setup.login]
|
||||
title = "Prijava"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Zgodnji dostop"
|
||||
reset = "Ponastavi spremembe"
|
||||
downloadJson = "Prenesi JSON"
|
||||
generatePdf = "Ustvari PDF"
|
||||
saveChanges = "Shrani spremembe"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Samodejno prilagodi besedilo okvirjem"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ta alfa pregledovalnik se še razvija — nekatere pisave, barve, učin
|
||||
[pdfTextEditor.empty]
|
||||
title = "Ni naloženega dokumenta"
|
||||
subtitle = "Naložite datoteko PDF ali JSON, da začnete urejati besedilo."
|
||||
dropzone = "Sem povlecite in spustite datoteko PDF ali JSON ali kliknite za brskanje"
|
||||
dropzoneWithFiles = "Izberite datoteko na zavihku Datoteke ali sem povlecite in spustite datoteko PDF ali JSON oziroma kliknite za brskanje"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Dobrodošli v PDF Text Editor (zgodnji dostop)"
|
||||
|
||||
@@ -1225,7 +1225,7 @@ odtExt = "OpenDocument tekst (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument prezentacija (.odp)"
|
||||
txtExt = "Običan tekst (.txt)"
|
||||
rtfExt = "Format obogaćenog teksta (.rtf)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "Izabrane datoteke"
|
||||
noFileSelected = "Nije izabrana nijedna datoteka. Koristite panel datoteka da dodate datoteke."
|
||||
convertFiles = "Konvertuj datoteke"
|
||||
@@ -3036,91 +3036,6 @@ title = "Informacije o PDF-u"
|
||||
header = "Informacije o PDF-u"
|
||||
submit = "Informacije"
|
||||
downloadJson = "Preuzmi JSON"
|
||||
processing = "Izdvajanje informacija..."
|
||||
results = "Rezultati"
|
||||
noResults = "Pokrenite alat da generišete izveštaj."
|
||||
downloads = "Preuzimanja"
|
||||
noneDetected = "Nije otkriveno ništa"
|
||||
indexTitle = "Indeks"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Potpuni sažetak informacija"
|
||||
shortTitle = "Informacije o PDF-u"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metapodaci"
|
||||
formFields = "Polja obrasca"
|
||||
basicInfo = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
compliance = "Usklađenost"
|
||||
encryption = "Šifrovanje"
|
||||
permissions = "Dozvole"
|
||||
other = "Ostalo"
|
||||
perPageInfo = "Informacije po stranici"
|
||||
tableOfContents = "Sadržaj"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Prilozi"
|
||||
embeddedFiles = "Ugrađene datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Slojevi"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Veličina"
|
||||
annotations = "Anotacije"
|
||||
images = "Slike"
|
||||
links = "Linkovi"
|
||||
fonts = "Fontovi"
|
||||
xobjects = "Broj XObject-ova"
|
||||
multimedia = "Multimedija"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Stranice"
|
||||
fileSize = "Veličina datoteke"
|
||||
pdfVersion = "PDF verzija"
|
||||
language = "Jezik"
|
||||
title = "PDF sažetak"
|
||||
author = "Autor"
|
||||
created = "Kreirano"
|
||||
modified = "Izmenjeno"
|
||||
permsAll = "Sve dozvole su omogućene"
|
||||
permsRestricted = "{{count}} ograničenja"
|
||||
permsMixed = "Neke dozvole su ograničene"
|
||||
hasCompliance = "Ima standarde usklađenosti"
|
||||
noCompliance = "Nema standarda usklađenosti"
|
||||
basic = "Osnovne informacije"
|
||||
documentInfo = "Informacije o dokumentu"
|
||||
securityTitle = "Status bezbednosti"
|
||||
technical = "Tehničko"
|
||||
overviewTitle = "Pregled PDF-a"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Šifrovan PDF - prisutna zaštita lozinkom"
|
||||
unencrypted = "Nešifrovan PDF - bez zaštite lozinkom"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Slike"
|
||||
fonts = "Fontovi"
|
||||
formFields = "Polja obrasca"
|
||||
embeddedFiles = "Ugrađene datoteke"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Slojevi"
|
||||
bookmarks = "Obeleživači"
|
||||
multimedia = "Multimedija"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "neimenovani dokument"
|
||||
unknown = "Nepoznat autor"
|
||||
text = "Ovo je PDF od {{pages}} stranica pod nazivom {{title}} koji je kreirao {{author}} (PDF verzija {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Neke datoteke nije bilo moguće obraditi."
|
||||
unexpected = "Neočekivana greška tokom izdvajanja."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Izdvajanje završeno"
|
||||
|
||||
[extractPage]
|
||||
tags = "izdvajanje"
|
||||
@@ -3875,7 +3790,7 @@ version = "Aktuelno izdanje"
|
||||
title = "API dokumentacija"
|
||||
header = "API dokumentacija"
|
||||
desc = "Pregledajte i testirajte Stirling PDF API endpoints"
|
||||
tags = "api,dokumentacija,swagger,krajnje tačke,razvoj"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Kako koristimo kolačiće"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Nadogradite sada →"
|
||||
freeTitle = "Serverska licenca"
|
||||
overLimitTitle = "Potrebna serverska licenca"
|
||||
overLimitBody = "Naše licenciranje dozvoljava do <strong>{{freeTierLimit}}</strong> korisnika besplatno po serveru. Imate <strong>{{overLimitUserCopy}}</strong> Stirling korisnika. Da nastavite bez prekida, pređite na Stirling Server plan - <strong>neograničena mesta</strong>, uređivanje PDF teksta i puna admin kontrola za $99/server/mes."
|
||||
freeBody = "Naše licenciranje <strong>Open-Core</strong> dozvoljava do <strong>{{freeTierLimit}}</strong> korisnika besplatno po serveru. Za neometano skaliranje, preporučujemo plan Stirling Server - <strong>neograničena mesta</strong> i <strong>SSO podrška</strong> za $99/server/mo."
|
||||
freeBody = "Naše <strong>Open-Core</strong> licenciranje dozvoljava do <strong>{{freeTierLimit}}</strong> korisnika besplatno po serveru. Da se bez prekida skalirate i dobijete rani pristup našem novom <strong>alatu za uređivanje PDF teksta</strong>, preporučujemo Stirling Server plan - puno uređivanje i <strong>neograničena mesta</strong> za $99/server/mes."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Preuzmi"
|
||||
@@ -5367,31 +5282,6 @@ error = "Ažuriranje statusa korisnika nije uspelo"
|
||||
success = "Korisnik uspešno obrisan"
|
||||
error = "Brisanje korisnika nije uspelo"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Promenite lozinku"
|
||||
title = "Promenite lozinku"
|
||||
subtitle = "Ažurirajte lozinku za"
|
||||
newPassword = "Nova lozinka"
|
||||
confirmPassword = "Potvrdite lozinku"
|
||||
placeholder = "Unesite novu lozinku"
|
||||
confirmPlaceholder = "Ponovo unesite novu lozinku"
|
||||
passwordRequired = "Unesite novu lozinku"
|
||||
passwordMismatch = "Lozinke se ne poklapaju"
|
||||
generateRandom = "Generišite bezbednu lozinku"
|
||||
generatedPreview = "Generisana lozinka:"
|
||||
copyTooltip = "Kopirajte u privremenu memoriju"
|
||||
copiedToClipboard = "Lozinka je kopirana u privremenu memoriju"
|
||||
copyFailed = "Nije uspelo kopiranje lozinke"
|
||||
sendEmail = "Pošaljite korisniku email o ovoj promeni"
|
||||
includePassword = "Uključite novu lozinku u email"
|
||||
forcePasswordChange = "Naterajte korisnika da promeni lozinku pri sledećoj prijavi"
|
||||
emailUnavailable = "Email ovog korisnika nije važeća email adresa. Obaveštenja su onemogućena."
|
||||
smtpDisabled = "Email obaveštenja zahtevaju da SMTP bude omogućen u podešavanjima."
|
||||
notifyOnly = "Biće poslat email bez lozinke, kako bi korisnik znao da je administrator promenio lozinku."
|
||||
submit = "Ažurirajte lozinku"
|
||||
success = "Lozinka je uspešno ažurirana"
|
||||
error = "Ažuriranje lozinke nije uspelo"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Poziv emailom"
|
||||
description = "Ukucajte ili nalepite email adrese ispod, odvojene zarezima. Korisnici će dobiti pristupne podatke putem emaila."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Prijavite se svojim Stirling nalogom"
|
||||
[setup.selfhosted]
|
||||
title = "Prijava na server"
|
||||
subtitle = "Unesite kredencijale servera"
|
||||
link = "ili se povežite na samohostovani nalog"
|
||||
|
||||
[setup.server]
|
||||
title = "Poveži se na server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Unesite puni URL vašeg samohostovanog Stirling PDF servera"
|
||||
emptyUrl = "Unesite URL servera"
|
||||
unreachable = "Nije moguće povezati se sa serverom"
|
||||
testFailed = "Test veze nije uspeo"
|
||||
configFetch = "Nije uspelo preuzimanje konfiguracije servera. Proverite URL i pokušajte ponovo."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Prijavljivanje nije omogućeno"
|
||||
body = "Na ovom serveru prijavljivanje nije omogućeno. Da biste se povezali na ovaj server, morate omogućiti autentikaciju:"
|
||||
step1 = "Postavite DOCKER_ENABLE_SECURITY=true u svom okruženju"
|
||||
step2 = "Ili postavite security.enableLogin=true u settings.yml"
|
||||
step3 = "Restartujte server"
|
||||
|
||||
[setup.login]
|
||||
title = "Prijava"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Rani pristup"
|
||||
reset = "Poništi izmene"
|
||||
downloadJson = "Preuzmi JSON"
|
||||
generatePdf = "Generiši PDF"
|
||||
saveChanges = "Sačuvajte izmene"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Automatski prilagodi tekst okvirima"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Ovaj alfa pregledač je i dalje u razvoju—određeni fontovi, boje, ef
|
||||
[pdfTextEditor.empty]
|
||||
title = "Nijedan dokument nije učitan"
|
||||
subtitle = "Učitajte PDF ili JSON datoteku da biste počeli sa uređivanjem teksta."
|
||||
dropzone = "Prevucite i otpustite PDF ili JSON datoteku ovde ili kliknite da izaberete"
|
||||
dropzoneWithFiles = "Izaberite datoteku sa kartice Datoteke, ili prevucite i otpustite PDF ili JSON datoteku ovde, ili kliknite da izaberete"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Dobrodošli u Uređivač teksta za PDF (rani pristup)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Hämta information om PDF"
|
||||
header = "Hämta information om PDF"
|
||||
submit = "Hämta information"
|
||||
downloadJson = "Ladda ner JSON"
|
||||
processing = "Extraherar information..."
|
||||
results = "Resultat"
|
||||
noResults = "Kör verktyget för att skapa en rapport."
|
||||
downloads = "Nedladdningar"
|
||||
noneDetected = "Inget upptäckt"
|
||||
indexTitle = "Index"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Fullständig informationssammanfattning"
|
||||
shortTitle = "PDF-information"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Metadata"
|
||||
formFields = "Formulärfält"
|
||||
basicInfo = "Grundläggande info"
|
||||
documentInfo = "Dokumentinformation"
|
||||
compliance = "Efterlevnad"
|
||||
encryption = "Kryptering"
|
||||
permissions = "Behörigheter"
|
||||
other = "Övrigt"
|
||||
perPageInfo = "Information per sida"
|
||||
tableOfContents = "Innehållsförteckning"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Bilagor"
|
||||
embeddedFiles = "Inbäddade filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lager"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Storlek"
|
||||
annotations = "Anteckningar"
|
||||
images = "Bilder"
|
||||
links = "Länkar"
|
||||
fonts = "Typsnitt"
|
||||
xobjects = "Antal XObject"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Sidor"
|
||||
fileSize = "Filstorlek"
|
||||
pdfVersion = "PDF-version"
|
||||
language = "Språk"
|
||||
title = "PDF-sammanfattning"
|
||||
author = "Författare"
|
||||
created = "Skapad"
|
||||
modified = "Ändrad"
|
||||
permsAll = "Alla behörigheter tillåtna"
|
||||
permsRestricted = "{{count}} begränsningar"
|
||||
permsMixed = "Vissa behörigheter begränsade"
|
||||
hasCompliance = "Har efterlevnadsstandarder"
|
||||
noCompliance = "Inga efterlevnadsstandarder"
|
||||
basic = "Grundläggande information"
|
||||
documentInfo = "Dokumentinformation"
|
||||
securityTitle = "Säkerhetsstatus"
|
||||
technical = "Tekniskt"
|
||||
overviewTitle = "PDF-översikt"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Krypterad PDF - Lösenordsskydd finns"
|
||||
unencrypted = "Okrypterad PDF - Inget lösenordsskydd"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Bilder"
|
||||
fonts = "Typsnitt"
|
||||
formFields = "Formulärfält"
|
||||
embeddedFiles = "Inbäddade filer"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lager"
|
||||
bookmarks = "Bokmärken"
|
||||
multimedia = "Multimedia"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "ett namnlöst dokument"
|
||||
unknown = "Okänd författare"
|
||||
text = "Detta är en PDF på {{pages}} sidor med titeln {{title}}, skapad av {{author}} (PDF-version {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Vissa filer kunde inte bearbetas."
|
||||
unexpected = "Oväntat fel under extrahering."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Extrahering klar"
|
||||
|
||||
[extractPage]
|
||||
tags = "extrahera"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Uppgradera nu →"
|
||||
freeTitle = "Serverlicens"
|
||||
overLimitTitle = "Serverlicens krävs"
|
||||
overLimitBody = "Vår licensiering tillåter upp till <strong>{{freeTierLimit}}</strong> användare gratis per server. Du har <strong>{{overLimitUserCopy}}</strong> Stirling-användare. För att fortsätta utan avbrott, uppgradera till Stirling Server-planen - <strong>obegränsade platser</strong>, PDF-textredigering och full adminkontroll för $99/server/mån."
|
||||
freeBody = "Vår <strong>Open-Core</strong>-licens tillåter upp till <strong>{{freeTierLimit}}</strong> användare gratis per server. För att skala utan avbrott rekommenderar vi Stirling Server plan - <strong>obegränsat antal platser</strong> och <strong>SSO-stöd</strong> för $99/server/månad."
|
||||
freeBody = "Vår <strong>Open-Core</strong>-licens tillåter upp till <strong>{{freeTierLimit}}</strong> användare gratis per server. För att skala utan avbrott och få tidig åtkomst till vårt nya <strong>PDF-textredigeringsverktyg</strong> rekommenderar vi Stirling Server-planen - full redigering och <strong>obegränsade platser</strong> för $99/server/mån."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Ladda ner"
|
||||
@@ -5367,31 +5282,6 @@ error = "Misslyckades med att uppdatera användarstatus"
|
||||
success = "Användare borttagen"
|
||||
error = "Misslyckades med att ta bort användare"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Byt lösenord"
|
||||
title = "Byt lösenord"
|
||||
subtitle = "Uppdatera lösenordet för"
|
||||
newPassword = "Nytt lösenord"
|
||||
confirmPassword = "Bekräfta lösenord"
|
||||
placeholder = "Ange ett nytt lösenord"
|
||||
confirmPlaceholder = "Ange det nya lösenordet igen"
|
||||
passwordRequired = "Ange ett nytt lösenord"
|
||||
passwordMismatch = "Lösenorden matchar inte"
|
||||
generateRandom = "Generera säkert lösenord"
|
||||
generatedPreview = "Genererat lösenord:"
|
||||
copyTooltip = "Kopiera till urklipp"
|
||||
copiedToClipboard = "Lösenord kopierat till urklipp"
|
||||
copyFailed = "Det gick inte att kopiera lösenordet"
|
||||
sendEmail = "Skicka e-post till användaren om denna ändring"
|
||||
includePassword = "Inkludera det nya lösenordet i e-postmeddelandet"
|
||||
forcePasswordChange = "Tvinga användaren att byta lösenord vid nästa inloggning"
|
||||
emailUnavailable = "Den här användarens e-postadress är inte giltig. Aviseringar är inaktiverade."
|
||||
smtpDisabled = "E-postaviseringar kräver att SMTP är aktiverat i inställningarna."
|
||||
notifyOnly = "Ett e-postmeddelande skickas utan lösenordet och informerar användaren om att en admin har ändrat det."
|
||||
submit = "Uppdatera lösenord"
|
||||
success = "Lösenordet har uppdaterats"
|
||||
error = "Det gick inte att uppdatera lösenordet"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-postinbjudan"
|
||||
description = "Skriv eller klistra in e-postadresser nedan, separerade med kommatecken. Användare får inloggningsuppgifter via e-post."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Logga in med ditt Stirling-konto"
|
||||
[setup.selfhosted]
|
||||
title = "Logga in på server"
|
||||
subtitle = "Ange dina serveruppgifter"
|
||||
link = "eller anslut till ett självhostat konto"
|
||||
|
||||
[setup.server]
|
||||
title = "Anslut till server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Ange den fullständiga URL:en till din självhostade Stirling PDF
|
||||
emptyUrl = "Ange en server-URL"
|
||||
unreachable = "Kunde inte ansluta till servern"
|
||||
testFailed = "Anslutningstest misslyckades"
|
||||
configFetch = "Det gick inte att hämta serverkonfigurationen. Kontrollera URL:en och försök igen."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Inloggning inte aktiverad"
|
||||
body = "Den här servern har inte inloggning aktiverad. För att ansluta till den här servern måste du aktivera autentisering:"
|
||||
step1 = "Ställ in DOCKER_ENABLE_SECURITY=true i din miljö"
|
||||
step2 = "Eller ställ in security.enableLogin=true i settings.yml"
|
||||
step3 = "Starta om servern"
|
||||
|
||||
[setup.login]
|
||||
title = "Logga in"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Tidig åtkomst"
|
||||
reset = "Återställ ändringar"
|
||||
downloadJson = "Ladda ner JSON"
|
||||
generatePdf = "Skapa PDF"
|
||||
saveChanges = "Spara ändringar"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Skala text automatiskt för att passa rutor"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Denna alfa-visare utvecklas fortfarande—vissa typsnitt, färger, tran
|
||||
[pdfTextEditor.empty]
|
||||
title = "Inget dokument inläst"
|
||||
subtitle = "Ladda en PDF- eller JSON-fil för att börja redigera textinnehåll."
|
||||
dropzone = "Dra och släpp en PDF- eller JSON-fil här, eller klicka för att bläddra"
|
||||
dropzoneWithFiles = "Välj en fil från fliken Filer, eller dra och släpp en PDF- eller JSON-fil här, eller klicka för att bläddra"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Välkommen till PDF Text Editor (Tidig åtkomst)"
|
||||
|
||||
@@ -1221,9 +1221,9 @@ pdfaDigitalSignatureWarning = "PDF มีลายเซ็นดิจิทั
|
||||
fileFormat = "รูปแบบไฟล์"
|
||||
wordDoc = "เอกสาร Word"
|
||||
wordDocExt = "เอกสาร Word (.docx)"
|
||||
odtExt = "ข้อความ OpenDocument (.odt)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "งานนำเสนอ OpenDocument (.odp)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
txtExt = "ข้อความล้วน (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
selectedFiles = "ไฟล์ที่เลือก"
|
||||
@@ -3036,91 +3036,6 @@ title = "รับข้อมูลเกี่ยวกับ PDF"
|
||||
header = "รับข้อมูลเกี่ยวกับ PDF"
|
||||
submit = "รับข้อมูล"
|
||||
downloadJson = "ดาวน์โหลด JSON"
|
||||
processing = "กำลังแยกข้อมูล..."
|
||||
results = "ผลลัพธ์"
|
||||
noResults = "เรียกใช้เครื่องมือนี้เพื่อสร้างรายงาน"
|
||||
downloads = "ดาวน์โหลด"
|
||||
noneDetected = "ไม่พบ"
|
||||
indexTitle = "ดัชนี"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "สรุปข้อมูลทั้งหมด"
|
||||
shortTitle = "ข้อมูล PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "ข้อมูลเมตา"
|
||||
formFields = "เขตข้อมูลฟอร์ม"
|
||||
basicInfo = "ข้อมูลพื้นฐาน"
|
||||
documentInfo = "ข้อมูลเอกสาร"
|
||||
compliance = "การปฏิบัติตามมาตรฐาน"
|
||||
encryption = "การเข้ารหัส"
|
||||
permissions = "สิทธิ์"
|
||||
other = "อื่นๆ"
|
||||
perPageInfo = "ข้อมูลรายหน้า"
|
||||
tableOfContents = "สารบัญ"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "ไฟล์แนบ"
|
||||
embeddedFiles = "ไฟล์ฝัง"
|
||||
javaScript = "JavaScript"
|
||||
layers = "เลเยอร์"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "ขนาด"
|
||||
annotations = "คำอธิบายประกอบ"
|
||||
images = "รูปภาพ"
|
||||
links = "ลิงก์"
|
||||
fonts = "ฟอนต์"
|
||||
xobjects = "จำนวน XObject"
|
||||
multimedia = "มัลติมีเดีย"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "หน้า"
|
||||
fileSize = "ขนาดไฟล์"
|
||||
pdfVersion = "เวอร์ชัน PDF"
|
||||
language = "ภาษา"
|
||||
title = "สรุป PDF"
|
||||
author = "ผู้เขียน"
|
||||
created = "สร้างเมื่อ"
|
||||
modified = "แก้ไขเมื่อ"
|
||||
permsAll = "อนุญาตสิทธิ์ทั้งหมด"
|
||||
permsRestricted = "ข้อจำกัด {{count}} รายการ"
|
||||
permsMixed = "มีการจำกัดสิทธิ์บางอย่าง"
|
||||
hasCompliance = "มีมาตรฐานการปฏิบัติตาม"
|
||||
noCompliance = "ไม่มีมาตรฐานการปฏิบัติตาม"
|
||||
basic = "ข้อมูลพื้นฐาน"
|
||||
documentInfo = "ข้อมูลเอกสาร"
|
||||
securityTitle = "สถานะความปลอดภัย"
|
||||
technical = "เชิงเทคนิค"
|
||||
overviewTitle = "ภาพรวมของ PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF เข้ารหัส - มีการป้องกันด้วยรหัสผ่าน"
|
||||
unencrypted = "PDF ไม่เข้ารหัส - ไม่มีการป้องกันรหัสผ่าน"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "รูปภาพ"
|
||||
fonts = "ฟอนต์"
|
||||
formFields = "เขตข้อมูลฟอร์ม"
|
||||
embeddedFiles = "ไฟล์ฝัง"
|
||||
javaScript = "JavaScript"
|
||||
layers = "เลเยอร์"
|
||||
bookmarks = "ที่คั่นหน้า"
|
||||
multimedia = "มัลติมีเดีย"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "เอกสารที่ไม่มีชื่อ"
|
||||
unknown = "ผู้เขียนไม่ทราบ"
|
||||
text = "นี่คือไฟล์ PDF จำนวน {{pages}} หน้า ชื่อ {{title}} สร้างโดย {{author}} (เวอร์ชัน PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "ไม่สามารถประมวลผลไฟล์บางไฟล์ได้"
|
||||
unexpected = "เกิดข้อผิดพลาดที่ไม่คาดคิดระหว่างการแยกข้อมูล"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "การแยกข้อมูลเสร็จสิ้น"
|
||||
|
||||
[extractPage]
|
||||
tags = "แยก"
|
||||
@@ -4378,7 +4293,7 @@ label = "ผู้ให้บริการ"
|
||||
description = "ชื่อผู้ให้บริการ SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.registrationId]
|
||||
label = "รหัสการลงทะเบียน"
|
||||
label = "Registration ID"
|
||||
description = "ตัวระบุการลงทะเบียนของ SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.autoCreateUser]
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "อัปเกรดเลย →"
|
||||
freeTitle = "ไลเซนส์เซิร์ฟเวอร์"
|
||||
overLimitTitle = "ต้องใช้ไลเซนส์เซิร์ฟเวอร์"
|
||||
overLimitBody = "สิทธิ์การใช้งานของเรารองรับผู้ใช้ได้ฟรีสูงสุด <strong>{{freeTierLimit}}</strong> คนต่อเซิร์ฟเวอร์ ขณะนี้คุณมีผู้ใช้ Stirling <strong>{{overLimitUserCopy}}</strong> คน เพื่อใช้งานต่อเนื่อง โปรดอัปเกรดเป็นแพ็กเกจ Stirling Server - <strong>ที่นั่งไม่จำกัด</strong> แก้ไขข้อความ PDF และควบคุมแอดมินเต็มรูปแบบ ราคา $99/ต่อเซิร์ฟเวอร์/เดือน"
|
||||
freeBody = "สัญญาอนุญาตแบบ <strong>Open-Core</strong> ของเราอนุญาตให้ใช้งานฟรีได้สูงสุด <strong>{{freeTierLimit}}</strong> ผู้ใช้ต่อเซิร์ฟเวอร์หนึ่งเครื่อง เพื่อขยายการใช้งานอย่างต่อเนื่อง เราขอแนะนำแผน Stirling Server - <strong>ที่นั่งไม่จำกัด</strong> และ <strong>รองรับ SSO</strong> ในราคา $99/เซิร์ฟเวอร์/เดือน"
|
||||
freeBody = "ไลเซนส์แบบ <strong>Open-Core</strong> ของเรารองรับผู้ใช้ได้ฟรีสูงสุด <strong>{{freeTierLimit}}</strong> คนต่อเซิร์ฟเวอร์ เพื่อขยายการใช้งานได้ต่อเนื่องและเข้าถึง <strong>เครื่องมือแก้ไขข้อความ PDF</strong> ล่วงหน้า เราแนะนำแพ็กเกจ Stirling Server - แก้ไขได้เต็มรูปแบบและ <strong>ที่นั่งไม่จำกัด</strong> ราคา $99/ต่อเซิร์ฟเวอร์/เดือน"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "ดาวน์โหลด"
|
||||
@@ -5367,31 +5282,6 @@ error = "อัปเดตสถานะผู้ใช้ไม่สำเ
|
||||
success = "ลบผู้ใช้เรียบร้อยแล้ว"
|
||||
error = "ลบผู้ใช้ไม่สำเร็จ"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "เปลี่ยนรหัสผ่าน"
|
||||
title = "เปลี่ยนรหัสผ่าน"
|
||||
subtitle = "อัปเดตรหัสผ่านสำหรับ"
|
||||
newPassword = "รหัสผ่านใหม่"
|
||||
confirmPassword = "ยืนยันรหัสผ่าน"
|
||||
placeholder = "ป้อนรหัสผ่านใหม่"
|
||||
confirmPlaceholder = "ป้อนรหัสผ่านใหม่อีกครั้ง"
|
||||
passwordRequired = "โปรดป้อนรหัสผ่านใหม่"
|
||||
passwordMismatch = "รหัสผ่านไม่ตรงกัน"
|
||||
generateRandom = "สร้างรหัสผ่านที่ปลอดภัย"
|
||||
generatedPreview = "รหัสผ่านที่สร้างขึ้น:"
|
||||
copyTooltip = "คัดลอกไปยังคลิปบอร์ด"
|
||||
copiedToClipboard = "คัดลอกรหัสผ่านไปยังคลิปบอร์ดแล้ว"
|
||||
copyFailed = "คัดลอกรหัสผ่านไม่สำเร็จ"
|
||||
sendEmail = "ส่งอีเมลแจ้งผู้ใช้เกี่ยวกับการเปลี่ยนแปลงนี้"
|
||||
includePassword = "รวมรหัสผ่านใหม่ในอีเมล"
|
||||
forcePasswordChange = "บังคับให้ผู้ใช้เปลี่ยนรหัสผ่านในการเข้าสู่ระบบครั้งถัดไป"
|
||||
emailUnavailable = "อีเมลของผู้ใช้นี้ไม่ใช่ที่อยู่อีเมลที่ถูกต้อง การแจ้งเตือนถูกปิดใช้งาน"
|
||||
smtpDisabled = "การแจ้งเตือนทางอีเมลต้องเปิดใช้งาน SMTP ในการตั้งค่า"
|
||||
notifyOnly = "จะมีการส่งอีเมลโดยไม่รวมรหัสผ่าน เพื่อแจ้งให้ผู้ใช้ทราบว่าผู้ดูแลระบบได้เปลี่ยนรหัสผ่านแล้ว"
|
||||
submit = "อัปเดตรหัสผ่าน"
|
||||
success = "อัปเดตรหัสผ่านสำเร็จ"
|
||||
error = "อัปเดตรหัสผ่านไม่สำเร็จ"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "เชิญทางอีเมล"
|
||||
description = "พิมพ์หรือวางอีเมลด้านล่าง คั่นด้วยเครื่องหมายจุลภาค ผู้ใช้จะได้รับข้อมูลเข้าสู่ระบบทางอีเมล"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "ลงชื่อเข้าใช้ด้วยบัญชี S
|
||||
[setup.selfhosted]
|
||||
title = "ลงชื่อเข้าใช้เซิร์ฟเวอร์"
|
||||
subtitle = "ป้อนข้อมูลรับรองของเซิร์ฟเวอร์ของคุณ"
|
||||
link = "หรือเชื่อมต่อกับบัญชีแบบ self-hosted"
|
||||
|
||||
[setup.server]
|
||||
title = "เชื่อมต่อกับเซิร์ฟเวอร์"
|
||||
@@ -5944,14 +5833,6 @@ description = "ป้อน URL แบบเต็มของเซิร์ฟ
|
||||
emptyUrl = "โปรดป้อน URL เซิร์ฟเวอร์"
|
||||
unreachable = "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"
|
||||
testFailed = "การทดสอบการเชื่อมต่อล้มเหลว"
|
||||
configFetch = "ไม่สามารถดึงการกำหนดค่าของเซิร์ฟเวอร์ได้ โปรดตรวจสอบ URL แล้วลองอีกครั้ง"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "ไม่ได้เปิดใช้งานการเข้าสู่ระบบ"
|
||||
body = "เซิร์ฟเวอร์นี้ไม่ได้เปิดใช้งานการเข้าสู่ระบบ เพื่อเชื่อมต่อกับเซิร์ฟเวอร์นี้ คุณต้องเปิดใช้งานการยืนยันตัวตน:"
|
||||
step1 = "กำหนดค่า DOCKER_ENABLE_SECURITY=true ในสภาพแวดล้อมของคุณ"
|
||||
step2 = "หรือกำหนดค่า security.enableLogin=true ใน settings.yml"
|
||||
step3 = "เริ่มเซิร์ฟเวอร์ใหม่"
|
||||
|
||||
[setup.login]
|
||||
title = "เข้าสู่ระบบ"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "เข้าถึงล่วงหน้า"
|
||||
reset = "รีเซ็ตการเปลี่ยนแปลง"
|
||||
downloadJson = "ดาวน์โหลด JSON"
|
||||
generatePdf = "สร้าง PDF"
|
||||
saveChanges = "บันทึกการเปลี่ยนแปลง"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ปรับขนาดข้อความอัตโนมัติให้พอดีกล่อง"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "ตัวดูแบบ alpha นี้ยังพัฒนาอย
|
||||
[pdfTextEditor.empty]
|
||||
title = "ยังไม่ได้โหลดเอกสาร"
|
||||
subtitle = "โหลดไฟล์ PDF หรือ JSON เพื่อเริ่มแก้ไขข้อความ"
|
||||
dropzone = "ลากและวางไฟล์ PDF หรือ JSON ที่นี่ หรือคลิกเพื่อเรียกดู"
|
||||
dropzoneWithFiles = "เลือกไฟล์จากแท็บไฟล์ หรือลากและวางไฟล์ PDF หรือ JSON ที่นี่ หรือคลิกเพื่อเรียกดู"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "ยินดีต้อนรับสู่ PDF Text Editor (Early Access)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF Hakkında Bilgi Al"
|
||||
header = "PDF Hakkında Bilgi Al"
|
||||
submit = "Bilgi Al"
|
||||
downloadJson = "JSON İndir"
|
||||
processing = "Bilgi çıkarılıyor..."
|
||||
results = "Sonuçlar"
|
||||
noResults = "Bir rapor oluşturmak için aracı çalıştırın."
|
||||
downloads = "İndirmeler"
|
||||
noneDetected = "Hiçbiri tespit edilmedi"
|
||||
indexTitle = "Dizin"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Tam bilgi özeti"
|
||||
shortTitle = "PDF Bilgileri"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Meta veriler"
|
||||
formFields = "Form Alanları"
|
||||
basicInfo = "Temel Bilgiler"
|
||||
documentInfo = "Belge Bilgileri"
|
||||
compliance = "Uyumluluk"
|
||||
encryption = "Şifreleme"
|
||||
permissions = "İzinler"
|
||||
other = "Diğer"
|
||||
perPageInfo = "Sayfa Başına Bilgi"
|
||||
tableOfContents = "İçindekiler"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Ekler"
|
||||
embeddedFiles = "Gömülü Dosyalar"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Katmanlar"
|
||||
structureTree = "Yapı Ağacı"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Boyut"
|
||||
annotations = "Açıklamalar"
|
||||
images = "Görüntüler"
|
||||
links = "Bağlantılar"
|
||||
fonts = "Yazı Tipleri"
|
||||
xobjects = "XObject Sayıları"
|
||||
multimedia = "Multimedya"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Sayfalar"
|
||||
fileSize = "Dosya Boyutu"
|
||||
pdfVersion = "PDF Sürümü"
|
||||
language = "Dil"
|
||||
title = "PDF Özeti"
|
||||
author = "Yazar"
|
||||
created = "Oluşturulma"
|
||||
modified = "Değiştirilme"
|
||||
permsAll = "Tüm izinlere izin verildi"
|
||||
permsRestricted = "{{count}} kısıtlama"
|
||||
permsMixed = "Bazı izinler kısıtlandı"
|
||||
hasCompliance = "Uyumluluk standartlarına sahip"
|
||||
noCompliance = "Uyumluluk standardı yok"
|
||||
basic = "Temel Bilgiler"
|
||||
documentInfo = "Belge Bilgileri"
|
||||
securityTitle = "Güvenlik Durumu"
|
||||
technical = "Teknik"
|
||||
overviewTitle = "PDF Genel Bakış"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "Şifrelenmiş PDF - Parola koruması var"
|
||||
unencrypted = "Şifrelenmemiş PDF - Parola koruması yok"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Görüntüler"
|
||||
fonts = "Yazı Tipleri"
|
||||
formFields = "Form Alanları"
|
||||
embeddedFiles = "Gömülü Dosyalar"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Katmanlar"
|
||||
bookmarks = "Yer İmleri"
|
||||
multimedia = "Multimedya"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "başlıksız bir belge"
|
||||
unknown = "Bilinmeyen Yazar"
|
||||
text = "Bu, {{author}} tarafından oluşturulan, {{title}} başlıklı {{pages}} sayfalık bir PDF'dir (PDF sürümü {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Bazı dosyalar işlenemedi."
|
||||
unexpected = "Çıkarma sırasında beklenmeyen bir hata oluştu."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Çıkarma tamamlandı"
|
||||
|
||||
[extractPage]
|
||||
tags = "çıkar"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Şimdi yükselt →"
|
||||
freeTitle = "Sunucu Lisansı"
|
||||
overLimitTitle = "Sunucu Lisansı Gerekli"
|
||||
overLimitBody = "Lisansımız, sunucu başına ücretsiz olarak en fazla <strong>{{freeTierLimit}}</strong> kullanıcıya izin verir. <strong>{{overLimitUserCopy}}</strong> Stirling kullanıcınız var. Kesintisiz devam etmek için Stirling Server planına yükseltin - <strong>sınırsız koltuk</strong>, PDF metin düzenleme ve tam yönetici kontrolü $99/server/ay."
|
||||
freeBody = "<strong>Open-Core</strong> lisanslamamız, sunucu başına en fazla <strong>{{freeTierLimit}}</strong> kullanıcıya ücretsiz izin verir. Kesintisiz ölçeklendirme için Stirling Server planını öneririz - <strong>sınırsız kullanıcı</strong> ve <strong>SSO desteği</strong> için $99/sunucu/ay."
|
||||
freeBody = "<strong>Open-Core</strong> lisansımız, sunucu başına ücretsiz olarak en fazla <strong>{{freeTierLimit}}</strong> kullanıcıya izin verir. Kesintisiz ölçeklemek ve yeni <strong>PDF metin düzenleme aracımıza</strong> erken erişim almak için Stirling Server planını öneririz - tam düzenleme ve <strong>sınırsız koltuk</strong> $99/server/ay."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "İndir"
|
||||
@@ -5367,31 +5282,6 @@ error = "Kullanıcı durumu güncellenemedi"
|
||||
success = "Kullanıcı başarıyla silindi"
|
||||
error = "Kullanıcı silinemedi"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Parolayı değiştir"
|
||||
title = "Parolayı değiştir"
|
||||
subtitle = "Şunun için parolayı güncelle"
|
||||
newPassword = "Yeni parola"
|
||||
confirmPassword = "Parolayı onayla"
|
||||
placeholder = "Yeni bir parola girin"
|
||||
confirmPlaceholder = "Yeni parolayı tekrar girin"
|
||||
passwordRequired = "Lütfen yeni bir parola girin"
|
||||
passwordMismatch = "Parolalar eşleşmiyor"
|
||||
generateRandom = "Güvenli parola oluştur"
|
||||
generatedPreview = "Oluşturulan parola:"
|
||||
copyTooltip = "Panoya kopyala"
|
||||
copiedToClipboard = "Parola panoya kopyalandı"
|
||||
copyFailed = "Parola kopyalanamadı"
|
||||
sendEmail = "Kullanıcıya bu değişiklik hakkında e-posta gönder"
|
||||
includePassword = "E-postaya yeni parolayı dahil et"
|
||||
forcePasswordChange = "Kullanıcının bir sonraki girişte parolasını değiştirmesini zorunlu kıl"
|
||||
emailUnavailable = "Bu kullanıcının e-posta adresi geçerli değil. Bildirimler devre dışı."
|
||||
smtpDisabled = "E-posta bildirimleri için ayarlarda SMTP'nin etkinleştirilmesi gerekir."
|
||||
notifyOnly = "Parola olmadan bir e-posta gönderilecek ve kullanıcıya bir yöneticinin parolayı değiştirdiği bildirilecek."
|
||||
submit = "Parolayı güncelle"
|
||||
success = "Parola başarıyla güncellendi"
|
||||
error = "Parola güncellenemedi"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "E-posta Daveti"
|
||||
description = "Aşağıya e-postaları virgülle ayırarak yazın veya yapıştırın. Kullanıcılar giriş bilgilerini e-posta ile alacaktır."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Stirling hesabınızla oturum açın"
|
||||
[setup.selfhosted]
|
||||
title = "Sunucuda Oturum Açın"
|
||||
subtitle = "Sunucu kimlik bilgilerinizi girin"
|
||||
link = "veya kendi barındırdığınız bir hesaba bağlanın"
|
||||
|
||||
[setup.server]
|
||||
title = "Sunucuya Bağlan"
|
||||
@@ -5944,14 +5833,6 @@ description = "Öz barındırılan Stirling PDF sunucunuzun tam URL'sini girin"
|
||||
emptyUrl = "Lütfen bir sunucu URL'si girin"
|
||||
unreachable = "Sunucuya bağlanılamadı"
|
||||
testFailed = "Bağlantı testi başarısız"
|
||||
configFetch = "Sunucu yapılandırması alınamadı. Lütfen URL'yi kontrol edip tekrar deneyin."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Giriş Etkin Değil"
|
||||
body = "Bu sunucuda giriş etkin değil. Bu sunucuya bağlanmak için kimlik doğrulamayı etkinleştirmelisiniz:"
|
||||
step1 = "Ortamınızda DOCKER_ENABLE_SECURITY=true olarak ayarlayın"
|
||||
step2 = "Ya da settings.yml içinde security.enableLogin=true olarak ayarlayın"
|
||||
step3 = "Sunucuyu yeniden başlatın"
|
||||
|
||||
[setup.login]
|
||||
title = "Oturum Aç"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Erken Erişim"
|
||||
reset = "Değişiklikleri Sıfırla"
|
||||
downloadJson = "JSON'u İndir"
|
||||
generatePdf = "PDF Oluştur"
|
||||
saveChanges = "Değişiklikleri Kaydet"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Metni kutulara otomatik sığdır"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Bu alfa görüntüleyici hâlâ gelişiyor—bazı yazı tipleri, renkl
|
||||
[pdfTextEditor.empty]
|
||||
title = "Belge yüklenmedi"
|
||||
subtitle = "Metin içeriğini düzenlemeye başlamak için bir PDF veya JSON dosyası yükleyin."
|
||||
dropzone = "Buraya bir PDF veya JSON dosyası sürükleyip bırakın veya göz atmak için tıklayın"
|
||||
dropzoneWithFiles = "Dosyalar sekmesinden bir dosya seçin veya buraya bir PDF veya JSON dosyası sürükleyip bırakın veya göz atmak için tıklayın"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Metin Düzenleyiciye Hoş Geldiniz (Erken Erişim)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Отримати інформацію в PDF"
|
||||
header = "Отримати інформацію в PDF"
|
||||
submit = "Отримати інформацію"
|
||||
downloadJson = "Завантажити JSON"
|
||||
processing = "Вилучення інформації..."
|
||||
results = "Результати"
|
||||
noResults = "Запустіть інструмент, щоб сформувати звіт."
|
||||
downloads = "Завантаження"
|
||||
noneDetected = "Нічого не виявлено"
|
||||
indexTitle = "Покажчик"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Повне зведення інформації"
|
||||
shortTitle = "Інформація про PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Метадані"
|
||||
formFields = "Поля форми"
|
||||
basicInfo = "Базова інформація"
|
||||
documentInfo = "Інформація про документ"
|
||||
compliance = "Відповідність"
|
||||
encryption = "Шифрування"
|
||||
permissions = "Дозволи"
|
||||
other = "Інше"
|
||||
perPageInfo = "Інформація по сторінках"
|
||||
tableOfContents = "Зміст"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Вкладення"
|
||||
embeddedFiles = "Вбудовані файли"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Шари"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Розмір"
|
||||
annotations = "Анотації"
|
||||
images = "Зображення"
|
||||
links = "Посилання"
|
||||
fonts = "Шрифти"
|
||||
xobjects = "Кількість XObject"
|
||||
multimedia = "Мультимедіа"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Сторінки"
|
||||
fileSize = "Розмір файлу"
|
||||
pdfVersion = "Версія PDF"
|
||||
language = "Мова"
|
||||
title = "Зведення PDF"
|
||||
author = "Автор"
|
||||
created = "Створено"
|
||||
modified = "Змінено"
|
||||
permsAll = "Усі дозволи надано"
|
||||
permsRestricted = "{{count}} обмежень"
|
||||
permsMixed = "Деякі дозволи обмежено"
|
||||
hasCompliance = "Відповідає стандартам відповідності"
|
||||
noCompliance = "Немає стандартів відповідності"
|
||||
basic = "Основна інформація"
|
||||
documentInfo = "Інформація про документ"
|
||||
securityTitle = "Стан безпеки"
|
||||
technical = "Технічна інформація"
|
||||
overviewTitle = "Огляд PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF зашифровано — встановлено захист паролем"
|
||||
unencrypted = "PDF не зашифровано — немає захисту паролем"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Зображення"
|
||||
fonts = "Шрифти"
|
||||
formFields = "Поля форми"
|
||||
embeddedFiles = "Вбудовані файли"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Шари"
|
||||
bookmarks = "Закладки"
|
||||
multimedia = "Мультимедіа"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "документ без назви"
|
||||
unknown = "Невідомий автор"
|
||||
text = "Це PDF на {{pages}} сторінок під назвою {{title}}, створений {{author}} (версія PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Деякі файли не вдалося обробити."
|
||||
unexpected = "Неочікувана помилка під час вилучення."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Вилучення завершено"
|
||||
|
||||
[extractPage]
|
||||
tags = "екстракт"
|
||||
@@ -3875,7 +3790,7 @@ version = "Текущий релиз"
|
||||
title = "Документація API"
|
||||
header = "Документація API"
|
||||
desc = "Переглядайте та тестуйте кінцеві точки API Stirling PDF"
|
||||
tags = "api,документація,swagger,кінцеві точки,розробка"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Як ми використовуємо файли cookie"
|
||||
@@ -5262,7 +5177,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> користувачів безкоштовно на сервер. Щоб масштабуватися без перерв, рекомендуємо план Stirling Server — <strong>необмежена кількість місць</strong> і <strong>підтримка SSO</strong> за $99/сервер/міс."
|
||||
freeBody = "Наша <strong>Open-Core</strong> ліцензія дозволяє до <strong>{{freeTierLimit}}</strong> користувачів безкоштовно на сервер. Щоб масштабуватися безперервно та отримати ранній доступ до нового <strong>інструмента редагування тексту PDF</strong>, рекомендуємо план Stirling Server — повне редагування та <strong>необмежена кількість місць</strong> за $99/server/mo."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Завантажити"
|
||||
@@ -5367,31 +5282,6 @@ error = "Не вдалося оновити статус користувача"
|
||||
success = "Користувача успішно видалено"
|
||||
error = "Не вдалося видалити користувача"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Змінити пароль"
|
||||
title = "Змінити пароль"
|
||||
subtitle = "Оновити пароль для"
|
||||
newPassword = "Новий пароль"
|
||||
confirmPassword = "Підтвердження пароля"
|
||||
placeholder = "Введіть новий пароль"
|
||||
confirmPlaceholder = "Повторно введіть новий пароль"
|
||||
passwordRequired = "Будь ласка, введіть новий пароль"
|
||||
passwordMismatch = "Паролі не збігаються"
|
||||
generateRandom = "Згенерувати надійний пароль"
|
||||
generatedPreview = "Згенерований пароль:"
|
||||
copyTooltip = "Копіювати в буфер обміну"
|
||||
copiedToClipboard = "Пароль скопійовано в буфер обміну"
|
||||
copyFailed = "Не вдалося скопіювати пароль"
|
||||
sendEmail = "Надіслати користувачу електронний лист про цю зміну"
|
||||
includePassword = "Додати новий пароль до листа"
|
||||
forcePasswordChange = "Примусити користувача змінити пароль під час наступного входу"
|
||||
emailUnavailable = "Електронна адреса цього користувача недійсна. Сповіщення вимкнено."
|
||||
smtpDisabled = "Для сповіщень електронною поштою потрібно ввімкнути SMTP у налаштуваннях."
|
||||
notifyOnly = "Буде надіслано лист без пароля, щоб повідомити користувача, що адміністратор його змінив."
|
||||
submit = "Оновити пароль"
|
||||
success = "Пароль успішно оновлено"
|
||||
error = "Не вдалося оновити пароль"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Запрошення електронною поштою"
|
||||
description = "Введіть або вставте адреси нижче, розділені комами. Користувачі отримають дані для входу електронною поштою."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Увійдіть через обліковий запис Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Увійдіть на сервер"
|
||||
subtitle = "Введіть облікові дані сервера"
|
||||
link = "або підключіться до самохостингового облікового запису"
|
||||
|
||||
[setup.server]
|
||||
title = "Під’єднатися до сервера"
|
||||
@@ -5944,14 +5833,6 @@ description = "Введіть повну URL-адресу вашого само
|
||||
emptyUrl = "Введіть URL сервера"
|
||||
unreachable = "Не вдалося під’єднатися до сервера"
|
||||
testFailed = "Тест підключення не вдався"
|
||||
configFetch = "Не вдалося отримати конфігурацію сервера. Перевірте URL і спробуйте ще раз."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Вхід не ввімкнено"
|
||||
body = "На цьому сервері не ввімкнено вхід. Щоб підключитися до цього сервера, потрібно ввімкнути автентифікацію:"
|
||||
step1 = "Встановіть DOCKER_ENABLE_SECURITY=true у вашому середовищі"
|
||||
step2 = "Або встановіть security.enableLogin=true у settings.yml"
|
||||
step3 = "Перезапустіть сервер"
|
||||
|
||||
[setup.login]
|
||||
title = "Вхід"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Ранній доступ"
|
||||
reset = "Скинути зміни"
|
||||
downloadJson = "Завантажити JSON"
|
||||
generatePdf = "Згенерувати PDF"
|
||||
saveChanges = "Зберегти зміни"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Автопідгін тексту під рамки"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Цей альфа-переглядач ще розвивається
|
||||
[pdfTextEditor.empty]
|
||||
title = "Документ не завантажено"
|
||||
subtitle = "Завантажте файл PDF або JSON, щоб почати редагувати текстовий вміст."
|
||||
dropzone = "Перетягніть і відпустіть файл PDF або JSON сюди, або натисніть, щоб вибрати"
|
||||
dropzoneWithFiles = "Виберіть файл на вкладці Файли або перетягніть і відпустіть файл PDF чи JSON сюди, або натисніть, щоб вибрати"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Вітаємо у Редакторі тексту PDF (ранній доступ)"
|
||||
|
||||
@@ -301,7 +301,7 @@ saveSettings = "Lưu cài đặt thao tác"
|
||||
pipelineNamePrompt = "Nhập tên pipeline tại đây"
|
||||
selectOperation = "Chọn thao tác"
|
||||
addOperationButton = "Thêm thao tác"
|
||||
pipelineHeader = "Chuỗi xử lý:"
|
||||
pipelineHeader = "Pipeline:"
|
||||
saveButton = "Tải xuống"
|
||||
validateButton = "Xác thực"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "Lấy thông tin PDF"
|
||||
header = "Lấy thông tin PDF"
|
||||
submit = "Lấy thông tin"
|
||||
downloadJson = "Tải xuống JSON"
|
||||
processing = "Đang trích xuất thông tin..."
|
||||
results = "Kết quả"
|
||||
noResults = "Chạy công cụ để tạo báo cáo."
|
||||
downloads = "Tải xuống"
|
||||
noneDetected = "Không phát hiện"
|
||||
indexTitle = "Chỉ mục"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "Tóm tắt thông tin đầy đủ"
|
||||
shortTitle = "Thông tin PDF"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "Siêu dữ liệu"
|
||||
formFields = "Trường biểu mẫu"
|
||||
basicInfo = "Thông tin cơ bản"
|
||||
documentInfo = "Thông tin tài liệu"
|
||||
compliance = "Tuân thủ"
|
||||
encryption = "Mã hóa"
|
||||
permissions = "Quyền"
|
||||
other = "Khác"
|
||||
perPageInfo = "Thông tin theo trang"
|
||||
tableOfContents = "Mục lục"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "Tệp đính kèm"
|
||||
embeddedFiles = "Tệp nhúng"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lớp"
|
||||
structureTree = "StructureTree"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "Kích thước"
|
||||
annotations = "Chú thích"
|
||||
images = "Hình ảnh"
|
||||
links = "Liên kết"
|
||||
fonts = "Phông chữ"
|
||||
xobjects = "Số lượng XObject"
|
||||
multimedia = "Đa phương tiện"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "Trang"
|
||||
fileSize = "Kích thước tệp"
|
||||
pdfVersion = "Phiên bản PDF"
|
||||
language = "Ngôn ngữ"
|
||||
title = "Tóm tắt PDF"
|
||||
author = "Tác giả"
|
||||
created = "Đã tạo"
|
||||
modified = "Đã sửa đổi"
|
||||
permsAll = "Tất cả quyền được cho phép"
|
||||
permsRestricted = "{{count}} giới hạn"
|
||||
permsMixed = "Một số quyền bị hạn chế"
|
||||
hasCompliance = "Có tiêu chuẩn tuân thủ"
|
||||
noCompliance = "Không có tiêu chuẩn tuân thủ"
|
||||
basic = "Thông tin cơ bản"
|
||||
documentInfo = "Thông tin tài liệu"
|
||||
securityTitle = "Trạng thái bảo mật"
|
||||
technical = "Kỹ thuật"
|
||||
overviewTitle = "Tổng quan PDF"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "PDF đã mã hóa - Có bảo vệ bằng mật khẩu"
|
||||
unencrypted = "PDF không mã hóa - Không có bảo vệ bằng mật khẩu"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "Hình ảnh"
|
||||
fonts = "Phông chữ"
|
||||
formFields = "Trường biểu mẫu"
|
||||
embeddedFiles = "Tệp nhúng"
|
||||
javaScript = "JavaScript"
|
||||
layers = "Lớp"
|
||||
bookmarks = "Dấu trang"
|
||||
multimedia = "Đa phương tiện"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "một tài liệu không tiêu đề"
|
||||
unknown = "Tác giả không xác định"
|
||||
text = "Đây là PDF {{pages}} trang có tiêu đề {{title}} do {{author}} tạo (phiên bản PDF {{version}})."
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "Một số tệp không thể xử lý."
|
||||
unexpected = "Lỗi không mong muốn trong quá trình trích xuất."
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "Hoàn tất trích xuất"
|
||||
|
||||
[extractPage]
|
||||
tags = "trích xuất"
|
||||
@@ -5262,7 +5177,7 @@ upgrade = "Nâng cấp ngay →"
|
||||
freeTitle = "Giấy phép Server"
|
||||
overLimitTitle = "Cần giấy phép Server"
|
||||
overLimitBody = "Giấy phép của chúng tôi cho phép tối đa <strong>{{freeTierLimit}}</strong> người dùng miễn phí mỗi server. Bạn có <strong>{{overLimitUserCopy}}</strong> người dùng Stirling. Để tiếp tục không gián đoạn, hãy nâng cấp lên gói Stirling Server - <strong>số ghế không giới hạn</strong>, chỉnh sửa văn bản PDF và toàn quyền quản trị với $99/server/tháng."
|
||||
freeBody = "Giấy phép <strong>Open-Core</strong> của chúng tôi cho phép tối đa <strong>{{freeTierLimit}}</strong> người dùng miễn phí cho mỗi máy chủ. Để mở rộng quy mô liền mạch, chúng tôi khuyến nghị gói Stirling Server - <strong>số lượng người dùng không giới hạn</strong> và <strong>hỗ trợ SSO</strong> với giá $99/máy chủ/tháng."
|
||||
freeBody = "Giấy phép <strong>Open-Core</strong> của chúng tôi cho phép tối đa <strong>{{freeTierLimit}}</strong> người dùng miễn phí mỗi server. Để mở rộng không gián đoạn và truy cập sớm <strong>công cụ chỉnh sửa văn bản PDF</strong> mới, chúng tôi khuyến nghị gói Stirling Server - chỉnh sửa đầy đủ và <strong>số ghế không giới hạn</strong> với $99/server/tháng."
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "Tải xuống"
|
||||
@@ -5367,31 +5282,6 @@ error = "Cập nhật trạng thái người dùng thất bại"
|
||||
success = "Xóa người dùng thành công"
|
||||
error = "Xóa người dùng thất bại"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "Đổi mật khẩu"
|
||||
title = "Đổi mật khẩu"
|
||||
subtitle = "Cập nhật mật khẩu cho"
|
||||
newPassword = "Mật khẩu mới"
|
||||
confirmPassword = "Xác nhận mật khẩu"
|
||||
placeholder = "Nhập mật khẩu mới"
|
||||
confirmPlaceholder = "Nhập lại mật khẩu mới"
|
||||
passwordRequired = "Vui lòng nhập mật khẩu mới"
|
||||
passwordMismatch = "Mật khẩu không khớp"
|
||||
generateRandom = "Tạo mật khẩu an toàn"
|
||||
generatedPreview = "Mật khẩu đã tạo:"
|
||||
copyTooltip = "Sao chép vào bộ nhớ tạm"
|
||||
copiedToClipboard = "Đã sao chép mật khẩu vào bộ nhớ tạm"
|
||||
copyFailed = "Không thể sao chép mật khẩu"
|
||||
sendEmail = "Gửi email cho người dùng về thay đổi này"
|
||||
includePassword = "Bao gồm mật khẩu mới trong email"
|
||||
forcePasswordChange = "Buộc người dùng đổi mật khẩu ở lần đăng nhập tiếp theo"
|
||||
emailUnavailable = "Email của người dùng này không phải là địa chỉ email hợp lệ. Đã tắt thông báo."
|
||||
smtpDisabled = "Thông báo email yêu cầu bật SMTP trong cài đặt."
|
||||
notifyOnly = "Sẽ gửi một email không kèm mật khẩu, cho người dùng biết quản trị viên đã thay đổi mật khẩu."
|
||||
submit = "Cập nhật mật khẩu"
|
||||
success = "Cập nhật mật khẩu thành công"
|
||||
error = "Không thể cập nhật mật khẩu"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "Mời qua Email"
|
||||
description = "Nhập hoặc dán email bên dưới, phân tách bằng dấu phẩy. Người dùng sẽ nhận thông tin đăng nhập qua email."
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "Đăng nhập bằng tài khoản Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Đăng nhập vào server"
|
||||
subtitle = "Nhập thông tin đăng nhập server"
|
||||
link = "hoặc kết nối tới tài khoản tự lưu trữ"
|
||||
|
||||
[setup.server]
|
||||
title = "Kết nối đến server"
|
||||
@@ -5944,14 +5833,6 @@ description = "Nhập URL đầy đủ của server Stirling PDF tự lưu trữ
|
||||
emptyUrl = "Vui lòng nhập URL server"
|
||||
unreachable = "Không thể kết nối đến server"
|
||||
testFailed = "Kiểm tra kết nối thất bại"
|
||||
configFetch = "Không thể lấy cấu hình máy chủ. Vui lòng kiểm tra URL và thử lại."
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "Chưa bật đăng nhập"
|
||||
body = "Máy chủ này chưa bật chức năng đăng nhập. Để kết nối tới máy chủ này, bạn phải bật xác thực:"
|
||||
step1 = "Đặt DOCKER_ENABLE_SECURITY=true trong môi trường của bạn"
|
||||
step2 = "Hoặc đặt security.enableLogin=true trong settings.yml"
|
||||
step3 = "Khởi động lại máy chủ"
|
||||
|
||||
[setup.login]
|
||||
title = "Đăng nhập"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "Truy cập sớm"
|
||||
reset = "Đặt lại thay đổi"
|
||||
downloadJson = "Tải JSON"
|
||||
generatePdf = "Tạo PDF"
|
||||
saveChanges = "Lưu thay đổi"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Tự căn chỉnh văn bản cho vừa hộp"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "Trình xem alpha này vẫn đang phát triển—một số font, màu
|
||||
[pdfTextEditor.empty]
|
||||
title = "Chưa tải tài liệu"
|
||||
subtitle = "Tải tệp PDF hoặc JSON để bắt đầu chỉnh sửa nội dung văn bản."
|
||||
dropzone = "Kéo và thả tệp PDF hoặc JSON vào đây, hoặc nhấp để duyệt"
|
||||
dropzoneWithFiles = "Chọn một tệp từ tab Tệp, hoặc kéo và thả tệp PDF hoặc JSON vào đây, hoặc nhấp để duyệt"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Chào mừng đến với PDF Text Editor (Truy cập sớm)"
|
||||
|
||||
@@ -1181,7 +1181,7 @@ selectFilesPlaceholder = "在主视图中选择文件以开始"
|
||||
settings = "设置"
|
||||
conversionCompleted = "转换完成"
|
||||
results = "结果"
|
||||
defaultFilename = "已转换_文件"
|
||||
defaultFilename = "converted_file"
|
||||
conversionResults = "转换结果"
|
||||
convertFrom = "从以下格式转换"
|
||||
convertTo = "转换为"
|
||||
@@ -3036,91 +3036,6 @@ title = "PDF ཡི་གནས་ཚུལ་ལེན་པ།"
|
||||
header = "PDF ཡི་གནས་ཚུལ་ལེན་པ།"
|
||||
submit = "གནས་ཚུལ་ལེན་པ།"
|
||||
downloadJson = "JSON ཕབ་ལེན།"
|
||||
processing = "正在提取信息..."
|
||||
results = "结果"
|
||||
noResults = "运行此工具以生成报告。"
|
||||
downloads = "下载"
|
||||
noneDetected = "未检测到"
|
||||
indexTitle = "索引"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "完整信息摘要"
|
||||
shortTitle = "PDF 信息"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "元数据"
|
||||
formFields = "表单字段"
|
||||
basicInfo = "基本信息"
|
||||
documentInfo = "文档信息"
|
||||
compliance = "合规性"
|
||||
encryption = "加密"
|
||||
permissions = "权限"
|
||||
other = "其他"
|
||||
perPageInfo = "每页信息"
|
||||
tableOfContents = "目录"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "附件"
|
||||
embeddedFiles = "嵌入文件"
|
||||
javaScript = "JavaScript"
|
||||
layers = "图层"
|
||||
structureTree = "结构树"
|
||||
xmp = "XMP 元数据"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "尺寸"
|
||||
annotations = "注释"
|
||||
images = "图像"
|
||||
links = "链接"
|
||||
fonts = "字体"
|
||||
xobjects = "XObject 数量"
|
||||
multimedia = "多媒体"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "页数"
|
||||
fileSize = "文件大小"
|
||||
pdfVersion = "PDF 版本"
|
||||
language = "语言"
|
||||
title = "PDF 摘要"
|
||||
author = "作者"
|
||||
created = "创建时间"
|
||||
modified = "修改时间"
|
||||
permsAll = "允许所有权限"
|
||||
permsRestricted = "{{count}} 项限制"
|
||||
permsMixed = "部分权限受限"
|
||||
hasCompliance = "符合合规标准"
|
||||
noCompliance = "无合规标准"
|
||||
basic = "基本信息"
|
||||
documentInfo = "文档信息"
|
||||
securityTitle = "安全状态"
|
||||
technical = "技术"
|
||||
overviewTitle = "PDF 概览"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "已加密的 PDF - 受密码保护"
|
||||
unencrypted = "未加密的 PDF - 无密码保护"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "图像"
|
||||
fonts = "字体"
|
||||
formFields = "表单字段"
|
||||
embeddedFiles = "嵌入文件"
|
||||
javaScript = "JavaScript"
|
||||
layers = "图层"
|
||||
bookmarks = "书签"
|
||||
multimedia = "多媒体"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "未命名文档"
|
||||
unknown = "作者未知"
|
||||
text = "这是一个 {{pages}} 页的 PDF,标题为 {{title}},由 {{author}} 创建(PDF 版本 {{version}})。"
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "部分文件无法处理。"
|
||||
unexpected = "提取过程中发生意外错误。"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "提取完成"
|
||||
|
||||
[extractPage]
|
||||
tags = "ཕྱིར་འདོན།"
|
||||
@@ -5262,7 +5177,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>名用户免费使用。为实现不中断的扩展,我们推荐 Stirling Server 方案 - <strong>不限席位</strong>并提供<strong>SSO 支持</strong>,$99/服务器/月。"
|
||||
freeBody = "我们的 <strong>开源内核(Open-Core)</strong> 许可允许每台服务器最多 <strong>{{freeTierLimit}}</strong> 名用户免费使用。为顺畅扩展并抢先体验全新的 <strong>PDF 文本编辑工具</strong>,我们推荐 Stirling Server 方案 - 完整编辑与 <strong>无限席位</strong>,$99/服务器/月。"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "下载"
|
||||
@@ -5367,31 +5282,6 @@ error = "用户状态更新失败"
|
||||
success = "用户删除成功"
|
||||
error = "删除用户失败"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "更改密码"
|
||||
title = "更改密码"
|
||||
subtitle = "为其更新密码"
|
||||
newPassword = "新密码"
|
||||
confirmPassword = "确认密码"
|
||||
placeholder = "输入新密码"
|
||||
confirmPlaceholder = "再次输入新密码"
|
||||
passwordRequired = "请输入新密码"
|
||||
passwordMismatch = "两次输入的密码不一致"
|
||||
generateRandom = "生成安全密码"
|
||||
generatedPreview = "已生成的密码:"
|
||||
copyTooltip = "复制到剪贴板"
|
||||
copiedToClipboard = "密码已复制到剪贴板"
|
||||
copyFailed = "复制密码失败"
|
||||
sendEmail = "通过电子邮件通知用户此更改"
|
||||
includePassword = "在邮件中包含新密码"
|
||||
forcePasswordChange = "强制用户下次登录时更改密码"
|
||||
emailUnavailable = "该用户的邮箱地址无效,已禁用通知。"
|
||||
smtpDisabled = "邮件通知需要在设置中启用 SMTP。"
|
||||
notifyOnly = "将发送不包含密码的邮件,告知用户管理员已更改其密码。"
|
||||
submit = "更新密码"
|
||||
success = "密码更新成功"
|
||||
error = "密码更新失败"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "邮件邀请"
|
||||
description = "在下方输入或粘贴邮箱,使用逗号分隔。用户将通过邮件收到登录凭据。"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "使用您的 Stirling 账户登录"
|
||||
[setup.selfhosted]
|
||||
title = "登录服务器"
|
||||
subtitle = "输入您的服务器凭据"
|
||||
link = "或连接到自托管账户"
|
||||
|
||||
[setup.server]
|
||||
title = "连接到服务器"
|
||||
@@ -5944,14 +5833,6 @@ description = "输入自托管 Stirling PDF 服务器的完整 URL"
|
||||
emptyUrl = "请输入服务器 URL"
|
||||
unreachable = "无法连接到服务器"
|
||||
testFailed = "连接测试失败"
|
||||
configFetch = "获取服务器配置失败。请检查 URL 后重试。"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "未启用登录"
|
||||
body = "此服务器未启用登录。要连接到该服务器,必须启用身份验证:"
|
||||
step1 = "在环境中设置 DOCKER_ENABLE_SECURITY=true"
|
||||
step2 = "或在 settings.yml 中设置 security.enableLogin=true"
|
||||
step3 = "重启服务器"
|
||||
|
||||
[setup.login]
|
||||
title = "登录"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "抢先体验"
|
||||
reset = "重置更改"
|
||||
downloadJson = "下载 JSON"
|
||||
generatePdf = "生成 PDF"
|
||||
saveChanges = "保存更改"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自动缩放文本以适配框"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "此 Alpha 预览器仍在演进中——某些字体、颜色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "未加载文档"
|
||||
subtitle = "加载 PDF 或 JSON 文件以开始编辑文本内容。"
|
||||
dropzone = "将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
dropzoneWithFiles = "从“文件”选项卡选择文件,或将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "欢迎使用 PDF 文本编辑器(抢先体验)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "获取 PDF 信息"
|
||||
header = "获取 PDF 信息"
|
||||
submit = "获取信息"
|
||||
downloadJson = "下载 JSON"
|
||||
processing = "正在提取信息..."
|
||||
results = "结果"
|
||||
noResults = "运行该工具以生成报告。"
|
||||
downloads = "下载"
|
||||
noneDetected = "未检测到"
|
||||
indexTitle = "索引"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "完整信息摘要"
|
||||
shortTitle = "PDF 信息"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "元数据"
|
||||
formFields = "表单字段"
|
||||
basicInfo = "基本信息"
|
||||
documentInfo = "文档信息"
|
||||
compliance = "合规性"
|
||||
encryption = "加密"
|
||||
permissions = "权限"
|
||||
other = "其他"
|
||||
perPageInfo = "每页信息"
|
||||
tableOfContents = "目录"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "附件"
|
||||
embeddedFiles = "嵌入文件"
|
||||
javaScript = "JavaScript"
|
||||
layers = "图层"
|
||||
structureTree = "结构树"
|
||||
xmp = "XMP 元数据"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "尺寸"
|
||||
annotations = "注释"
|
||||
images = "图像"
|
||||
links = "链接"
|
||||
fonts = "字体"
|
||||
xobjects = "XObject 数量"
|
||||
multimedia = "多媒体"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "页数"
|
||||
fileSize = "文件大小"
|
||||
pdfVersion = "PDF 版本"
|
||||
language = "语言"
|
||||
title = "PDF 摘要"
|
||||
author = "作者"
|
||||
created = "创建时间"
|
||||
modified = "修改时间"
|
||||
permsAll = "已允许所有权限"
|
||||
permsRestricted = "{{count}} 项限制"
|
||||
permsMixed = "部分权限受限"
|
||||
hasCompliance = "符合合规标准"
|
||||
noCompliance = "无合规标准"
|
||||
basic = "基本信息"
|
||||
documentInfo = "文档信息"
|
||||
securityTitle = "安全状态"
|
||||
technical = "技术"
|
||||
overviewTitle = "PDF 概览"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "已加密 PDF - 存在密码保护"
|
||||
unencrypted = "未加密 PDF - 无密码保护"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "图像"
|
||||
fonts = "字体"
|
||||
formFields = "表单字段"
|
||||
embeddedFiles = "嵌入文件"
|
||||
javaScript = "JavaScript"
|
||||
layers = "图层"
|
||||
bookmarks = "书签"
|
||||
multimedia = "多媒体"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "未命名文档"
|
||||
unknown = "未知作者"
|
||||
text = "这是一个 {{pages}} 页的 PDF,标题为 {{title}},作者为 {{author}}(PDF 版本 {{version}})。"
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "部分文件无法处理。"
|
||||
unexpected = "提取过程中发生意外错误。"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "提取完成"
|
||||
|
||||
[extractPage]
|
||||
tags = "提取"
|
||||
@@ -5262,7 +5177,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> 名用户免费使用。为实现不间断扩展,我们推荐 Stirling Server 方案 - <strong>无限席位</strong> 和 <strong>SSO 支持</strong>,$99/server/mo."
|
||||
freeBody = "我们的 <strong>Open-Core</strong> 许可允许每台服务器最多免费 <strong>{{freeTierLimit}}</strong> 名用户。为无缝扩展并抢先体验全新的 <strong>PDF 文本编辑工具</strong>,推荐 Stirling Server 方案 - 完整编辑与 <strong>无限席位</strong>,$99/server/mo。"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "下载"
|
||||
@@ -5367,31 +5282,6 @@ error = "更新用户状态失败"
|
||||
success = "用户删除成功"
|
||||
error = "删除用户失败"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "更改密码"
|
||||
title = "更改密码"
|
||||
subtitle = "为以下用户更新密码"
|
||||
newPassword = "新密码"
|
||||
confirmPassword = "确认密码"
|
||||
placeholder = "输入新密码"
|
||||
confirmPlaceholder = "再次输入新密码"
|
||||
passwordRequired = "请输入新密码"
|
||||
passwordMismatch = "两次输入的密码不一致"
|
||||
generateRandom = "生成安全密码"
|
||||
generatedPreview = "生成的密码:"
|
||||
copyTooltip = "复制到剪贴板"
|
||||
copiedToClipboard = "密码已复制到剪贴板"
|
||||
copyFailed = "复制密码失败"
|
||||
sendEmail = "向用户发送有关此更改的邮件"
|
||||
includePassword = "在邮件中包含新密码"
|
||||
forcePasswordChange = "强制用户下次登录时更改密码"
|
||||
emailUnavailable = "该用户的邮箱地址无效。通知已禁用。"
|
||||
smtpDisabled = "邮件通知需要在设置中启用 SMTP。"
|
||||
notifyOnly = "将发送不含密码的邮件,告知用户管理员已更改了密码。"
|
||||
submit = "更新密码"
|
||||
success = "密码更新成功"
|
||||
error = "更新密码失败"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "电子邮件邀请"
|
||||
description = "在下方输入或粘贴电子邮件地址,用逗号分隔。用户将通过电子邮件收到登录凭据。"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "使用您的 Stirling 账户登录"
|
||||
[setup.selfhosted]
|
||||
title = "登录到服务器"
|
||||
subtitle = "输入您的服务器凭据"
|
||||
link = "或连接到自托管账户"
|
||||
|
||||
[setup.server]
|
||||
title = "连接到服务器"
|
||||
@@ -5944,14 +5833,6 @@ description = "输入您自托管 Stirling PDF 服务器的完整 URL"
|
||||
emptyUrl = "请输入服务器 URL"
|
||||
unreachable = "无法连接到服务器"
|
||||
testFailed = "连接测试失败"
|
||||
configFetch = "获取服务器配置失败。请检查 URL 并重试。"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "未启用登录"
|
||||
body = "此服务器未启用登录。要连接到此服务器,必须启用身份验证:"
|
||||
step1 = "在环境中设置 DOCKER_ENABLE_SECURITY=true"
|
||||
step2 = "或在 settings.yml 中设置 security.enableLogin=true"
|
||||
step3 = "重启服务器"
|
||||
|
||||
[setup.login]
|
||||
title = "登录"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "抢先体验"
|
||||
reset = "重置更改"
|
||||
downloadJson = "下载 JSON"
|
||||
generatePdf = "生成 PDF"
|
||||
saveChanges = "保存更改"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自动缩放文本以适配框体"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "此 Alpha 预览器仍在演进中——某些字体、颜色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "未加载文档"
|
||||
subtitle = "加载 PDF 或 JSON 文件以开始编辑文本内容。"
|
||||
dropzone = "将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
dropzoneWithFiles = "从“文件”选项卡选择文件,或将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "欢迎使用 PDF 文本编辑器(抢先体验)"
|
||||
|
||||
@@ -3036,91 +3036,6 @@ title = "取得 PDF 資訊"
|
||||
header = "取得 PDF 資訊"
|
||||
submit = "取得資訊"
|
||||
downloadJson = "下載 JSON"
|
||||
processing = "正在擷取資訊..."
|
||||
results = "結果"
|
||||
noResults = "執行此工具以產生報告。"
|
||||
downloads = "下載"
|
||||
noneDetected = "未偵測到"
|
||||
indexTitle = "索引"
|
||||
|
||||
[getPdfInfo.report]
|
||||
entryLabel = "完整資訊摘要"
|
||||
shortTitle = "PDF 資訊"
|
||||
|
||||
[getPdfInfo.sections]
|
||||
metadata = "中繼資料"
|
||||
formFields = "表單欄位"
|
||||
basicInfo = "基本資訊"
|
||||
documentInfo = "文件資訊"
|
||||
compliance = "符合性"
|
||||
encryption = "加密"
|
||||
permissions = "權限"
|
||||
other = "其他"
|
||||
perPageInfo = "每頁資訊"
|
||||
tableOfContents = "目錄"
|
||||
|
||||
[getPdfInfo.other]
|
||||
attachments = "附件"
|
||||
embeddedFiles = "內嵌檔案"
|
||||
javaScript = "JavaScript"
|
||||
layers = "圖層"
|
||||
structureTree = "結構樹"
|
||||
xmp = "XMPMetadata"
|
||||
|
||||
[getPdfInfo.perPage]
|
||||
size = "尺寸"
|
||||
annotations = "註解"
|
||||
images = "影像"
|
||||
links = "連結"
|
||||
fonts = "字型"
|
||||
xobjects = "XObject 數量"
|
||||
multimedia = "多媒體"
|
||||
|
||||
[getPdfInfo.summary]
|
||||
pages = "頁數"
|
||||
fileSize = "檔案大小"
|
||||
pdfVersion = "PDF 版本"
|
||||
language = "語言"
|
||||
title = "PDF 摘要"
|
||||
author = "作者"
|
||||
created = "建立時間"
|
||||
modified = "修改時間"
|
||||
permsAll = "允許所有權限"
|
||||
permsRestricted = "{{count}} 個限制"
|
||||
permsMixed = "部分權限受限"
|
||||
hasCompliance = "具有符合性標準"
|
||||
noCompliance = "無符合性標準"
|
||||
basic = "基本資訊"
|
||||
documentInfo = "文件資訊"
|
||||
securityTitle = "安全性狀態"
|
||||
technical = "技術資訊"
|
||||
overviewTitle = "PDF 概覽"
|
||||
|
||||
[getPdfInfo.summary.security]
|
||||
encrypted = "已加密的 PDF - 具有密碼保護"
|
||||
unencrypted = "未加密的 PDF - 無密碼保護"
|
||||
|
||||
[getPdfInfo.summary.tech]
|
||||
images = "影像"
|
||||
fonts = "字型"
|
||||
formFields = "表單欄位"
|
||||
embeddedFiles = "內嵌檔案"
|
||||
javaScript = "JavaScript"
|
||||
layers = "圖層"
|
||||
bookmarks = "書籤"
|
||||
multimedia = "多媒體"
|
||||
|
||||
[getPdfInfo.summary.overview]
|
||||
untitled = "未命名文件"
|
||||
unknown = "作者不詳"
|
||||
text = "這是一份 {{pages}} 頁的 PDF,標題為 {{title}},作者 {{author}}(PDF 版本 {{version}})。"
|
||||
|
||||
[getPdfInfo.error]
|
||||
partial = "部分檔案無法處理。"
|
||||
unexpected = "擷取過程發生非預期錯誤。"
|
||||
|
||||
[getPdfInfo.status]
|
||||
complete = "擷取完成"
|
||||
|
||||
[extractPage]
|
||||
tags = "提取"
|
||||
@@ -5262,7 +5177,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> 位使用者免費使用。若要無縫擴充,我們建議選用 Stirling Server 方案 - <strong>不限席次</strong> 與 <strong>SSO 支援</strong>,每伺服器每月 $99。"
|
||||
freeBody = "我們的 <strong>Open-Core</strong> 授權允許每台伺服器最多 <strong>{{freeTierLimit}}</strong> 位使用者免費使用。若要無縫擴充並搶先體驗全新的 <strong>PDF 文字編輯工具</strong>,建議升級至 Stirling Server 方案 - 完整編輯與 <strong>不限席次</strong>,每台伺服器 $99/月。"
|
||||
|
||||
[onboarding.desktopInstall]
|
||||
title = "下載"
|
||||
@@ -5367,31 +5282,6 @@ error = "更新使用者狀態失敗"
|
||||
success = "已成功刪除使用者"
|
||||
error = "刪除使用者失敗"
|
||||
|
||||
[workspace.people.changePassword]
|
||||
action = "變更密碼"
|
||||
title = "變更密碼"
|
||||
subtitle = "為使用者更新密碼"
|
||||
newPassword = "新密碼"
|
||||
confirmPassword = "確認密碼"
|
||||
placeholder = "輸入新密碼"
|
||||
confirmPlaceholder = "再次輸入新密碼"
|
||||
passwordRequired = "請輸入新密碼"
|
||||
passwordMismatch = "密碼不相符"
|
||||
generateRandom = "產生安全密碼"
|
||||
generatedPreview = "產生的密碼:"
|
||||
copyTooltip = "複製到剪貼簿"
|
||||
copiedToClipboard = "已將密碼複製到剪貼簿"
|
||||
copyFailed = "無法複製密碼"
|
||||
sendEmail = "以 Email 通知使用者此變更"
|
||||
includePassword = "在 Email 中包含新密碼"
|
||||
forcePasswordChange = "強制使用者下次登入時變更密碼"
|
||||
emailUnavailable = "此使用者的 Email 不是有效的 Email 位址。已停用通知。"
|
||||
smtpDisabled = "Email 通知需要在設定中啟用 SMTP。"
|
||||
notifyOnly = "將傳送不含密碼的 Email,通知使用者管理員已變更其密碼。"
|
||||
submit = "更新密碼"
|
||||
success = "密碼已成功更新"
|
||||
error = "更新密碼失敗"
|
||||
|
||||
[workspace.people.emailInvite]
|
||||
tab = "電子郵件邀請"
|
||||
description = "在下方輸入或貼上電子郵件,使用逗號分隔。使用者將透過電子郵件收到登入憑證。"
|
||||
@@ -5925,7 +5815,6 @@ subtitle = "使用你的 Stirling 帳戶登入"
|
||||
[setup.selfhosted]
|
||||
title = "登入伺服器"
|
||||
subtitle = "輸入你的伺服器認證資訊"
|
||||
link = "或連線到自行託管的帳戶"
|
||||
|
||||
[setup.server]
|
||||
title = "連線至伺服器"
|
||||
@@ -5944,14 +5833,6 @@ description = "輸入你自託管 Stirling PDF 伺服器的完整 URL"
|
||||
emptyUrl = "請輸入伺服器 URL"
|
||||
unreachable = "無法連線至伺服器"
|
||||
testFailed = "連線測試失敗"
|
||||
configFetch = "無法擷取伺服器組態。請檢查 URL 後再試一次。"
|
||||
|
||||
[setup.server.error.securityDisabled]
|
||||
title = "未啟用登入"
|
||||
body = "此伺服器未啟用登入。若要連線至此伺服器,您必須啟用驗證:"
|
||||
step1 = "在您的環境中設定 DOCKER_ENABLE_SECURITY=true"
|
||||
step2 = "或在 settings.yml 中將 security.enableLogin 設為 true"
|
||||
step3 = "重新啟動伺服器"
|
||||
|
||||
[setup.login]
|
||||
title = "登入"
|
||||
@@ -6024,7 +5905,6 @@ earlyAccess = "搶先體驗"
|
||||
reset = "重設變更"
|
||||
downloadJson = "下載 JSON"
|
||||
generatePdf = "產生 PDF"
|
||||
saveChanges = "儲存變更"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自動縮放文字以符合方框"
|
||||
@@ -6062,8 +5942,6 @@ alpha = "此 Alpha 檢視器仍在演進中——部分字型、顏色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "尚未載入文件"
|
||||
subtitle = "載入 PDF 或 JSON 檔以開始編輯文字內容。"
|
||||
dropzone = "將 PDF 或 JSON 檔案拖放到此處,或點擊以瀏覽"
|
||||
dropzoneWithFiles = "從「檔案」分頁選取檔案,或將 PDF 或 JSON 檔案拖放到此處,或點擊以瀏覽"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "歡迎使用 PDF 文字編輯器(搶先體驗)"
|
||||
|
||||
Generated
+1
-18
@@ -2152,11 +2152,7 @@ version = "3.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"log",
|
||||
"security-framework 2.11.1",
|
||||
"security-framework 3.5.1",
|
||||
"windows-sys 0.60.2",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
@@ -2382,7 +2378,7 @@ dependencies = [
|
||||
"openssl-probe",
|
||||
"openssl-sys",
|
||||
"schannel",
|
||||
"security-framework 2.11.1",
|
||||
"security-framework",
|
||||
"security-framework-sys",
|
||||
"tempfile",
|
||||
]
|
||||
@@ -3845,19 +3841,6 @@ dependencies = [
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "3.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef"
|
||||
dependencies = [
|
||||
"bitflags 2.10.0",
|
||||
"core-foundation 0.10.1",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "2.15.0"
|
||||
|
||||
@@ -32,7 +32,7 @@ tauri-plugin-http = "2.4.4"
|
||||
tauri-plugin-single-instance = "2.0.1"
|
||||
tauri-plugin-store = "2.1.0"
|
||||
tauri-plugin-opener = "2.0.0"
|
||||
keyring = { version = "3.6.1", features = ["apple-native", "windows-native"] }
|
||||
keyring = "3.6.1"
|
||||
tokio = { version = "1.0", features = ["time", "sync"] }
|
||||
reqwest = { version = "0.11", features = ["json"] }
|
||||
tiny_http = "0.12"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use keyring::{Entry};
|
||||
use keyring::Entry;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use tauri::AppHandle;
|
||||
@@ -21,70 +21,53 @@ pub struct UserInfo {
|
||||
}
|
||||
|
||||
fn get_keyring_entry() -> Result<Entry, String> {
|
||||
log::debug!("Creating keyring entry with service='{}' username='{}'", KEYRING_SERVICE, KEYRING_TOKEN_KEY);
|
||||
let entry = Entry::new(KEYRING_SERVICE, KEYRING_TOKEN_KEY)
|
||||
.map_err(|e| {
|
||||
log::error!("Failed to create keyring entry: {}", e);
|
||||
format!("Failed to access keyring: {}", e)
|
||||
})?;
|
||||
log::debug!("Keyring entry created successfully");
|
||||
Ok(entry)
|
||||
Entry::new(KEYRING_SERVICE, KEYRING_TOKEN_KEY)
|
||||
.map_err(|e| format!("Failed to access keyring: {}", e))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn save_auth_token(_app_handle: AppHandle, token: String) -> Result<(), String> {
|
||||
if token.is_empty() {
|
||||
log::warn!("Attempted to save empty auth token");
|
||||
return Err("Token cannot be empty".to_string());
|
||||
}
|
||||
log::info!("Saving auth token to keyring");
|
||||
|
||||
let entry = get_keyring_entry()?;
|
||||
|
||||
entry
|
||||
.set_password(&token)
|
||||
.map_err(|e| {
|
||||
log::error!("Failed to set password in keyring: {}", e);
|
||||
format!("Failed to save token to keyring: {}", e)
|
||||
})?;
|
||||
|
||||
// Verify the save worked
|
||||
match entry.get_password() {
|
||||
Ok(retrieved_token) => {
|
||||
if retrieved_token != token {
|
||||
log::error!("Token verification failed: Retrieved token doesn't match");
|
||||
return Err("Token verification failed after save".to_string());
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Token verification failed: {}", e);
|
||||
return Err(format!("Token verification failed: {}", e));
|
||||
}
|
||||
}
|
||||
.map_err(|e| format!("Failed to save token to keyring: {}", e))?;
|
||||
|
||||
log::info!("Auth token saved successfully");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_auth_token(_app_handle: AppHandle) -> Result<Option<String>, String> {
|
||||
log::debug!("Retrieving auth token from keyring");
|
||||
|
||||
let entry = get_keyring_entry()?;
|
||||
|
||||
match entry.get_password() {
|
||||
Ok(token) => Ok(Some(token)),
|
||||
Err(keyring::Error::NoEntry) => Ok(None),
|
||||
Err(e) => {
|
||||
log::error!("Failed to retrieve token from keyring: {}", e);
|
||||
Err(format!("Failed to retrieve token: {}", e))
|
||||
},
|
||||
Err(e) => Err(format!("Failed to retrieve token: {}", e)),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn clear_auth_token(_app_handle: AppHandle) -> Result<(), String> {
|
||||
log::info!("Clearing auth token from keyring");
|
||||
|
||||
let entry = get_keyring_entry()?;
|
||||
|
||||
// Delete the token - ignore error if it doesn't exist
|
||||
match entry.delete_credential() {
|
||||
Ok(_) | Err(keyring::Error::NoEntry) => Ok(()),
|
||||
Ok(_) => {
|
||||
log::info!("Auth token cleared successfully");
|
||||
Ok(())
|
||||
}
|
||||
Err(keyring::Error::NoEntry) => {
|
||||
log::info!("Auth token was already cleared");
|
||||
Ok(())
|
||||
}
|
||||
Err(e) => Err(format!("Failed to clear token: {}", e)),
|
||||
}
|
||||
}
|
||||
@@ -95,6 +78,8 @@ pub async fn save_user_info(
|
||||
username: String,
|
||||
email: Option<String>,
|
||||
) -> Result<(), String> {
|
||||
log::info!("Saving user info for: {}", username);
|
||||
|
||||
let user_info = UserInfo { username, email };
|
||||
|
||||
let store = app_handle
|
||||
@@ -111,6 +96,7 @@ pub async fn save_user_info(
|
||||
.save()
|
||||
.map_err(|e| format!("Failed to save store: {}", e))?;
|
||||
|
||||
log::info!("User info saved successfully");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -131,6 +117,8 @@ pub async fn get_user_info(app_handle: AppHandle) -> Result<Option<UserInfo>, St
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn clear_user_info(app_handle: AppHandle) -> Result<(), String> {
|
||||
log::info!("Clearing user info");
|
||||
|
||||
let store = app_handle
|
||||
.store(STORE_FILE)
|
||||
.map_err(|e| format!("Failed to access store: {}", e))?;
|
||||
@@ -141,6 +129,7 @@ pub async fn clear_user_info(app_handle: AppHandle) -> Result<(), String> {
|
||||
.save()
|
||||
.map_err(|e| format!("Failed to save store: {}", e))?;
|
||||
|
||||
log::info!("User info cleared successfully");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -197,8 +186,12 @@ pub async fn login(
|
||||
supabase_key: String,
|
||||
saas_server_url: String,
|
||||
) -> Result<LoginResponse, String> {
|
||||
log::info!("Login attempt for user: {} to server: {}", username, server_url);
|
||||
|
||||
// Detect if this is Supabase (SaaS) or Spring Boot (self-hosted)
|
||||
// Compare against the configured SaaS server URL
|
||||
let is_supabase = server_url.trim_end_matches('/') == saas_server_url.trim_end_matches('/');
|
||||
log::info!("Authentication type: {}", if is_supabase { "Supabase (SaaS)" } else { "Spring Boot (Self-hosted)" });
|
||||
|
||||
// Create HTTP client
|
||||
let client = reqwest::Client::new();
|
||||
@@ -255,6 +248,8 @@ pub async fn login(
|
||||
.or_else(|| email.clone())
|
||||
.unwrap_or_else(|| username);
|
||||
|
||||
log::info!("Supabase login successful for user: {}", username);
|
||||
|
||||
Ok(LoginResponse {
|
||||
token: login_response.access_token,
|
||||
username,
|
||||
|
||||
@@ -152,27 +152,15 @@ pub fn run() {
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
RunEvent::Opened { urls } => {
|
||||
use urlencoding::decode;
|
||||
|
||||
add_log(format!("📂 Tauri file opened event: {:?}", urls));
|
||||
let mut added_files = false;
|
||||
|
||||
for url in urls {
|
||||
let url_str = url.as_str();
|
||||
if url_str.starts_with("file://") {
|
||||
let encoded_path = url_str.strip_prefix("file://").unwrap_or(url_str);
|
||||
|
||||
// Decode URL-encoded characters (%20 -> space, etc.)
|
||||
let file_path = match decode(encoded_path) {
|
||||
Ok(decoded) => decoded.into_owned(),
|
||||
Err(e) => {
|
||||
add_log(format!("⚠️ Failed to decode file path: {} - {}", encoded_path, e));
|
||||
encoded_path.to_string() // Fallback to encoded path
|
||||
}
|
||||
};
|
||||
|
||||
let file_path = url_str.strip_prefix("file://").unwrap_or(url_str);
|
||||
add_log(format!("📂 Processing opened file: {}", file_path));
|
||||
add_opened_file(file_path);
|
||||
add_opened_file(file_path.to_string());
|
||||
added_files = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import ErrorBoundary from "@app/components/shared/ErrorBoundary";
|
||||
import { useScarfTracking } from "@app/hooks/useScarfTracking";
|
||||
import { useAppInitialization } from "@app/hooks/useAppInitialization";
|
||||
import { useLogoAssets } from '@app/hooks/useLogoAssets';
|
||||
import AppConfigLoader from '@app/components/shared/AppConfigLoader';
|
||||
|
||||
// Component to initialize scarf tracking (must be inside AppConfigProvider)
|
||||
function ScarfTrackingInitializer() {
|
||||
@@ -82,7 +81,6 @@ export function AppProviders({ children, appConfigRetryOptions, appConfigProvide
|
||||
{...appConfigProviderProps}
|
||||
>
|
||||
<ScarfTrackingInitializer />
|
||||
<AppConfigLoader />
|
||||
<FileContextProvider enableUrlSync={true} enablePersistence={true}>
|
||||
<AppInitializer />
|
||||
<BrandingAssetManager />
|
||||
|
||||
@@ -71,20 +71,6 @@ export default function Workbench() {
|
||||
};
|
||||
|
||||
const renderMainContent = () => {
|
||||
// Check for custom workbench views first
|
||||
if (!isBaseWorkbench(currentView)) {
|
||||
const customView = customWorkbenchViews.find((view) => view.workbenchId === currentView && view.data != null);
|
||||
if (customView) {
|
||||
// PDF text editor handles its own empty state (shows dropzone when no document)
|
||||
const handlesOwnEmptyState = currentView === 'custom:pdfTextEditor';
|
||||
if (handlesOwnEmptyState || activeFiles.length > 0) {
|
||||
const CustomComponent = customView.component;
|
||||
return <CustomComponent data={customView.data} />;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For base workbenches (or custom views that don't handle empty state), show landing page when no files
|
||||
if (activeFiles.length === 0) {
|
||||
return (
|
||||
<LandingPage
|
||||
@@ -157,6 +143,15 @@ export default function Workbench() {
|
||||
);
|
||||
|
||||
default:
|
||||
if (!isBaseWorkbench(currentView)) {
|
||||
const customView = customWorkbenchViews.find((view) => view.workbenchId === currentView && view.data != null);
|
||||
|
||||
|
||||
if (customView) {
|
||||
const CustomComponent = customView.component;
|
||||
return <CustomComponent data={customView.data} />;
|
||||
}
|
||||
}
|
||||
return <LandingPage />;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -6,7 +6,6 @@ import { isAuthRoute } from '@app/constants/routes';
|
||||
import { dispatchTourState } from '@app/constants/events';
|
||||
import { useOnboardingOrchestrator } from '@app/components/onboarding/orchestrator/useOnboardingOrchestrator';
|
||||
import { markStepSeen } from '@app/components/onboarding/orchestrator/onboardingStorage';
|
||||
import { useBypassOnboarding } from '@app/components/onboarding/useBypassOnboarding';
|
||||
import OnboardingTour, { type AdvanceArgs, type CloseArgs } from '@app/components/onboarding/OnboardingTour';
|
||||
import OnboardingModalSlide from '@app/components/onboarding/OnboardingModalSlide';
|
||||
import {
|
||||
@@ -30,7 +29,6 @@ export default function Onboarding() {
|
||||
const { t } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
const bypassOnboarding = useBypassOnboarding();
|
||||
const { state, actions } = useOnboardingOrchestrator();
|
||||
const serverExperience = useServerExperience();
|
||||
const onAuthRoute = isAuthRoute(location.pathname);
|
||||
@@ -229,10 +227,6 @@ export default function Onboarding() {
|
||||
return modalSlides.findIndex((step) => step.id === currentStep.id);
|
||||
}, [activeFlow, currentStep]);
|
||||
|
||||
if (bypassOnboarding) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (onAuthRoute) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ import {
|
||||
migrateFromLegacyPreferences,
|
||||
} from '@app/components/onboarding/orchestrator/onboardingStorage';
|
||||
import { accountService } from '@app/services/accountService';
|
||||
import { useBypassOnboarding } from '@app/components/onboarding/useBypassOnboarding';
|
||||
|
||||
const AUTH_ROUTES = ['/login', '/signup', '/auth', '/invite'];
|
||||
const SESSION_TOUR_REQUESTED = 'onboarding::session::tour-requested';
|
||||
@@ -143,7 +142,6 @@ export function useOnboardingOrchestrator(
|
||||
const serverExperience = useServerExperience();
|
||||
const { config, loading: configLoading } = useAppConfig();
|
||||
const location = useLocation();
|
||||
const bypassOnboarding = useBypassOnboarding();
|
||||
|
||||
const [runtimeState, setRuntimeState] = useState<OnboardingRuntimeState>(() =>
|
||||
getInitialRuntimeState(defaultState)
|
||||
@@ -195,7 +193,7 @@ export function useOnboardingOrchestrator(
|
||||
accountService.getAccountData(),
|
||||
accountService.getLoginPageData(),
|
||||
]);
|
||||
|
||||
|
||||
setRuntimeState((prev) => ({
|
||||
...prev,
|
||||
requiresPasswordChange: accountData.changeCredsFlag,
|
||||
@@ -215,8 +213,7 @@ export function useOnboardingOrchestrator(
|
||||
const isOnAuthRoute = AUTH_ROUTES.some((route) => location.pathname.startsWith(route));
|
||||
const loginEnabled = config?.enableLogin === true;
|
||||
const isUnauthenticatedWithLoginEnabled = loginEnabled && !hasAuthToken();
|
||||
const shouldBlockOnboarding =
|
||||
bypassOnboarding || isOnAuthRoute || configLoading || isUnauthenticatedWithLoginEnabled;
|
||||
const shouldBlockOnboarding = isOnAuthRoute || configLoading || isUnauthenticatedWithLoginEnabled;
|
||||
|
||||
const conditionContext = useMemo<OnboardingConditionContext>(() => ({
|
||||
...serverExperience,
|
||||
@@ -226,12 +223,8 @@ export function useOnboardingOrchestrator(
|
||||
}), [serverExperience, runtimeState]);
|
||||
|
||||
const activeFlow = useMemo(() => {
|
||||
// If password change is required, ONLY show the first-login step
|
||||
if (runtimeState.requiresPasswordChange) {
|
||||
return ONBOARDING_STEPS.filter((step) => step.id === 'first-login');
|
||||
}
|
||||
return ONBOARDING_STEPS.filter((step) => step.condition(conditionContext));
|
||||
}, [conditionContext, runtimeState.requiresPasswordChange]);
|
||||
}, [conditionContext]);
|
||||
|
||||
// Wait for config AND admin status before calculating initial step
|
||||
const adminStatusResolved = !configLoading && (
|
||||
@@ -242,31 +235,23 @@ export function useOnboardingOrchestrator(
|
||||
|
||||
useEffect(() => {
|
||||
if (configLoading || !adminStatusResolved || activeFlow.length === 0) return;
|
||||
|
||||
|
||||
let firstUnseenIndex = -1;
|
||||
for (let i = 0; i < activeFlow.length; i++) {
|
||||
// Special case: first-login step should always be considered "unseen" if requiresPasswordChange is true
|
||||
const isFirstLoginStep = activeFlow[i].id === 'first-login';
|
||||
const shouldTreatAsUnseen = isFirstLoginStep ? runtimeState.requiresPasswordChange : !hasSeenStep(activeFlow[i].id);
|
||||
|
||||
if (shouldTreatAsUnseen) {
|
||||
if (!hasSeenStep(activeFlow[i].id)) {
|
||||
firstUnseenIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Force reset index when password change is required (overrides initialIndexSet)
|
||||
if (runtimeState.requiresPasswordChange && firstUnseenIndex === 0) {
|
||||
setCurrentStepIndex(0);
|
||||
initialIndexSet.current = true;
|
||||
} else if (firstUnseenIndex === -1) {
|
||||
|
||||
if (firstUnseenIndex === -1) {
|
||||
setCurrentStepIndex(activeFlow.length);
|
||||
initialIndexSet.current = true;
|
||||
} else if (!initialIndexSet.current) {
|
||||
setCurrentStepIndex(firstUnseenIndex);
|
||||
initialIndexSet.current = true;
|
||||
}
|
||||
}, [activeFlow, configLoading, adminStatusResolved, runtimeState.requiresPasswordChange]);
|
||||
}, [activeFlow, configLoading, adminStatusResolved]);
|
||||
|
||||
const totalSteps = activeFlow.length;
|
||||
|
||||
@@ -315,13 +300,10 @@ export function useOnboardingOrchestrator(
|
||||
if (!currentStep || isLoading) {
|
||||
return;
|
||||
}
|
||||
// Special case: never auto-complete first-login step if requiresPasswordChange is true
|
||||
const isFirstLoginStep = currentStep.id === 'first-login';
|
||||
|
||||
if (!isFirstLoginStep && hasSeenStep(currentStep.id)) {
|
||||
if (hasSeenStep(currentStep.id)) {
|
||||
complete();
|
||||
}
|
||||
}, [currentStep, isLoading, complete, runtimeState.requiresPasswordChange]);
|
||||
}, [currentStep, isLoading, complete]);
|
||||
|
||||
const updateRuntimeState = useCallback((updates: Partial<OnboardingRuntimeState>) => {
|
||||
persistRuntimeState(updates);
|
||||
|
||||
@@ -39,7 +39,7 @@ export default function ServerLicenseSlide({ licenseNotice }: ServerLicenseSlide
|
||||
components={{
|
||||
strong: <strong />,
|
||||
}}
|
||||
defaults="Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. To scale uninterrupted, we recommend the Stirling Server plan - <strong>unlimited seats</strong> and <strong>SSO support</strong> for $99/server/mo."
|
||||
defaults="Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. To scale uninterrupted and get early access to our new <strong>PDF text editing tool</strong>, we recommend the Stirling Server plan - full editing and <strong>unlimited seats</strong> for $99/server/mo."
|
||||
/>
|
||||
);
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { ONBOARDING_STEPS } from '@app/components/onboarding/orchestrator/onboardingConfig';
|
||||
import { markStepSeen } from '@app/components/onboarding/orchestrator/onboardingStorage';
|
||||
|
||||
const SESSION_KEY = 'onboarding::bypass-all';
|
||||
const PARAM_KEY = 'bypassOnboarding';
|
||||
|
||||
function isTruthy(value: string | null): boolean {
|
||||
return value?.toLowerCase() === 'true';
|
||||
}
|
||||
|
||||
function readStoredBypass(): boolean {
|
||||
if (typeof window === 'undefined') return false;
|
||||
try {
|
||||
return sessionStorage.getItem(SESSION_KEY) === 'true';
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function setStoredBypass(enabled: boolean): void {
|
||||
if (typeof window === 'undefined') return;
|
||||
try {
|
||||
if (enabled) {
|
||||
sessionStorage.setItem(SESSION_KEY, 'true');
|
||||
} else {
|
||||
sessionStorage.removeItem(SESSION_KEY);
|
||||
}
|
||||
} catch {
|
||||
// Ignore storage errors to avoid blocking the bypass flow
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects the `bypassOnboarding` query parameter and stores it in session storage
|
||||
* so that onboarding remains disabled while the app is open. Also marks all steps
|
||||
* as seen to ensure any dependent UI elements remain hidden.
|
||||
*/
|
||||
export function useBypassOnboarding(): boolean {
|
||||
const location = useLocation();
|
||||
const [bypassOnboarding, setBypassOnboarding] = useState<boolean>(() => readStoredBypass());
|
||||
const stepsMarkedRef = useRef(false);
|
||||
|
||||
const shouldBypassFromSearch = useMemo(() => {
|
||||
try {
|
||||
const params = new URLSearchParams(location.search);
|
||||
return isTruthy(params.get(PARAM_KEY));
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}, [location.search]);
|
||||
|
||||
useEffect(() => {
|
||||
const fromStorage = readStoredBypass();
|
||||
const nextBypass = shouldBypassFromSearch || fromStorage;
|
||||
setBypassOnboarding(nextBypass);
|
||||
if (nextBypass) {
|
||||
setStoredBypass(true);
|
||||
}
|
||||
}, [shouldBypassFromSearch]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!bypassOnboarding || stepsMarkedRef.current) return;
|
||||
stepsMarkedRef.current = true;
|
||||
ONBOARDING_STEPS.forEach((step) => markStepSeen(step.id));
|
||||
}, [bypassOnboarding]);
|
||||
|
||||
return bypassOnboarding;
|
||||
}
|
||||
@@ -1,12 +1,11 @@
|
||||
import React from 'react';
|
||||
import { ActionIcon } from '@mantine/core';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Tooltip } from '@app/components/shared/Tooltip';
|
||||
import AppsIcon from '@mui/icons-material/AppsRounded';
|
||||
import { useToolWorkflow } from '@app/contexts/ToolWorkflowContext';
|
||||
import { useNavigationState, useNavigationActions } from '@app/contexts/NavigationContext';
|
||||
import { useSidebarNavigation } from '@app/hooks/useSidebarNavigation';
|
||||
import { handleUnlessSpecialClick } from '@app/utils/clickHandlers';
|
||||
import QuickAccessButton from '@app/components/shared/quickAccessBar/QuickAccessButton';
|
||||
|
||||
interface AllToolsNavButtonProps {
|
||||
activeButton: string;
|
||||
@@ -21,39 +20,30 @@ const AllToolsNavButton: React.FC<AllToolsNavButtonProps> = ({
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const { handleReaderToggle, handleBackToTools, selectedToolKey, leftPanelView } = useToolWorkflow();
|
||||
const { hasUnsavedChanges } = useNavigationState();
|
||||
const { actions: navigationActions } = useNavigationActions();
|
||||
const { getHomeNavigation } = useSidebarNavigation();
|
||||
|
||||
const performNavigation = () => {
|
||||
const handleClick = () => {
|
||||
setActiveButton('tools');
|
||||
// Preserve existing behavior used in QuickAccessBar header
|
||||
handleReaderToggle();
|
||||
handleBackToTools();
|
||||
};
|
||||
|
||||
const handleClick = () => {
|
||||
if (hasUnsavedChanges) {
|
||||
navigationActions.requestNavigation(performNavigation);
|
||||
return;
|
||||
}
|
||||
performNavigation();
|
||||
};
|
||||
|
||||
// Do not highlight All Tools when a specific tool is open (indicator is shown)
|
||||
const isActive = activeButton === 'tools' && !selectedToolKey && leftPanelView === 'toolPicker';
|
||||
|
||||
const navProps = getHomeNavigation();
|
||||
|
||||
const handleNavClick = (e: React.MouseEvent) => {
|
||||
if (hasUnsavedChanges) {
|
||||
e.preventDefault();
|
||||
navigationActions.requestNavigation(performNavigation);
|
||||
return;
|
||||
}
|
||||
handleUnlessSpecialClick(e, handleClick);
|
||||
};
|
||||
|
||||
const iconNode = (
|
||||
<span className="iconContainer">
|
||||
<AppsIcon sx={{ fontSize: isActive ? '1.875rem' : '1.5rem' }} />
|
||||
</span>
|
||||
);
|
||||
|
||||
return (
|
||||
<Tooltip
|
||||
content={t("quickAccess.allTools", "Tools")}
|
||||
@@ -62,17 +52,28 @@ const AllToolsNavButton: React.FC<AllToolsNavButtonProps> = ({
|
||||
containerStyle={{ marginTop: "-1rem" }}
|
||||
maxWidth={200}
|
||||
>
|
||||
<div className="mt-4 mb-2">
|
||||
<QuickAccessButton
|
||||
icon={<AppsIcon sx={{ fontSize: isActive ? '1.875rem' : '1.5rem' }} />}
|
||||
label={t("quickAccess.allTools", "Tools")}
|
||||
isActive={isActive}
|
||||
onClick={handleNavClick}
|
||||
href={navProps.href}
|
||||
ariaLabel={t("quickAccess.allTools", "Tools")}
|
||||
textClassName="all-tools-text"
|
||||
<div className="flex flex-col items-center gap-1 mt-4 mb-2">
|
||||
<ActionIcon
|
||||
component="a"
|
||||
/>
|
||||
href={navProps.href}
|
||||
onClick={handleNavClick}
|
||||
size={isActive ? 'lg' : 'md'}
|
||||
variant="subtle"
|
||||
aria-label={t("quickAccess.allTools", "Tools")}
|
||||
style={{
|
||||
backgroundColor: isActive ? 'var(--icon-tools-bg)' : 'var(--icon-inactive-bg)',
|
||||
color: isActive ? 'var(--icon-tools-color)' : 'var(--icon-inactive-color)',
|
||||
border: 'none',
|
||||
borderRadius: '8px',
|
||||
textDecoration: 'none'
|
||||
}}
|
||||
className={isActive ? 'activeIconScale' : ''}
|
||||
>
|
||||
{iconNode}
|
||||
</ActionIcon>
|
||||
<span className={`all-tools-text ${isActive ? 'active' : 'inactive'}`}>
|
||||
{t("quickAccess.allTools", "Tools")}
|
||||
</span>
|
||||
</div>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
@@ -14,9 +14,8 @@ export default function AppConfigLoader() {
|
||||
|
||||
useEffect(() => {
|
||||
if (!loading && config) {
|
||||
// Update supported languages and apply default locale from server config
|
||||
// Priority: localStorage > config.defaultLocale > browser detection > fallback
|
||||
updateSupportedLanguages(config.languages, config.defaultLocale);
|
||||
// Update supported languages if config specifies a language filter
|
||||
updateSupportedLanguages(config.languages);
|
||||
}
|
||||
}, [config, loading]);
|
||||
|
||||
|
||||
@@ -53,15 +53,16 @@ const FitText: React.FC<FitTextProps> = ({
|
||||
const clampStyles: CSSProperties = {
|
||||
// Multi-line clamp with ellipsis fallback
|
||||
whiteSpace: lines === 1 ? 'nowrap' : 'normal',
|
||||
overflow: 'hidden',
|
||||
overflow: 'visible',
|
||||
textOverflow: 'ellipsis',
|
||||
display: lines > 1 ? '-webkit-box' : undefined,
|
||||
WebkitBoxOrient: lines > 1 ? 'vertical' : undefined,
|
||||
WebkitLineClamp: lines > 1 ? lines : undefined,
|
||||
// Favor breaking words when necessary to prevent overflow
|
||||
wordBreak: lines > 1 ? 'break-word' : 'normal',
|
||||
overflowWrap: lines > 1 ? 'break-word' : 'normal',
|
||||
hyphens: lines > 1 ? 'auto' : 'manual',
|
||||
display: lines > 1 ? ('-webkit-box' as any) : undefined,
|
||||
WebkitBoxOrient: lines > 1 ? ('vertical' as any) : undefined,
|
||||
WebkitLineClamp: lines > 1 ? (lines as any) : undefined,
|
||||
lineClamp: lines > 1 ? (lines as any) : undefined,
|
||||
// Favor shrinking over breaking words; only break at natural spaces or softBreakChars
|
||||
wordBreak: lines > 1 ? ('keep-all' as any) : ('normal' as any),
|
||||
overflowWrap: 'normal',
|
||||
hyphens: 'manual',
|
||||
// fontSize expects rem values (e.g., 1.2, 0.9) to scale with global font size
|
||||
fontSize: fontSize ? `${fontSize}rem` : undefined,
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
|
||||
import { supportedLanguages } from '@app/i18n';
|
||||
import LocalIcon from '@app/components/shared/LocalIcon';
|
||||
import styles from '@app/components/shared/LanguageSelector.module.css';
|
||||
import { Z_INDEX_CONFIG_MODAL } from '@app/styles/zIndex';
|
||||
import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex';
|
||||
|
||||
// Types
|
||||
interface LanguageSelectorProps {
|
||||
@@ -163,35 +163,13 @@ const LanguageSelector: React.FC<LanguageSelectorProps> = ({
|
||||
const [pendingLanguage, setPendingLanguage] = useState<string | null>(null);
|
||||
const [rippleEffect, setRippleEffect] = useState<RippleEffect | null>(null);
|
||||
|
||||
// Get the filtered list of supported languages from i18n
|
||||
// This respects server config (ui.languages) applied by AppConfigLoader
|
||||
const allowedLanguages = (i18n.options.supportedLngs as string[] || [])
|
||||
.filter(lang => lang !== 'cimode'); // Exclude i18next debug language
|
||||
|
||||
const languageOptions: LanguageOption[] = Object.entries(supportedLanguages)
|
||||
.filter(([code]) => allowedLanguages.length === 0 || allowedLanguages.includes(code))
|
||||
.sort(([, nameA], [, nameB]) => nameA.localeCompare(nameB))
|
||||
.map(([code, name]) => ({
|
||||
value: code,
|
||||
label: `${name} (${code})`,
|
||||
label: name,
|
||||
}));
|
||||
|
||||
// Hide the language selector if there's only one language option
|
||||
// (no point showing a selector when there's nothing to select)
|
||||
if (languageOptions.length <= 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Calculate dropdown width and grid columns based on number of languages
|
||||
// 2-4: 300px/2 cols, 5-9: 400px/3 cols, 10+: 600px/4 cols
|
||||
const dropdownWidth = languageOptions.length <= 4 ? 300
|
||||
: languageOptions.length <= 9 ? 400
|
||||
: 600;
|
||||
|
||||
const gridColumns = languageOptions.length <= 4 ? 2
|
||||
: languageOptions.length <= 9 ? 3
|
||||
: 4;
|
||||
|
||||
const handleLanguageChange = (value: string, event: React.MouseEvent) => {
|
||||
// Create ripple effect at click position (only for button mode)
|
||||
if (!compact) {
|
||||
@@ -241,11 +219,10 @@ const LanguageSelector: React.FC<LanguageSelectorProps> = ({
|
||||
<Menu
|
||||
opened={opened}
|
||||
onChange={setOpened}
|
||||
width={dropdownWidth}
|
||||
width={600}
|
||||
position={position}
|
||||
offset={offset}
|
||||
zIndex={Z_INDEX_CONFIG_MODAL}
|
||||
withinPortal
|
||||
zIndex={Z_INDEX_OVER_FULLSCREEN_SURFACE}
|
||||
transitionProps={{
|
||||
transition: 'scale-y',
|
||||
duration: 120,
|
||||
@@ -301,13 +278,21 @@ const LanguageSelector: React.FC<LanguageSelectorProps> = ({
|
||||
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',
|
||||
backgroundColor: 'light-dark(var(--mantine-color-white), var(--mantine-color-dark-6))',
|
||||
border: 'light-dark(1px solid var(--mantine-color-gray-3), 1px solid var(--mantine-color-dark-4))',
|
||||
zIndex: Z_INDEX_OVER_FULLSCREEN_SURFACE,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
className={styles.languageGrid}
|
||||
style={{ gridTemplateColumns: `repeat(${gridColumns}, 1fr)` }}
|
||||
>
|
||||
{languageOptions.map((option, index) => (
|
||||
<div className={styles.languageGrid}>
|
||||
{languageOptions.map((option, index) => {
|
||||
const enabledLanguages = [
|
||||
'en-GB', 'zh-CN', 'zh-TW', 'ar-AR', 'fa-IR', 'tr-TR', 'uk-UA', 'zh-BO', 'sl-SI',
|
||||
'ru-RU', 'ja-JP', 'ko-KR', 'hu-HU', 'ga-IE', 'bg-BG', 'es-ES', 'hi-IN', 'hr-HR',
|
||||
'el-GR', 'ml-ML', 'pt-BR', 'pl-PL', 'pt-PT', 'sk-SK', 'sr-LATN-RS', 'no-NB',
|
||||
'th-TH', 'vi-VN', 'az-AZ', 'eu-ES', 'de-DE', 'sv-SE', 'it-IT', 'ca-CA', 'id-ID',
|
||||
'ro-RO', 'fr-FR', 'nl-NL', 'da-DK', 'cs-CZ'
|
||||
];
|
||||
const isDisabled = !enabledLanguages.includes(option.value);
|
||||
|
||||
return (
|
||||
<LanguageItem
|
||||
key={option.value}
|
||||
option={option}
|
||||
@@ -318,9 +303,10 @@ const LanguageSelector: React.FC<LanguageSelectorProps> = ({
|
||||
rippleEffect={rippleEffect}
|
||||
pendingLanguage={pendingLanguage}
|
||||
compact={compact}
|
||||
disabled={false}
|
||||
disabled={isDisabled}
|
||||
/>
|
||||
))}
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</Menu.Dropdown>
|
||||
</Menu>
|
||||
|
||||
@@ -12,7 +12,7 @@ interface NavigationWarningModalProps {
|
||||
|
||||
const NavigationWarningModal = ({ onApplyAndContinue, onExportAndContinue }: NavigationWarningModalProps) => {
|
||||
const { t } = useTranslation();
|
||||
const { showNavigationWarning, hasUnsavedChanges, pendingNavigation, cancelNavigation, confirmNavigation, setHasUnsavedChanges } =
|
||||
const { showNavigationWarning, hasUnsavedChanges, cancelNavigation, confirmNavigation, setHasUnsavedChanges } =
|
||||
useNavigationGuard();
|
||||
|
||||
const handleKeepWorking = () => {
|
||||
@@ -41,9 +41,7 @@ const NavigationWarningModal = ({ onApplyAndContinue, onExportAndContinue }: Nav
|
||||
};
|
||||
const BUTTON_WIDTH = "10rem";
|
||||
|
||||
// Only show modal if there are unsaved changes AND there's an actual pending navigation
|
||||
// This prevents the modal from showing due to spurious state updates
|
||||
if (!hasUnsavedChanges || !pendingNavigation) {
|
||||
if (!hasUnsavedChanges) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user