mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2026-09-03 05:10:16 +03:00
Compare commits
34
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5b0c9c0ec | ||
|
|
a1317f0e01 | ||
|
|
3529849bca | ||
|
|
49bea34576 | ||
|
|
f9a44c4da4 | ||
|
|
4ec75d4d8c | ||
|
|
93ed05b054 | ||
|
|
195b1472e4 | ||
|
|
340006ceea | ||
|
|
d80e627899 | ||
|
|
336ec34125 | ||
|
|
5f72c05623 | ||
|
|
33188815da | ||
|
|
0064c1866e | ||
|
|
371d816ce7 | ||
|
|
5f54308d2b | ||
|
|
6f7b8ce433 | ||
|
|
69ffd29bb5 | ||
|
|
f4cc87144d | ||
|
|
c86e2d6840 | ||
|
|
5f072f87bb | ||
|
|
eb3e57577c | ||
|
|
f29d85565a | ||
|
|
ae72344317 | ||
|
|
6565a6ce18 | ||
|
|
e26035c3b3 | ||
|
|
e474cc76ad | ||
|
|
43eaa84a8f | ||
|
|
2cd4175689 | ||
|
|
d6a83fe6a1 | ||
|
|
3c92cb7c2b | ||
|
|
b83888c74a | ||
|
|
787d0d21c9 | ||
|
|
7b26b184d1 |
@@ -52,7 +52,6 @@ jobs:
|
||||
core.setOutput('repository', pr.head.repo.full_name);
|
||||
core.setOutput('ref', pr.head.ref);
|
||||
core.setOutput('is_fork', String(pr.head.repo.fork));
|
||||
core.setOutput('base_ref', pr.base.ref);
|
||||
core.setOutput('author', pr.user.login);
|
||||
core.setOutput('state', pr.state);
|
||||
|
||||
@@ -65,10 +64,6 @@ jobs:
|
||||
IS_FORK: ${{ steps.resolve.outputs.is_fork }}
|
||||
# nur bei workflow_dispatch gesetzt:
|
||||
ALLOW_FORK_INPUT: ${{ inputs.allow_fork }}
|
||||
# für Auto-PR-Logik:
|
||||
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||
PR_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
PR_BASE: ${{ steps.resolve.outputs.base_ref }}
|
||||
PR_AUTHOR: ${{ steps.resolve.outputs.author }}
|
||||
run: |
|
||||
set -e
|
||||
@@ -89,14 +84,8 @@ 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 [ "$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
|
||||
should=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -174,7 +163,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 V2 version** for PR #${prNumber}...\n\n_This is an automated deployment for approved V2 contributors._\n\n⚠️ **Note:** If new commits are pushed during deployment, this build will be cancelled and replaced with the latest version.`
|
||||
});
|
||||
return newComment.id;
|
||||
|
||||
@@ -394,7 +383,7 @@ jobs:
|
||||
`🔗 **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** for approved V2 contributors.`;
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
|
||||
@@ -14,6 +14,7 @@ jobs:
|
||||
permissions:
|
||||
issues: write
|
||||
if: |
|
||||
vars.CI_PROFILE != 'lite' &&
|
||||
github.event.issue.pull_request &&
|
||||
(
|
||||
contains(github.event.comment.body, 'prdeploy') ||
|
||||
|
||||
@@ -262,7 +262,13 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
docker-rev: ["docker/embedded/Dockerfile", "docker/embedded/Dockerfile.ultra-lite", "docker/embedded/Dockerfile.fat"]
|
||||
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
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
|
||||
@@ -272,6 +278,13 @@ 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:
|
||||
@@ -313,7 +326,7 @@ jobs:
|
||||
if: always()
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
with:
|
||||
name: reports-docker-${{ matrix.docker-rev }}
|
||||
name: reports-docker-${{ matrix.artifact-suffix }}
|
||||
path: |
|
||||
build/reports/tests/
|
||||
build/test-results/
|
||||
|
||||
@@ -31,6 +31,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
determine-matrix:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
|
||||
@@ -24,6 +24,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-24.04-8core
|
||||
permissions:
|
||||
packages: write
|
||||
|
||||
@@ -24,6 +24,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
|
||||
@@ -17,6 +17,7 @@ permissions: read-all
|
||||
|
||||
jobs:
|
||||
analysis:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
name: Scorecard analysis
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
|
||||
@@ -27,6 +27,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
sonarqube:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -10,6 +10,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
@@ -23,6 +23,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -28,6 +28,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
determine-matrix:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
@@ -636,6 +637,8 @@ 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,6 +21,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
if: ${{ vars.CI_PROFILE != 'lite' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
|
||||
@@ -491,6 +491,9 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Ghostscript", "repair");
|
||||
addEndpointToGroup("Ghostscript", "compress-pdf");
|
||||
|
||||
/* ImageMagick */
|
||||
addEndpointToGroup("ImageMagick", "compress-pdf");
|
||||
|
||||
/* tesseract */
|
||||
addEndpointToGroup("tesseract", "ocr-pdf");
|
||||
|
||||
@@ -574,6 +577,7 @@ public class EndpointConfiguration {
|
||||
|| "Javascript".equals(group)
|
||||
|| "Weasyprint".equals(group)
|
||||
|| "Pdftohtml".equals(group)
|
||||
|| "ImageMagick".equals(group)
|
||||
|| "rar".equals(group);
|
||||
}
|
||||
|
||||
|
||||
@@ -37,10 +37,6 @@ public class AppConfig {
|
||||
|
||||
private final ApplicationProperties applicationProperties;
|
||||
|
||||
@Getter
|
||||
@Value("${baseUrl:http://localhost}")
|
||||
private String baseUrl;
|
||||
|
||||
@Getter
|
||||
@Value("${server.servlet.context-path:/}")
|
||||
private String contextPath;
|
||||
@@ -49,6 +45,17 @@ public class AppConfig {
|
||||
@Value("${server.port:8080}")
|
||||
private String serverPort;
|
||||
|
||||
/**
|
||||
* Get the backend URL from system configuration. Falls back to http://localhost if not
|
||||
* configured.
|
||||
*
|
||||
* @return The backend base URL for SAML/OAuth/API callbacks
|
||||
*/
|
||||
public String getBackendUrl() {
|
||||
String backendUrl = applicationProperties.getSystem().getBackendUrl();
|
||||
return (backendUrl != null && !backendUrl.isBlank()) ? backendUrl : "http://localhost";
|
||||
}
|
||||
|
||||
@Value("${v2}")
|
||||
public boolean v2Enabled;
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ public class ApplicationProperties {
|
||||
|
||||
private AutoPipeline autoPipeline = new AutoPipeline();
|
||||
private ProcessExecutor processExecutor = new ProcessExecutor();
|
||||
private PdfEditor pdfEditor = new PdfEditor();
|
||||
|
||||
@Bean
|
||||
public PropertySource<?> dynamicYamlPropertySource(ConfigurableEnvironment environment)
|
||||
@@ -100,6 +101,46 @@ public class ApplicationProperties {
|
||||
private String outputFolder;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class PdfEditor {
|
||||
private Cache cache = new Cache();
|
||||
private FontNormalization fontNormalization = new FontNormalization();
|
||||
private CffConverter cffConverter = new CffConverter();
|
||||
private Type3 type3 = new Type3();
|
||||
private String fallbackFont = "classpath:/static/fonts/NotoSans-Regular.ttf";
|
||||
|
||||
@Data
|
||||
public static class Cache {
|
||||
private long maxBytes = -1;
|
||||
private int maxPercent = 20;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class FontNormalization {
|
||||
private boolean enabled = false;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class CffConverter {
|
||||
private boolean enabled = true;
|
||||
private String method = "python";
|
||||
private String pythonCommand = "/opt/venv/bin/python3";
|
||||
private String pythonScript = "/scripts/convert_cff_to_ttf.py";
|
||||
private String fontforgeCommand = "fontforge";
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Type3 {
|
||||
private Library library = new Library();
|
||||
|
||||
@Data
|
||||
public static class Library {
|
||||
private boolean enabled = true;
|
||||
private String index = "classpath:/type3/library/index.json";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Legal {
|
||||
private String termsAndConditions;
|
||||
@@ -357,6 +398,7 @@ public class ApplicationProperties {
|
||||
private Boolean enableAnalytics;
|
||||
private Boolean enablePosthog;
|
||||
private Boolean enableScarf;
|
||||
private Boolean enableDesktopInstallSlide;
|
||||
private Datasource datasource;
|
||||
private Boolean disableSanitize;
|
||||
private int maxDPI;
|
||||
@@ -367,10 +409,12 @@ public class ApplicationProperties {
|
||||
private TempFileManagement tempFileManagement = new TempFileManagement();
|
||||
private DatabaseBackup databaseBackup = new DatabaseBackup();
|
||||
private List<String> corsAllowedOrigins = new ArrayList<>();
|
||||
private String
|
||||
frontendUrl; // Base URL for frontend (used for invite links, etc.). If not set,
|
||||
private String backendUrl; // Backend base URL for SAML/OAuth/API callbacks (e.g.
|
||||
// 'http://localhost:8080', 'https://api.example.com'). Required for
|
||||
// SSO.
|
||||
private String frontendUrl; // Frontend URL for invite email links (e.g.
|
||||
|
||||
// falls back to backend URL.
|
||||
// 'https://app.example.com'). If not set, falls back to backendUrl.
|
||||
|
||||
public boolean isAnalyticsEnabled() {
|
||||
return this.getEnableAnalytics() != null && this.getEnableAnalytics();
|
||||
@@ -535,6 +579,7 @@ public class ApplicationProperties {
|
||||
@ToString.Exclude private String key;
|
||||
private String UUID;
|
||||
private String appVersion;
|
||||
private Boolean isNewServer;
|
||||
}
|
||||
|
||||
// TODO: Remove post migration
|
||||
@@ -652,6 +697,7 @@ public class ApplicationProperties {
|
||||
private int weasyPrintSessionLimit;
|
||||
private int installAppSessionLimit;
|
||||
private int calibreSessionLimit;
|
||||
private int imageMagickSessionLimit;
|
||||
private int qpdfSessionLimit;
|
||||
private int tesseractSessionLimit;
|
||||
private int ghostscriptSessionLimit;
|
||||
@@ -689,6 +735,10 @@ public class ApplicationProperties {
|
||||
return calibreSessionLimit > 0 ? calibreSessionLimit : 1;
|
||||
}
|
||||
|
||||
public int getImageMagickSessionLimit() {
|
||||
return imageMagickSessionLimit > 0 ? imageMagickSessionLimit : 4;
|
||||
}
|
||||
|
||||
public int getGhostscriptSessionLimit() {
|
||||
return ghostscriptSessionLimit > 0 ? ghostscriptSessionLimit : 8;
|
||||
}
|
||||
@@ -718,6 +768,8 @@ public class ApplicationProperties {
|
||||
@JsonProperty("calibretimeoutMinutes")
|
||||
private long calibreTimeoutMinutes;
|
||||
|
||||
private long imageMagickTimeoutMinutes;
|
||||
|
||||
private long tesseractTimeoutMinutes;
|
||||
private long qpdfTimeoutMinutes;
|
||||
private long ghostscriptTimeoutMinutes;
|
||||
@@ -755,6 +807,10 @@ public class ApplicationProperties {
|
||||
return calibreTimeoutMinutes > 0 ? calibreTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getImageMagickTimeoutMinutes() {
|
||||
return imageMagickTimeoutMinutes > 0 ? imageMagickTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getGhostscriptTimeoutMinutes() {
|
||||
return ghostscriptTimeoutMinutes > 0 ? ghostscriptTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package stirling.software.common.service;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||
|
||||
public interface LineArtConversionService {
|
||||
PDImageXObject convertImageToLineArt(
|
||||
PDDocument doc, PDImageXObject originalImage, double threshold, int edgeLevel)
|
||||
throws IOException;
|
||||
}
|
||||
@@ -86,6 +86,11 @@ public class ProcessExecutor {
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getCalibreSessionLimit();
|
||||
case IMAGEMAGICK ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getImageMagickSessionLimit();
|
||||
case GHOSTSCRIPT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
@@ -141,6 +146,11 @@ public class ProcessExecutor {
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getCalibreTimeoutMinutes();
|
||||
case IMAGEMAGICK ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getImageMagickTimeoutMinutes();
|
||||
case GHOSTSCRIPT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
@@ -301,6 +311,7 @@ public class ProcessExecutor {
|
||||
WEASYPRINT,
|
||||
INSTALL_APP,
|
||||
CALIBRE,
|
||||
IMAGEMAGICK,
|
||||
TESSERACT,
|
||||
QPDF,
|
||||
GHOSTSCRIPT,
|
||||
|
||||
@@ -26,6 +26,7 @@ public class RequestUriUtils {
|
||||
|| normalizedUri.startsWith("/public/")
|
||||
|| normalizedUri.startsWith("/pdfjs/")
|
||||
|| normalizedUri.startsWith("/pdfjs-legacy/")
|
||||
|| normalizedUri.startsWith("/pdfium/")
|
||||
|| normalizedUri.startsWith("/assets/")
|
||||
|| normalizedUri.startsWith("/locales/")
|
||||
|| normalizedUri.startsWith("/Login/")
|
||||
@@ -61,7 +62,8 @@ public class RequestUriUtils {
|
||||
|| normalizedUri.endsWith(".css")
|
||||
|| normalizedUri.endsWith(".mjs")
|
||||
|| normalizedUri.endsWith(".html")
|
||||
|| normalizedUri.endsWith(".toml");
|
||||
|| normalizedUri.endsWith(".toml")
|
||||
|| normalizedUri.endsWith(".wasm");
|
||||
}
|
||||
|
||||
public static boolean isFrontendRoute(String contextPath, String requestURI) {
|
||||
@@ -125,11 +127,13 @@ public class RequestUriUtils {
|
||||
|| requestURI.endsWith("popularity.txt")
|
||||
|| requestURI.endsWith(".js")
|
||||
|| requestURI.endsWith(".toml")
|
||||
|| requestURI.endsWith(".wasm")
|
||||
|| requestURI.contains("swagger")
|
||||
|| requestURI.startsWith("/api/v1/info")
|
||||
|| requestURI.startsWith("/site.webmanifest")
|
||||
|| requestURI.startsWith("/fonts")
|
||||
|| requestURI.startsWith("/pdfjs"));
|
||||
|| requestURI.startsWith("/pdfjs")
|
||||
|| requestURI.startsWith("/pdfium"));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -162,10 +166,9 @@ 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.contains("/v1/api-docs");
|
||||
|| trimmedUri.startsWith("/v1/api-docs");
|
||||
}
|
||||
|
||||
private static String stripContextPath(String contextPath, String requestURI) {
|
||||
|
||||
@@ -24,6 +24,9 @@ public class RequestUriUtilsTest {
|
||||
assertTrue(
|
||||
RequestUriUtils.isStaticResource("/pdfjs/pdf.worker.js"),
|
||||
"PDF.js files should be static");
|
||||
assertTrue(
|
||||
RequestUriUtils.isStaticResource("/pdfium/pdfium.wasm"),
|
||||
"PDFium wasm should be static");
|
||||
assertTrue(
|
||||
RequestUriUtils.isStaticResource("/api/v1/info/status"),
|
||||
"API status should be static");
|
||||
@@ -110,7 +113,8 @@ public class RequestUriUtilsTest {
|
||||
"/downloads/document.png",
|
||||
"/assets/brand.ico",
|
||||
"/any/path/with/image.svg",
|
||||
"/deep/nested/folder/icon.png"
|
||||
"/deep/nested/folder/icon.png",
|
||||
"/pdfium/pdfium.wasm"
|
||||
})
|
||||
void testIsStaticResourceWithFileExtensions(String path) {
|
||||
assertTrue(
|
||||
@@ -148,6 +152,9 @@ public class RequestUriUtilsTest {
|
||||
assertFalse(
|
||||
RequestUriUtils.isTrackableResource("/script.js"),
|
||||
"JS files should not be trackable");
|
||||
assertFalse(
|
||||
RequestUriUtils.isTrackableResource("/pdfium/pdfium.wasm"),
|
||||
"PDFium wasm should not be trackable");
|
||||
assertFalse(
|
||||
RequestUriUtils.isTrackableResource("/swagger/index.html"),
|
||||
"Swagger files should not be trackable");
|
||||
@@ -224,7 +231,8 @@ public class RequestUriUtilsTest {
|
||||
"/api/v1/info/health",
|
||||
"/site.webmanifest",
|
||||
"/fonts/roboto.woff",
|
||||
"/pdfjs/viewer.js"
|
||||
"/pdfjs/viewer.js",
|
||||
"/pdfium/pdfium.wasm"
|
||||
})
|
||||
void testNonTrackableResources(String path) {
|
||||
assertFalse(
|
||||
|
||||
@@ -138,13 +138,13 @@ public class SPDFApplication {
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
String baseUrl = appConfig.getBaseUrl();
|
||||
String backendUrl = appConfig.getBackendUrl();
|
||||
String contextPath = appConfig.getContextPath();
|
||||
String serverPort = appConfig.getServerPort();
|
||||
baseUrlStatic = baseUrl;
|
||||
baseUrlStatic = backendUrl;
|
||||
contextPathStatic = contextPath;
|
||||
serverPortStatic = serverPort;
|
||||
String url = baseUrl + ":" + getStaticPort() + contextPath;
|
||||
String url = backendUrl + ":" + getStaticPort() + contextPath;
|
||||
|
||||
// Log Tauri mode information
|
||||
if (Boolean.parseBoolean(System.getProperty("STIRLING_PDF_TAURI_MODE", "false"))) {
|
||||
|
||||
@@ -46,6 +46,7 @@ public class ExternalAppDepConfig {
|
||||
put("qpdf", List.of("qpdf"));
|
||||
put("tesseract", List.of("tesseract"));
|
||||
put("rar", List.of("rar")); // Required for real CBR output
|
||||
put("magick", List.of("ImageMagick"));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -128,6 +129,7 @@ public class ExternalAppDepConfig {
|
||||
checkDependencyAndDisableGroup("pdftohtml");
|
||||
checkDependencyAndDisableGroup(unoconvPath);
|
||||
checkDependencyAndDisableGroup("rar");
|
||||
checkDependencyAndDisableGroup("magick");
|
||||
// Special handling for Python/OpenCV dependencies
|
||||
boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python");
|
||||
if (!pythonAvailable) {
|
||||
|
||||
@@ -94,6 +94,7 @@ public class InitialSetup {
|
||||
}
|
||||
GeneralUtils.saveKeyToSettings("AutomaticallyGenerated.appVersion", appVersion);
|
||||
applicationProperties.getAutomaticallyGenerated().setAppVersion(appVersion);
|
||||
applicationProperties.getAutomaticallyGenerated().setIsNewServer(isNewServer);
|
||||
}
|
||||
|
||||
public static boolean isNewServer() {
|
||||
|
||||
@@ -62,10 +62,15 @@ 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 server = new Server().url(swaggerServerUrl).description("API Server");
|
||||
openAPI.addServersItem(server);
|
||||
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");
|
||||
}
|
||||
openAPI.addServersItem(server);
|
||||
|
||||
// Add ErrorResponse schema to components
|
||||
Schema<?> errorResponseSchema =
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
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;
|
||||
@@ -25,6 +29,41 @@ 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
|
||||
// Check customFiles/static first, then fall back to classpath
|
||||
registry.addResourceHandler("/assets/**")
|
||||
.addResourceLocations(
|
||||
"file:"
|
||||
+ stirling.software.common.configuration.InstallationPathConfig
|
||||
.getStaticPath()
|
||||
+ "assets/",
|
||||
"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
|
||||
// Note: index.html is handled by ReactRoutingController for dynamic processing
|
||||
registry.addResourceHandler("/index.html")
|
||||
.addResourceLocations(
|
||||
"file:"
|
||||
+ stirling.software.common.configuration.InstallationPathConfig
|
||||
.getStaticPath(),
|
||||
"classpath:/static/")
|
||||
.setCacheControl(CacheControl.noCache().mustRevalidate());
|
||||
|
||||
// Handle all other static resources (js, css, images, fonts, etc.)
|
||||
// Check customFiles/static first for user overrides
|
||||
registry.addResourceHandler("/**")
|
||||
.addResourceLocations(
|
||||
"file:"
|
||||
+ stirling.software.common.configuration.InstallationPathConfig
|
||||
.getStaticPath(),
|
||||
"classpath:/static/")
|
||||
.setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
// Check if running in Tauri mode
|
||||
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
package stirling.software.SPDF.controller.api.converters;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.exception.CacheUnavailableException;
|
||||
|
||||
@ControllerAdvice(assignableTypes = ConvertPdfJsonController.class)
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class ConvertPdfJsonExceptionHandler {
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
@ExceptionHandler(CacheUnavailableException.class)
|
||||
@ResponseBody
|
||||
public ResponseEntity<byte[]> handleCacheUnavailable(CacheUnavailableException ex) {
|
||||
try {
|
||||
byte[] body =
|
||||
objectMapper.writeValueAsBytes(
|
||||
java.util.Map.of(
|
||||
"error", "cache_unavailable",
|
||||
"action", "reupload",
|
||||
"message", ex.getMessage()));
|
||||
return ResponseEntity.status(HttpStatus.GONE)
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.body(body);
|
||||
} catch (Exception e) {
|
||||
log.warn("Failed to serialize cache_unavailable response", e);
|
||||
var fallbackBody =
|
||||
java.util.Map.of(
|
||||
"error", "cache_unavailable",
|
||||
"action", "reupload",
|
||||
"message", String.valueOf(ex.getMessage()));
|
||||
try {
|
||||
return ResponseEntity.status(HttpStatus.GONE)
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.body(objectMapper.writeValueAsBytes(fallbackBody));
|
||||
} catch (Exception ignored) {
|
||||
// Truly last-ditch fallback
|
||||
return ResponseEntity.status(HttpStatus.GONE)
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.body(
|
||||
"{\"error\":\"cache_unavailable\",\"action\":\"reupload\",\"message\":\"Cache unavailable\"}"
|
||||
.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+103
@@ -28,10 +28,13 @@ import org.apache.pdfbox.pdmodel.PDResources;
|
||||
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
|
||||
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
|
||||
@@ -44,6 +47,7 @@ import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
||||
import stirling.software.common.annotations.AutoJobPostMapping;
|
||||
import stirling.software.common.annotations.api.MiscApi;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.service.LineArtConversionService;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
@@ -58,6 +62,9 @@ public class CompressController {
|
||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||
private final EndpointConfiguration endpointConfiguration;
|
||||
|
||||
@Autowired(required = false)
|
||||
private LineArtConversionService lineArtConversionService;
|
||||
|
||||
private boolean isQpdfEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("qpdf");
|
||||
}
|
||||
@@ -66,6 +73,10 @@ public class CompressController {
|
||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||
}
|
||||
|
||||
private boolean isImageMagickEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("ImageMagick");
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@@ -660,6 +671,9 @@ public class CompressController {
|
||||
Integer optimizeLevel = request.getOptimizeLevel();
|
||||
String expectedOutputSizeString = request.getExpectedOutputSize();
|
||||
Boolean convertToGrayscale = request.getGrayscale();
|
||||
Boolean convertToLineArt = request.getLineArt();
|
||||
Double lineArtThreshold = request.getLineArtThreshold();
|
||||
Integer lineArtEdgeLevel = request.getLineArtEdgeLevel();
|
||||
if (expectedOutputSizeString == null && optimizeLevel == null) {
|
||||
throw new Exception("Both expected output size and optimize level are not specified");
|
||||
}
|
||||
@@ -689,6 +703,26 @@ public class CompressController {
|
||||
optimizeLevel = determineOptimizeLevel(sizeReductionRatio);
|
||||
}
|
||||
|
||||
if (Boolean.TRUE.equals(convertToLineArt)) {
|
||||
if (lineArtConversionService == null) {
|
||||
throw new ResponseStatusException(
|
||||
HttpStatus.FORBIDDEN,
|
||||
"Line art conversion is unavailable - ImageMagick service not found");
|
||||
}
|
||||
if (!isImageMagickEnabled()) {
|
||||
throw new IOException(
|
||||
"ImageMagick is not enabled but line art conversion was requested");
|
||||
}
|
||||
double thresholdValue =
|
||||
lineArtThreshold == null
|
||||
? 55d
|
||||
: Math.min(100d, Math.max(0d, lineArtThreshold));
|
||||
int edgeLevel =
|
||||
lineArtEdgeLevel == null ? 1 : Math.min(3, Math.max(1, lineArtEdgeLevel));
|
||||
currentFile =
|
||||
applyLineArtConversion(currentFile, tempFiles, thresholdValue, edgeLevel);
|
||||
}
|
||||
|
||||
boolean sizeMet = false;
|
||||
boolean imageCompressionApplied = false;
|
||||
boolean externalCompressionApplied = false;
|
||||
@@ -810,6 +844,75 @@ public class CompressController {
|
||||
}
|
||||
}
|
||||
|
||||
private Path applyLineArtConversion(
|
||||
Path currentFile, List<Path> tempFiles, double threshold, int edgeLevel)
|
||||
throws IOException {
|
||||
|
||||
Path lineArtFile = Files.createTempFile("lineart_output_", ".pdf");
|
||||
tempFiles.add(lineArtFile);
|
||||
|
||||
try (PDDocument doc = pdfDocumentFactory.load(currentFile.toFile())) {
|
||||
Map<String, List<ImageReference>> uniqueImages = findImages(doc);
|
||||
CompressionStats stats = new CompressionStats();
|
||||
stats.uniqueImagesCount = uniqueImages.size();
|
||||
calculateImageStats(uniqueImages, stats);
|
||||
|
||||
Map<String, PDImageXObject> convertedImages =
|
||||
createLineArtImages(doc, uniqueImages, stats, threshold, edgeLevel);
|
||||
|
||||
replaceImages(doc, uniqueImages, convertedImages, stats);
|
||||
|
||||
log.info(
|
||||
"Applied line art conversion to {} unique images ({} total references)",
|
||||
stats.uniqueImagesCount,
|
||||
stats.totalImages);
|
||||
|
||||
doc.save(lineArtFile.toString());
|
||||
return lineArtFile;
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, PDImageXObject> createLineArtImages(
|
||||
PDDocument doc,
|
||||
Map<String, List<ImageReference>> uniqueImages,
|
||||
CompressionStats stats,
|
||||
double threshold,
|
||||
int edgeLevel)
|
||||
throws IOException {
|
||||
|
||||
Map<String, PDImageXObject> convertedImages = new HashMap<>();
|
||||
|
||||
for (Entry<String, List<ImageReference>> entry : uniqueImages.entrySet()) {
|
||||
String imageHash = entry.getKey();
|
||||
List<ImageReference> references = entry.getValue();
|
||||
if (references.isEmpty()) continue;
|
||||
|
||||
PDImageXObject originalImage = getOriginalImage(doc, references.get(0));
|
||||
|
||||
int originalSize = (int) originalImage.getCOSObject().getLength();
|
||||
stats.totalOriginalBytes += originalSize;
|
||||
|
||||
PDImageXObject converted =
|
||||
lineArtConversionService.convertImageToLineArt(
|
||||
doc, originalImage, threshold, edgeLevel);
|
||||
convertedImages.put(imageHash, converted);
|
||||
stats.compressedImages++;
|
||||
|
||||
int convertedSize = (int) converted.getCOSObject().getLength();
|
||||
stats.totalCompressedBytes += convertedSize * references.size();
|
||||
|
||||
double reductionPercentage = 100.0 - ((convertedSize * 100.0) / originalSize);
|
||||
log.info(
|
||||
"Image hash {}: Line art conversion {} → {} (reduced by {}%)",
|
||||
imageHash,
|
||||
GeneralUtils.formatBytes(originalSize),
|
||||
GeneralUtils.formatBytes(convertedSize),
|
||||
String.format("%.1f", reductionPercentage));
|
||||
}
|
||||
|
||||
return convertedImages;
|
||||
}
|
||||
|
||||
// Run Ghostscript compression
|
||||
private void applyGhostscriptCompression(
|
||||
OptimizePdfRequest request, int optimizeLevel, Path currentFile, List<Path> tempFiles)
|
||||
|
||||
+11
-1
@@ -66,7 +66,8 @@ public class ConfigController {
|
||||
AppConfig appConfig = applicationContext.getBean(AppConfig.class);
|
||||
|
||||
// Extract key configuration values from AppConfig
|
||||
configData.put("baseUrl", appConfig.getBaseUrl());
|
||||
// Note: Frontend expects "baseUrl" field name for compatibility
|
||||
configData.put("baseUrl", appConfig.getBackendUrl());
|
||||
configData.put("contextPath", appConfig.getContextPath());
|
||||
configData.put("serverPort", appConfig.getServerPort());
|
||||
|
||||
@@ -124,6 +125,9 @@ public class ConfigController {
|
||||
"enableAnalytics", applicationProperties.getSystem().getEnableAnalytics());
|
||||
configData.put("enablePosthog", applicationProperties.getSystem().getEnablePosthog());
|
||||
configData.put("enableScarf", applicationProperties.getSystem().getEnableScarf());
|
||||
configData.put(
|
||||
"enableDesktopInstallSlide",
|
||||
applicationProperties.getSystem().getEnableDesktopInstallSlide());
|
||||
|
||||
// Premium/Enterprise settings
|
||||
configData.put("premiumEnabled", applicationProperties.getPremium().isEnabled());
|
||||
@@ -227,4 +231,10 @@ public class ConfigController {
|
||||
}
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
|
||||
@GetMapping("/group-enabled")
|
||||
public ResponseEntity<Boolean> isGroupEnabled(@RequestParam(name = "group") String group) {
|
||||
boolean enabled = endpointConfiguration.isGroupEnabled(group);
|
||||
return ResponseEntity.ok(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
+23
@@ -191,6 +191,12 @@ public class CertSignController {
|
||||
|
||||
switch (certType) {
|
||||
case "PEM":
|
||||
privateKeyFile =
|
||||
validateFilePresent(
|
||||
privateKeyFile, "PEM private key", "private key file is required");
|
||||
certFile =
|
||||
validateFilePresent(
|
||||
certFile, "PEM certificate", "certificate file is required");
|
||||
ks = KeyStore.getInstance("JKS");
|
||||
ks.load(null);
|
||||
PrivateKey privateKey = getPrivateKeyFromPEM(privateKeyFile.getBytes(), password);
|
||||
@@ -200,10 +206,16 @@ public class CertSignController {
|
||||
break;
|
||||
case "PKCS12":
|
||||
case "PFX":
|
||||
p12File =
|
||||
validateFilePresent(
|
||||
p12File, "PKCS12 keystore", "PKCS12/PFX keystore file is required");
|
||||
ks = KeyStore.getInstance("PKCS12");
|
||||
ks.load(p12File.getInputStream(), password.toCharArray());
|
||||
break;
|
||||
case "JKS":
|
||||
jksfile =
|
||||
validateFilePresent(
|
||||
jksfile, "JKS keystore", "JKS keystore file is required");
|
||||
ks = KeyStore.getInstance("JKS");
|
||||
ks.load(jksfile.getInputStream(), password.toCharArray());
|
||||
break;
|
||||
@@ -251,6 +263,17 @@ public class CertSignController {
|
||||
GeneralUtils.generateFilename(pdf.getOriginalFilename(), "_signed.pdf"));
|
||||
}
|
||||
|
||||
private MultipartFile validateFilePresent(
|
||||
MultipartFile file, String argumentName, String errorDescription) {
|
||||
if (file == null || file.isEmpty()) {
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.invalidArgument",
|
||||
"Invalid argument: {0}",
|
||||
argumentName + " - " + errorDescription);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
private PrivateKey getPrivateKeyFromPEM(byte[] pemBytes, String password)
|
||||
throws IOException, OperatorCreationException, PKCSException {
|
||||
try (PEMParser pemParser =
|
||||
|
||||
+45
-4
@@ -3,9 +3,14 @@ package stirling.software.SPDF.controller.web;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
@@ -14,6 +19,11 @@ import org.springframework.web.bind.annotation.GetMapping;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.configuration.InstallationPathConfig;
|
||||
|
||||
@Slf4j
|
||||
@Controller
|
||||
public class ReactRoutingController {
|
||||
|
||||
@@ -22,24 +32,44 @@ public class ReactRoutingController {
|
||||
|
||||
private String cachedIndexHtml;
|
||||
private boolean indexHtmlExists = false;
|
||||
private boolean useExternalIndexHtml = false;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// Only cache if index.html exists (production builds)
|
||||
log.info("Static files custom path: {}", InstallationPathConfig.getStaticPath());
|
||||
|
||||
// Check for external index.html first (customFiles/static/)
|
||||
Path externalIndexPath = Paths.get(InstallationPathConfig.getStaticPath(), "index.html");
|
||||
log.debug("Checking for custom index.html at: {}", externalIndexPath);
|
||||
if (Files.exists(externalIndexPath) && Files.isReadable(externalIndexPath)) {
|
||||
log.info("Using custom index.html from: {}", externalIndexPath);
|
||||
try {
|
||||
this.cachedIndexHtml = processIndexHtml();
|
||||
this.indexHtmlExists = true;
|
||||
this.useExternalIndexHtml = true;
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
log.warn("Failed to load custom index.html, falling back to classpath", e);
|
||||
}
|
||||
}
|
||||
|
||||
// Fall back to classpath index.html
|
||||
ClassPathResource resource = new ClassPathResource("static/index.html");
|
||||
if (resource.exists()) {
|
||||
try {
|
||||
this.cachedIndexHtml = processIndexHtml();
|
||||
this.indexHtmlExists = true;
|
||||
this.useExternalIndexHtml = false;
|
||||
} catch (IOException e) {
|
||||
// Failed to cache, will process on each request
|
||||
log.warn("Failed to cache index.html", e);
|
||||
this.indexHtmlExists = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String processIndexHtml() throws IOException {
|
||||
ClassPathResource resource = new ClassPathResource("static/index.html");
|
||||
Resource resource = getIndexHtmlResource();
|
||||
|
||||
try (InputStream inputStream = resource.getInputStream()) {
|
||||
String html = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
@@ -62,6 +92,17 @@ public class ReactRoutingController {
|
||||
}
|
||||
}
|
||||
|
||||
private Resource getIndexHtmlResource() throws IOException {
|
||||
// Check external location first
|
||||
Path externalIndexPath = Paths.get(InstallationPathConfig.getStaticPath(), "index.html");
|
||||
if (Files.exists(externalIndexPath) && Files.isReadable(externalIndexPath)) {
|
||||
return new FileSystemResource(externalIndexPath.toFile());
|
||||
}
|
||||
|
||||
// Fall back to classpath
|
||||
return new ClassPathResource("static/index.html");
|
||||
}
|
||||
|
||||
@GetMapping(
|
||||
value = {"/", "/index.html"},
|
||||
produces = MediaType.TEXT_HTML_VALUE)
|
||||
@@ -74,13 +115,13 @@ 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)[^\\.]*$}")
|
||||
"/{path:^(?!api|static|robots\\.txt|favicon\\.ico|manifest.*\\.json|pipeline|pdfjs|pdfjs-legacy|pdfium|fonts|images|files|css|js|assets|locales|modern-logo|classic-logo|Login|og_images|samples)[^\\.]*$}")
|
||||
public ResponseEntity<String> forwardRootPaths(HttpServletRequest request) throws IOException {
|
||||
return serveIndexHtml(request);
|
||||
}
|
||||
|
||||
@GetMapping(
|
||||
"/{path:^(?!api|static|pipeline|pdfjs|pdfjs-legacy|fonts|images|files|css|js|assets|locales|modern-logo|classic-logo|Login|og_images|samples)[^\\.]*}/{subpath:^(?!.*\\.).*$}")
|
||||
"/{path:^(?!api|static|pipeline|pdfjs|pdfjs-legacy|pdfium|fonts|images|files|css|js|assets|locales|modern-logo|classic-logo|Login|og_images|samples)[^\\.]*}/{subpath:^(?!.*\\.).*$}")
|
||||
public ResponseEntity<String> forwardNestedPaths(HttpServletRequest request)
|
||||
throws IOException {
|
||||
return serveIndexHtml(request);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package stirling.software.SPDF.exception;
|
||||
|
||||
public class CacheUnavailableException extends RuntimeException {
|
||||
|
||||
public CacheUnavailableException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -45,4 +45,26 @@ public class OptimizePdfRequest extends PDFFile {
|
||||
requiredMode = Schema.RequiredMode.REQUIRED,
|
||||
defaultValue = "false")
|
||||
private Boolean grayscale = false;
|
||||
|
||||
@Schema(
|
||||
description =
|
||||
"Whether to convert images to high-contrast line art using ImageMagick. Default is false.",
|
||||
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||
defaultValue = "false")
|
||||
private Boolean lineArt = false;
|
||||
|
||||
@Schema(
|
||||
description = "Threshold to use for line art conversion (0-100).",
|
||||
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||
defaultValue = "55")
|
||||
private Double lineArtThreshold = 55d;
|
||||
|
||||
@Schema(
|
||||
description =
|
||||
"Edge detection strength to use for line art conversion (1-3). This maps to"
|
||||
+ " ImageMagick's -edge radius.",
|
||||
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||
defaultValue = "1",
|
||||
allowableValues = {"1", "2", "3"})
|
||||
private Integer lineArtEdgeLevel = 1;
|
||||
}
|
||||
|
||||
+279
-31
@@ -86,7 +86,6 @@ import org.apache.pdfbox.text.PDFTextStripper;
|
||||
import org.apache.pdfbox.text.TextPosition;
|
||||
import org.apache.pdfbox.util.DateConverter;
|
||||
import org.apache.pdfbox.util.Matrix;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@@ -144,15 +143,23 @@ public class PdfJsonConversionService {
|
||||
private final PdfJsonFontService fontService;
|
||||
private final Type3FontConversionService type3FontConversionService;
|
||||
private final Type3GlyphExtractor type3GlyphExtractor;
|
||||
private final stirling.software.common.model.ApplicationProperties applicationProperties;
|
||||
private final Map<String, PDFont> type3NormalizedFontCache = new ConcurrentHashMap<>();
|
||||
private final Map<String, Set<Integer>> type3GlyphCoverageCache = new ConcurrentHashMap<>();
|
||||
|
||||
@Value("${stirling.pdf.json.font-normalization.enabled:true}")
|
||||
private boolean fontNormalizationEnabled;
|
||||
private long cacheMaxBytes;
|
||||
private int cacheMaxPercent;
|
||||
|
||||
/** Cache for storing PDDocuments for lazy page loading. Key is jobId. */
|
||||
private final Map<String, CachedPdfDocument> documentCache = new ConcurrentHashMap<>();
|
||||
|
||||
private final java.util.LinkedHashMap<String, CachedPdfDocument> lruCache =
|
||||
new java.util.LinkedHashMap<>(16, 0.75f, true);
|
||||
private final Object cacheLock = new Object();
|
||||
private volatile long currentCacheBytes = 0L;
|
||||
private volatile long cacheBudgetBytes = -1L;
|
||||
|
||||
private volatile boolean ghostscriptAvailable;
|
||||
|
||||
private static final float FLOAT_EPSILON = 0.0001f;
|
||||
@@ -161,7 +168,23 @@ public class PdfJsonConversionService {
|
||||
|
||||
@PostConstruct
|
||||
private void initializeToolAvailability() {
|
||||
loadConfigurationFromProperties();
|
||||
initializeGhostscriptAvailability();
|
||||
initializeCacheBudget();
|
||||
}
|
||||
|
||||
private void loadConfigurationFromProperties() {
|
||||
stirling.software.common.model.ApplicationProperties.PdfEditor cfg =
|
||||
applicationProperties.getPdfEditor();
|
||||
if (cfg != null) {
|
||||
fontNormalizationEnabled = cfg.getFontNormalization().isEnabled();
|
||||
cacheMaxBytes = cfg.getCache().getMaxBytes();
|
||||
cacheMaxPercent = cfg.getCache().getMaxPercent();
|
||||
} else {
|
||||
fontNormalizationEnabled = false;
|
||||
cacheMaxBytes = -1;
|
||||
cacheMaxPercent = 20;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeGhostscriptAvailability() {
|
||||
@@ -202,6 +225,25 @@ public class PdfJsonConversionService {
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeCacheBudget() {
|
||||
long effective = -1L;
|
||||
if (cacheMaxBytes > 0) {
|
||||
effective = cacheMaxBytes;
|
||||
} else if (cacheMaxPercent > 0) {
|
||||
long maxMem = Runtime.getRuntime().maxMemory();
|
||||
effective = Math.max(0L, (maxMem * cacheMaxPercent) / 100);
|
||||
}
|
||||
cacheBudgetBytes = effective;
|
||||
if (cacheBudgetBytes > 0) {
|
||||
log.info(
|
||||
"PDF JSON cache budget configured: {} bytes (source: {})",
|
||||
cacheBudgetBytes,
|
||||
cacheMaxBytes > 0 ? "max-bytes" : "max-percent");
|
||||
} else {
|
||||
log.info("PDF JSON cache budget: unlimited");
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] convertPdfToJson(MultipartFile file) throws IOException {
|
||||
return convertPdfToJson(file, null, false);
|
||||
}
|
||||
@@ -236,7 +278,10 @@ public class PdfJsonConversionService {
|
||||
log.debug("Generated synthetic jobId for synchronous conversion: {}", jobId);
|
||||
} else {
|
||||
jobId = contextJobId;
|
||||
log.debug("Starting PDF to JSON conversion, jobId from context: {}", jobId);
|
||||
log.info(
|
||||
"Starting PDF to JSON conversion, jobId from context: {} (lightweight={})",
|
||||
jobId,
|
||||
lightweight);
|
||||
}
|
||||
|
||||
Consumer<PdfJsonConversionProgress> progress =
|
||||
@@ -318,9 +363,9 @@ public class PdfJsonConversionService {
|
||||
|
||||
try (PDDocument document = pdfDocumentFactory.load(workingPath, true)) {
|
||||
int totalPages = document.getNumberOfPages();
|
||||
// Only use lazy images for real async jobs where client can access the cache
|
||||
// Synchronous calls with synthetic jobId should do full extraction
|
||||
boolean useLazyImages = totalPages > 5 && isRealJobId;
|
||||
// Always enable lazy mode for real async jobs so cache is available regardless of
|
||||
// page count. Synchronous calls with synthetic jobId still do full extraction.
|
||||
boolean useLazyImages = isRealJobId;
|
||||
Map<COSBase, FontModelCacheEntry> fontCache = new IdentityHashMap<>();
|
||||
Map<COSBase, EncodedImage> imageCache = new IdentityHashMap<>();
|
||||
log.debug(
|
||||
@@ -403,6 +448,11 @@ public class PdfJsonConversionService {
|
||||
|
||||
// Only cache for real async jobIds, not synthetic synchronous ones
|
||||
if (useLazyImages && isRealJobId) {
|
||||
log.info(
|
||||
"Creating cache for jobId: {} (useLazyImages={}, isRealJobId={})",
|
||||
jobId,
|
||||
useLazyImages,
|
||||
isRealJobId);
|
||||
PdfJsonDocumentMetadata docMetadata = new PdfJsonDocumentMetadata();
|
||||
docMetadata.setMetadata(pdfJson.getMetadata());
|
||||
docMetadata.setXmpMetadata(pdfJson.getXmpMetadata());
|
||||
@@ -435,16 +485,23 @@ public class PdfJsonConversionService {
|
||||
cachedPdfBytes = Files.readAllBytes(workingPath);
|
||||
}
|
||||
CachedPdfDocument cached =
|
||||
new CachedPdfDocument(
|
||||
cachedPdfBytes, docMetadata, fonts, pageFontResources);
|
||||
documentCache.put(jobId, cached);
|
||||
log.debug(
|
||||
"Cached PDF bytes ({} bytes, {} pages, {} fonts) for lazy images, jobId: {}",
|
||||
cachedPdfBytes.length,
|
||||
buildCachedDocument(
|
||||
jobId, cachedPdfBytes, docMetadata, fonts, pageFontResources);
|
||||
putCachedDocument(jobId, cached);
|
||||
log.info(
|
||||
"Successfully cached PDF ({} bytes, {} pages, {} fonts) for jobId: {} (diskBacked={})",
|
||||
cached.getPdfSize(),
|
||||
totalPages,
|
||||
fonts.size(),
|
||||
jobId);
|
||||
jobId,
|
||||
cached.isDiskBacked());
|
||||
scheduleDocumentCleanup(jobId);
|
||||
} else {
|
||||
log.warn(
|
||||
"Skipping cache creation: useLazyImages={}, isRealJobId={}, jobId={}",
|
||||
useLazyImages,
|
||||
isRealJobId,
|
||||
jobId);
|
||||
}
|
||||
|
||||
if (lightweight) {
|
||||
@@ -2973,6 +3030,139 @@ public class PdfJsonConversionService {
|
||||
}
|
||||
}
|
||||
|
||||
// Cache helpers
|
||||
private CachedPdfDocument buildCachedDocument(
|
||||
String jobId,
|
||||
byte[] pdfBytes,
|
||||
PdfJsonDocumentMetadata metadata,
|
||||
Map<String, PdfJsonFont> fonts,
|
||||
Map<Integer, Map<PDFont, String>> pageFontResources)
|
||||
throws IOException {
|
||||
if (pdfBytes == null) {
|
||||
throw new IllegalArgumentException("pdfBytes must not be null");
|
||||
}
|
||||
long budget = cacheBudgetBytes;
|
||||
// If single document is larger than budget, spill straight to disk
|
||||
if (budget > 0 && pdfBytes.length > budget) {
|
||||
TempFile tempFile = new TempFile(tempFileManager, ".pdfjsoncache");
|
||||
Files.write(tempFile.getPath(), pdfBytes);
|
||||
log.debug(
|
||||
"Cached PDF spilled to disk ({} bytes exceeds budget {}) for jobId {}",
|
||||
pdfBytes.length,
|
||||
budget,
|
||||
jobId);
|
||||
return new CachedPdfDocument(
|
||||
null, tempFile, pdfBytes.length, metadata, fonts, pageFontResources);
|
||||
}
|
||||
return new CachedPdfDocument(
|
||||
pdfBytes, null, pdfBytes.length, metadata, fonts, pageFontResources);
|
||||
}
|
||||
|
||||
private void putCachedDocument(String jobId, CachedPdfDocument cached) {
|
||||
synchronized (cacheLock) {
|
||||
CachedPdfDocument existing = documentCache.put(jobId, cached);
|
||||
if (existing != null) {
|
||||
lruCache.remove(jobId);
|
||||
currentCacheBytes = Math.max(0L, currentCacheBytes - existing.getInMemorySize());
|
||||
existing.close();
|
||||
}
|
||||
lruCache.put(jobId, cached);
|
||||
currentCacheBytes += cached.getInMemorySize();
|
||||
enforceCacheBudget();
|
||||
}
|
||||
}
|
||||
|
||||
private CachedPdfDocument getCachedDocument(String jobId) {
|
||||
synchronized (cacheLock) {
|
||||
CachedPdfDocument cached = documentCache.get(jobId);
|
||||
if (cached != null) {
|
||||
lruCache.remove(jobId);
|
||||
lruCache.put(jobId, cached);
|
||||
}
|
||||
return cached;
|
||||
}
|
||||
}
|
||||
|
||||
private void enforceCacheBudget() {
|
||||
if (cacheBudgetBytes <= 0) {
|
||||
return;
|
||||
}
|
||||
// Must be called under cacheLock
|
||||
java.util.Iterator<java.util.Map.Entry<String, CachedPdfDocument>> it =
|
||||
lruCache.entrySet().iterator();
|
||||
while (currentCacheBytes > cacheBudgetBytes && it.hasNext()) {
|
||||
java.util.Map.Entry<String, CachedPdfDocument> entry = it.next();
|
||||
it.remove();
|
||||
CachedPdfDocument removed = entry.getValue();
|
||||
documentCache.remove(entry.getKey(), removed);
|
||||
currentCacheBytes = Math.max(0L, currentCacheBytes - removed.getInMemorySize());
|
||||
removed.close();
|
||||
log.warn(
|
||||
"Evicted cached PDF for jobId {} to enforce cache budget (budget={} bytes, current={} bytes)",
|
||||
entry.getKey(),
|
||||
cacheBudgetBytes,
|
||||
currentCacheBytes);
|
||||
}
|
||||
if (currentCacheBytes > cacheBudgetBytes && !lruCache.isEmpty()) {
|
||||
// Spill the most recently used large entry to disk
|
||||
String key =
|
||||
lruCache.entrySet().stream()
|
||||
.reduce((first, second) -> second)
|
||||
.map(java.util.Map.Entry::getKey)
|
||||
.orElse(null);
|
||||
if (key != null) {
|
||||
CachedPdfDocument doc = lruCache.get(key);
|
||||
if (doc != null && doc.getInMemorySize() > 0) {
|
||||
try {
|
||||
CachedPdfDocument diskDoc =
|
||||
buildCachedDocument(
|
||||
key,
|
||||
doc.getPdfBytes(),
|
||||
doc.getMetadata(),
|
||||
doc.getFonts(),
|
||||
doc.getPageFontResources());
|
||||
lruCache.put(key, diskDoc);
|
||||
documentCache.put(key, diskDoc);
|
||||
currentCacheBytes =
|
||||
Math.max(0L, currentCacheBytes - doc.getInMemorySize())
|
||||
+ diskDoc.getInMemorySize();
|
||||
doc.close();
|
||||
log.debug("Spilled cached PDF for jobId {} to disk to satisfy budget", key);
|
||||
} catch (IOException ex) {
|
||||
log.warn(
|
||||
"Failed to spill cached PDF for jobId {} to disk: {}",
|
||||
key,
|
||||
ex.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removeCachedDocument(String jobId) {
|
||||
log.warn(
|
||||
"removeCachedDocument called for jobId: {} [CALLER: {}]",
|
||||
jobId,
|
||||
Thread.currentThread().getStackTrace()[2].toString());
|
||||
CachedPdfDocument removed = null;
|
||||
synchronized (cacheLock) {
|
||||
removed = documentCache.remove(jobId);
|
||||
if (removed != null) {
|
||||
lruCache.remove(jobId);
|
||||
currentCacheBytes = Math.max(0L, currentCacheBytes - removed.getInMemorySize());
|
||||
log.warn(
|
||||
"Removed cached document for jobId: {} (size={} bytes)",
|
||||
jobId,
|
||||
removed.getInMemorySize());
|
||||
} else {
|
||||
log.warn("Attempted to remove jobId: {} but it was not in cache", jobId);
|
||||
}
|
||||
}
|
||||
if (removed != null) {
|
||||
removed.close();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyTextState(PDPageContentStream contentStream, PdfJsonTextElement element)
|
||||
throws IOException {
|
||||
if (element.getCharacterSpacing() != null) {
|
||||
@@ -5311,6 +5501,8 @@ public class PdfJsonConversionService {
|
||||
*/
|
||||
private static class CachedPdfDocument {
|
||||
private final byte[] pdfBytes;
|
||||
private final TempFile pdfTempFile;
|
||||
private final long pdfSize;
|
||||
private final PdfJsonDocumentMetadata metadata;
|
||||
private final Map<String, PdfJsonFont> fonts; // Font map with UIDs for consistency
|
||||
private final Map<Integer, Map<PDFont, String>> pageFontResources; // Page font resources
|
||||
@@ -5318,10 +5510,14 @@ public class PdfJsonConversionService {
|
||||
|
||||
public CachedPdfDocument(
|
||||
byte[] pdfBytes,
|
||||
TempFile pdfTempFile,
|
||||
long pdfSize,
|
||||
PdfJsonDocumentMetadata metadata,
|
||||
Map<String, PdfJsonFont> fonts,
|
||||
Map<Integer, Map<PDFont, String>> pageFontResources) {
|
||||
this.pdfBytes = pdfBytes;
|
||||
this.pdfTempFile = pdfTempFile;
|
||||
this.pdfSize = pdfSize;
|
||||
this.metadata = metadata;
|
||||
// Create defensive copies to prevent mutation of shared maps
|
||||
this.fonts =
|
||||
@@ -5336,8 +5532,14 @@ public class PdfJsonConversionService {
|
||||
}
|
||||
|
||||
// Getters return defensive copies to prevent external mutation
|
||||
public byte[] getPdfBytes() {
|
||||
return pdfBytes;
|
||||
public byte[] getPdfBytes() throws IOException {
|
||||
if (pdfBytes != null) {
|
||||
return pdfBytes;
|
||||
}
|
||||
if (pdfTempFile != null) {
|
||||
return Files.readAllBytes(pdfTempFile.getPath());
|
||||
}
|
||||
throw new IOException("Cached PDF backing missing");
|
||||
}
|
||||
|
||||
public PdfJsonDocumentMetadata getMetadata() {
|
||||
@@ -5352,6 +5554,18 @@ public class PdfJsonConversionService {
|
||||
return new java.util.concurrent.ConcurrentHashMap<>(pageFontResources);
|
||||
}
|
||||
|
||||
public long getPdfSize() {
|
||||
return pdfSize;
|
||||
}
|
||||
|
||||
public long getInMemorySize() {
|
||||
return pdfBytes != null ? pdfBytes.length : 0L;
|
||||
}
|
||||
|
||||
public boolean isDiskBacked() {
|
||||
return pdfBytes == null && pdfTempFile != null;
|
||||
}
|
||||
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
@@ -5363,7 +5577,19 @@ public class PdfJsonConversionService {
|
||||
public CachedPdfDocument withUpdatedFonts(
|
||||
byte[] nextBytes, Map<String, PdfJsonFont> nextFonts) {
|
||||
Map<String, PdfJsonFont> fontsToUse = nextFonts != null ? nextFonts : this.fonts;
|
||||
return new CachedPdfDocument(nextBytes, metadata, fontsToUse, pageFontResources);
|
||||
return new CachedPdfDocument(
|
||||
nextBytes,
|
||||
null,
|
||||
nextBytes != null ? nextBytes.length : 0,
|
||||
metadata,
|
||||
fontsToUse,
|
||||
pageFontResources);
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (pdfTempFile != null) {
|
||||
pdfTempFile.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5444,14 +5670,15 @@ public class PdfJsonConversionService {
|
||||
// Cache PDF bytes, metadata, and fonts for lazy page loading
|
||||
if (jobId != null) {
|
||||
CachedPdfDocument cached =
|
||||
new CachedPdfDocument(pdfBytes, docMetadata, fonts, pageFontResources);
|
||||
documentCache.put(jobId, cached);
|
||||
buildCachedDocument(jobId, pdfBytes, docMetadata, fonts, pageFontResources);
|
||||
putCachedDocument(jobId, cached);
|
||||
log.debug(
|
||||
"Cached PDF bytes ({} bytes, {} pages, {} fonts) for lazy loading, jobId: {}",
|
||||
pdfBytes.length,
|
||||
"Cached PDF bytes ({} bytes, {} pages, {} fonts) for lazy loading, jobId: {} (diskBacked={})",
|
||||
cached.getPdfSize(),
|
||||
totalPages,
|
||||
fonts.size(),
|
||||
jobId);
|
||||
jobId,
|
||||
cached.isDiskBacked());
|
||||
|
||||
// Schedule cleanup after 30 minutes
|
||||
scheduleDocumentCleanup(jobId);
|
||||
@@ -5466,9 +5693,10 @@ public class PdfJsonConversionService {
|
||||
|
||||
/** Extracts a single page from cached PDF bytes. Re-loads the PDF for each request. */
|
||||
public byte[] extractSinglePage(String jobId, int pageNumber) throws IOException {
|
||||
CachedPdfDocument cached = documentCache.get(jobId);
|
||||
CachedPdfDocument cached = getCachedDocument(jobId);
|
||||
if (cached == null) {
|
||||
throw new IllegalArgumentException("No cached document found for jobId: " + jobId);
|
||||
throw new stirling.software.SPDF.exception.CacheUnavailableException(
|
||||
"No cached document found for jobId: " + jobId);
|
||||
}
|
||||
|
||||
int pageIndex = pageNumber - 1;
|
||||
@@ -5480,8 +5708,8 @@ public class PdfJsonConversionService {
|
||||
}
|
||||
|
||||
log.debug(
|
||||
"Loading PDF from bytes ({} bytes) to extract page {} (jobId: {})",
|
||||
cached.getPdfBytes().length,
|
||||
"Loading PDF from {} to extract page {} (jobId: {})",
|
||||
cached.isDiskBacked() ? "disk cache" : "memory cache",
|
||||
pageNumber,
|
||||
jobId);
|
||||
|
||||
@@ -5627,10 +5855,21 @@ public class PdfJsonConversionService {
|
||||
if (jobId == null || jobId.isBlank()) {
|
||||
throw new IllegalArgumentException("jobId is required for incremental export");
|
||||
}
|
||||
CachedPdfDocument cached = documentCache.get(jobId);
|
||||
log.info("Looking up cache for jobId: {}", jobId);
|
||||
CachedPdfDocument cached = getCachedDocument(jobId);
|
||||
if (cached == null) {
|
||||
throw new IllegalArgumentException("No cached document available for jobId: " + jobId);
|
||||
log.error(
|
||||
"Cache not found for jobId: {}. Available cache keys: {}",
|
||||
jobId,
|
||||
documentCache.keySet());
|
||||
throw new stirling.software.SPDF.exception.CacheUnavailableException(
|
||||
"No cached document available for jobId: " + jobId);
|
||||
}
|
||||
log.info(
|
||||
"Found cached document for jobId: {} (size={}, diskBacked={})",
|
||||
jobId,
|
||||
cached.getPdfSize(),
|
||||
cached.isDiskBacked());
|
||||
if (updates == null || updates.getPages() == null || updates.getPages().isEmpty()) {
|
||||
log.debug(
|
||||
"Incremental export requested with no page updates; returning cached PDF for jobId {}",
|
||||
@@ -5709,7 +5948,14 @@ public class PdfJsonConversionService {
|
||||
document.save(baos);
|
||||
byte[] updatedBytes = baos.toByteArray();
|
||||
|
||||
documentCache.put(jobId, cached.withUpdatedFonts(updatedBytes, mergedFonts));
|
||||
CachedPdfDocument updated =
|
||||
buildCachedDocument(
|
||||
jobId,
|
||||
updatedBytes,
|
||||
cached.getMetadata(),
|
||||
mergedFonts,
|
||||
cached.getPageFontResources());
|
||||
putCachedDocument(jobId, updated);
|
||||
|
||||
// Clear Type3 cache entries for this incremental update
|
||||
clearType3CacheEntriesForJob(updateJobId);
|
||||
@@ -5724,11 +5970,13 @@ public class PdfJsonConversionService {
|
||||
|
||||
/** Clears a cached document. */
|
||||
public void clearCachedDocument(String jobId) {
|
||||
CachedPdfDocument cached = documentCache.remove(jobId);
|
||||
CachedPdfDocument cached = getCachedDocument(jobId);
|
||||
removeCachedDocument(jobId);
|
||||
if (cached != null) {
|
||||
log.debug(
|
||||
"Removed cached PDF bytes ({} bytes) for jobId: {}",
|
||||
cached.getPdfBytes().length,
|
||||
"Removed cached PDF ({} bytes, diskBacked={}) for jobId: {}",
|
||||
cached.getPdfSize(),
|
||||
cached.isDiskBacked(),
|
||||
jobId);
|
||||
}
|
||||
|
||||
|
||||
@@ -312,12 +312,29 @@ public class PdfJsonFallbackFontService {
|
||||
"ttf")));
|
||||
|
||||
private final ResourceLoader resourceLoader;
|
||||
private final stirling.software.common.model.ApplicationProperties applicationProperties;
|
||||
|
||||
@Value("${stirling.pdf.fallback-font:" + DEFAULT_FALLBACK_FONT_LOCATION + "}")
|
||||
private String legacyFallbackFontLocation;
|
||||
|
||||
private String fallbackFontLocation;
|
||||
|
||||
private final Map<String, byte[]> fallbackFontCache = new ConcurrentHashMap<>();
|
||||
|
||||
@jakarta.annotation.PostConstruct
|
||||
private void loadConfig() {
|
||||
String configured = null;
|
||||
if (applicationProperties.getPdfEditor() != null) {
|
||||
configured = applicationProperties.getPdfEditor().getFallbackFont();
|
||||
}
|
||||
if (configured != null && !configured.isBlank()) {
|
||||
fallbackFontLocation = configured;
|
||||
} else {
|
||||
fallbackFontLocation = legacyFallbackFontLocation;
|
||||
}
|
||||
log.info("Using fallback font location: {}", fallbackFontLocation);
|
||||
}
|
||||
|
||||
public PdfJsonFont buildFallbackFontModel() throws IOException {
|
||||
return buildFallbackFontModel(FALLBACK_FONT_ID);
|
||||
}
|
||||
|
||||
+20
-10
@@ -5,7 +5,6 @@ import java.nio.file.Files;
|
||||
import java.util.Base64;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
@@ -25,22 +24,16 @@ import stirling.software.common.util.TempFileManager;
|
||||
public class PdfJsonFontService {
|
||||
|
||||
private final TempFileManager tempFileManager;
|
||||
private final stirling.software.common.model.ApplicationProperties applicationProperties;
|
||||
|
||||
@Getter
|
||||
@Value("${stirling.pdf.json.cff-converter.enabled:true}")
|
||||
private boolean cffConversionEnabled;
|
||||
@Getter private boolean cffConversionEnabled;
|
||||
|
||||
@Getter
|
||||
@Value("${stirling.pdf.json.cff-converter.method:python}")
|
||||
private String cffConverterMethod;
|
||||
@Getter private String cffConverterMethod;
|
||||
|
||||
@Value("${stirling.pdf.json.cff-converter.python-command:/opt/venv/bin/python3}")
|
||||
private String pythonCommand;
|
||||
|
||||
@Value("${stirling.pdf.json.cff-converter.python-script:/scripts/convert_cff_to_ttf.py}")
|
||||
private String pythonScript;
|
||||
|
||||
@Value("${stirling.pdf.json.cff-converter.fontforge-command:fontforge}")
|
||||
private String fontforgeCommand;
|
||||
|
||||
private volatile boolean pythonCffConverterAvailable;
|
||||
@@ -48,6 +41,7 @@ public class PdfJsonFontService {
|
||||
|
||||
@PostConstruct
|
||||
private void initialiseCffConverterAvailability() {
|
||||
loadConfiguration();
|
||||
if (!cffConversionEnabled) {
|
||||
log.warn("[FONT-DEBUG] CFF conversion is DISABLED in configuration");
|
||||
pythonCffConverterAvailable = false;
|
||||
@@ -77,6 +71,22 @@ public class PdfJsonFontService {
|
||||
log.info("[FONT-DEBUG] Selected CFF converter method: {}", cffConverterMethod);
|
||||
}
|
||||
|
||||
private void loadConfiguration() {
|
||||
if (applicationProperties.getPdfEditor() != null
|
||||
&& applicationProperties.getPdfEditor().getCffConverter() != null) {
|
||||
var cfg = applicationProperties.getPdfEditor().getCffConverter();
|
||||
this.cffConversionEnabled = cfg.isEnabled();
|
||||
this.cffConverterMethod = cfg.getMethod();
|
||||
this.pythonCommand = cfg.getPythonCommand();
|
||||
this.pythonScript = cfg.getPythonScript();
|
||||
this.fontforgeCommand = cfg.getFontforgeCommand();
|
||||
} else {
|
||||
// Use defaults when config is not available
|
||||
this.cffConversionEnabled = false;
|
||||
log.warn("[FONT-DEBUG] PdfEditor configuration not available, CFF conversion disabled");
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] convertCffProgramToTrueType(byte[] fontBytes, String toUnicode) {
|
||||
if (!cffConversionEnabled || fontBytes == null || fontBytes.length == 0) {
|
||||
log.warn(
|
||||
|
||||
+14
-2
@@ -2,7 +2,6 @@ package stirling.software.SPDF.service.pdfjson.type3;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -23,8 +22,8 @@ import stirling.software.SPDF.service.pdfjson.type3.library.Type3FontLibraryPayl
|
||||
public class Type3LibraryStrategy implements Type3ConversionStrategy {
|
||||
|
||||
private final Type3FontLibrary fontLibrary;
|
||||
private final stirling.software.common.model.ApplicationProperties applicationProperties;
|
||||
|
||||
@Value("${stirling.pdf.json.type3.library.enabled:true}")
|
||||
private boolean enabled;
|
||||
|
||||
@Override
|
||||
@@ -42,6 +41,19 @@ public class Type3LibraryStrategy implements Type3ConversionStrategy {
|
||||
return enabled && fontLibrary != null && fontLibrary.isLoaded();
|
||||
}
|
||||
|
||||
@jakarta.annotation.PostConstruct
|
||||
private void loadConfiguration() {
|
||||
if (applicationProperties.getPdfEditor() != null
|
||||
&& applicationProperties.getPdfEditor().getType3() != null
|
||||
&& applicationProperties.getPdfEditor().getType3().getLibrary() != null) {
|
||||
var cfg = applicationProperties.getPdfEditor().getType3().getLibrary();
|
||||
this.enabled = cfg.isEnabled();
|
||||
} else {
|
||||
this.enabled = false;
|
||||
log.warn("PdfEditor Type3 library configuration not available, disabled");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdfJsonFontConversionCandidate convert(
|
||||
Type3ConversionRequest request, Type3GlyphContext context) throws IOException {
|
||||
|
||||
+12
-2
@@ -14,7 +14,6 @@ import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.pdfbox.cos.COSName;
|
||||
import org.apache.pdfbox.pdmodel.font.PDType3Font;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -34,8 +33,8 @@ public class Type3FontLibrary {
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
private final ResourceLoader resourceLoader;
|
||||
private final stirling.software.common.model.ApplicationProperties applicationProperties;
|
||||
|
||||
@Value("${stirling.pdf.json.type3.library.index:classpath:/type3/library/index.json}")
|
||||
private String indexLocation;
|
||||
|
||||
private final Map<String, Type3FontLibraryEntry> signatureIndex = new ConcurrentHashMap<>();
|
||||
@@ -44,6 +43,17 @@ public class Type3FontLibrary {
|
||||
|
||||
@jakarta.annotation.PostConstruct
|
||||
void initialise() {
|
||||
if (applicationProperties.getPdfEditor() != null
|
||||
&& applicationProperties.getPdfEditor().getType3() != null
|
||||
&& applicationProperties.getPdfEditor().getType3().getLibrary() != null) {
|
||||
this.indexLocation =
|
||||
applicationProperties.getPdfEditor().getType3().getLibrary().getIndex();
|
||||
} else {
|
||||
log.warn(
|
||||
"[TYPE3] PdfEditor Type3 library configuration not available; Type3 library disabled");
|
||||
entries = List.of();
|
||||
return;
|
||||
}
|
||||
Resource resource = resourceLoader.getResource(indexLocation);
|
||||
if (!resource.exists()) {
|
||||
log.info("[TYPE3] Library index {} not found; Type3 library disabled", indexLocation);
|
||||
|
||||
@@ -58,6 +58,8 @@ security:
|
||||
idpCert: classpath:okta.cert # The certificate your Provider will use to authenticate your app's SAML authentication requests. Provided by your Provider
|
||||
privateKey: classpath:saml-private-key.key # Your private key. Generated from your keypair
|
||||
spCert: classpath:saml-public-cert.crt # Your signing certificate. Generated from your keypair
|
||||
# IMPORTANT: For SAML setup, download your SP metadata from the BACKEND URL: http://localhost:8080/saml2/service-provider-metadata/{registrationId}
|
||||
# Do NOT use the frontend dev server URL (localhost:5173) as it will generate incorrect ACS URLs. Always use the backend URL (localhost:8080) for SAML configuration.
|
||||
jwt: # This feature is currently under development and not yet fully supported. Do not use in production.
|
||||
persistence: true # Set to 'true' to enable JWT key store
|
||||
enableKeyRotation: true # Set to 'true' to enable key pair rotation
|
||||
@@ -126,13 +128,15 @@ system:
|
||||
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files
|
||||
tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
|
||||
enableAnalytics: null # Master toggle for analytics: set to 'true' to enable all analytics, 'false' to disable all analytics, or leave as 'null' to prompt admin on first launch
|
||||
enableDesktopInstallSlide: true # Set to 'false' to hide the desktop app installation slide in the onboarding flow
|
||||
enablePosthog: null # Enable PostHog analytics (open-source product analytics): set to 'true' to enable, 'false' to disable, or 'null' to enable by default when analytics is enabled
|
||||
enableScarf: null # Enable Scarf tracking pixel: set to 'true' to enable, 'false' to disable, or 'null' to enable by default when analytics is enabled
|
||||
enableUrlToPDF: false # Set to 'true' to enable URL to PDF, INTERNAL ONLY, known security issues, should not be used externally
|
||||
disableSanitize: false # set to true to disable Sanitize HTML; (can lead to injections in HTML)
|
||||
maxDPI: 500 # Maximum allowed DPI for PDF to image conversion
|
||||
corsAllowedOrigins: [] # List of allowed origins for CORS (e.g. ['http://localhost:5173', 'https://app.example.com']). Leave empty to disable CORS.
|
||||
frontendUrl: '' # Base URL for frontend (e.g. 'https://pdf.example.com'). Used for generating invite links in emails. If empty, falls back to backend URL.
|
||||
corsAllowedOrigins: [] # List of allowed origins for CORS (e.g. ['http://localhost:5173', 'https://app.example.com']). Leave empty to disable CORS. For local development with frontend on port 5173, add 'http://localhost:5173'
|
||||
backendUrl: '' # Backend base URL for SAML/OAuth/API callbacks (e.g. 'http://localhost:8080' for dev, 'https://api.example.com' for production). REQUIRED for SSO authentication to work correctly. This is where your IdP will send SAML responses and OAuth callbacks. Leave empty to default to 'http://localhost:8080' in development.
|
||||
frontendUrl: '' # Frontend URL for invite email links (e.g. 'https://app.example.com'). Optional - if not set, will use backendUrl. This is the URL users click in invite emails.
|
||||
serverCertificate:
|
||||
enabled: true # Enable server-side certificate for "Sign with Stirling-PDF" option
|
||||
organizationName: Stirling-PDF # Organization name for generated certificates
|
||||
@@ -178,23 +182,6 @@ system:
|
||||
databaseBackup:
|
||||
cron: '0 0 0 * * ?' # Cron expression for automatic database backups "0 0 0 * * ?" daily at midnight
|
||||
|
||||
stirling:
|
||||
pdf:
|
||||
fallback-font: classpath:/static/fonts/NotoSans-Regular.ttf # Override to point at a custom fallback font
|
||||
json:
|
||||
font-normalization:
|
||||
enabled: false # IMPORTANT: Disable to preserve ToUnicode CMaps for correct font rendering. Ghostscript strips Unicode mappings from CID fonts.
|
||||
cff-converter:
|
||||
enabled: true # Wrap CFF/Type1C fonts as OpenType-CFF for browser compatibility
|
||||
method: python # Converter method: 'python' (fontTools, recommended - wraps as OTF), 'fontforge' (legacy - converts to TTF, may hang on CID fonts)
|
||||
python-command: /opt/venv/bin/python3 # Python interpreter path
|
||||
python-script: /scripts/convert_cff_to_ttf.py # Path to font wrapping script
|
||||
fontforge-command: fontforge # Override if FontForge is installed under a different name/path
|
||||
type3:
|
||||
library:
|
||||
enabled: true # Match common Type3 fonts against the built-in library of converted programs
|
||||
index: classpath:/type3/library/index.json # Override to point at a custom index.json (supports http:, file:, classpath:)
|
||||
|
||||
ui:
|
||||
appNameNavbar: '' # name displayed on the navigation bar
|
||||
logoStyle: classic # Options: 'classic' (default - classic S icon) or 'modern' (minimalist logo)
|
||||
@@ -223,6 +210,7 @@ processExecutor:
|
||||
weasyPrintSessionLimit: 16
|
||||
installAppSessionLimit: 1
|
||||
calibreSessionLimit: 1
|
||||
imageMagickSessionLimit: 4
|
||||
ghostscriptSessionLimit: 8
|
||||
ocrMyPdfSessionLimit: 2
|
||||
timeoutMinutes: # Process executor timeout in minutes
|
||||
@@ -232,7 +220,26 @@ processExecutor:
|
||||
weasyPrinttimeoutMinutes: 30
|
||||
installApptimeoutMinutes: 60
|
||||
calibretimeoutMinutes: 30
|
||||
imageMagickTimeoutMinutes: 30
|
||||
tesseractTimeoutMinutes: 30
|
||||
qpdfTimeoutMinutes: 30
|
||||
ghostscriptTimeoutMinutes: 30
|
||||
ocrMyPdfTimeoutMinutes: 30
|
||||
|
||||
pdfEditor:
|
||||
fallback-font: classpath:/static/fonts/NotoSans-Regular.ttf # Override to point at a custom fallback font
|
||||
cache:
|
||||
max-bytes: -1 # Max in-memory cache size in bytes; -1 disables byte cap
|
||||
max-percent: 20 # Max in-memory cache as % of JVM max; used when max-bytes <= 0
|
||||
font-normalization:
|
||||
enabled: false # IMPORTANT: Disable to preserve ToUnicode CMaps for correct font rendering. Ghostscript strips Unicode mappings from CID fonts.
|
||||
cff-converter:
|
||||
enabled: true # Wrap CFF/Type1CFF fonts as OpenType-CFF for browser compatibility
|
||||
method: python # Converter method: 'python' (fontTools, recommended - wraps as OTF), 'fontforge' (legacy - converts to TTF, may hang on CID fonts)
|
||||
python-command: /opt/venv/bin/python3 # Python interpreter path
|
||||
python-script: /scripts/convert_cff_to_ttf.py # Path to font wrapping script
|
||||
fontforge-command: fontforge # Override if FontForge is installed under a different name/path
|
||||
type3:
|
||||
library:
|
||||
enabled: true # Match common Type3 fonts against the built-in library of converted programs
|
||||
index: classpath:/type3/library/index.json # Override to point at a custom index.json (supports http:, file:, classpath:)
|
||||
|
||||
+29
-2
@@ -1,9 +1,10 @@
|
||||
package stirling.software.SPDF.controller.api.security;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.mockito.Mockito.lenient;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
@@ -107,7 +108,8 @@ class CertSignControllerTest {
|
||||
derCertBytes = baos.toByteArray();
|
||||
}
|
||||
|
||||
when(pdfDocumentFactory.load(any(MultipartFile.class)))
|
||||
lenient()
|
||||
.when(pdfDocumentFactory.load(any(MultipartFile.class)))
|
||||
.thenAnswer(
|
||||
invocation -> {
|
||||
MultipartFile file = invocation.getArgument(0);
|
||||
@@ -167,6 +169,31 @@ class CertSignControllerTest {
|
||||
assertTrue(response.getBody().length > 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSignPdfWithMissingPkcs12FileThrowsError() {
|
||||
MockMultipartFile pdfFile =
|
||||
new MockMultipartFile(
|
||||
"fileInput", "test.pdf", MediaType.APPLICATION_PDF_VALUE, pdfBytes);
|
||||
|
||||
SignPDFWithCertRequest request = new SignPDFWithCertRequest();
|
||||
request.setFileInput(pdfFile);
|
||||
request.setCertType("PFX");
|
||||
request.setPassword("password");
|
||||
request.setShowSignature(false);
|
||||
request.setReason("test");
|
||||
request.setLocation("test");
|
||||
request.setName("tester");
|
||||
request.setPageNumber(1);
|
||||
request.setShowLogo(false);
|
||||
|
||||
IllegalArgumentException exception =
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
() -> certSignController.signPDFWithCert(request));
|
||||
|
||||
assertTrue(exception.getMessage().contains("PKCS12 keystore"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSignPdfWithJks() throws Exception {
|
||||
MockMultipartFile pdfFile =
|
||||
|
||||
+23
-4
@@ -94,6 +94,22 @@ public class ProprietaryUIDataController {
|
||||
this.auditRepository = auditRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the backend base URL for SAML/OAuth redirects. Uses system.backendUrl from config if set,
|
||||
* otherwise defaults to http://localhost:8080
|
||||
*/
|
||||
private String getBackendBaseUrl() {
|
||||
String backendUrl = applicationProperties.getSystem().getBackendUrl();
|
||||
|
||||
// If backendUrl is configured, use it
|
||||
if (backendUrl != null && !backendUrl.trim().isEmpty()) {
|
||||
return backendUrl.trim();
|
||||
}
|
||||
|
||||
// For development, default to localhost:8080 (backend port)
|
||||
return "http://localhost:8080";
|
||||
}
|
||||
|
||||
@GetMapping("/audit-dashboard")
|
||||
@PreAuthorize("hasRole('ADMIN')")
|
||||
@EnterpriseEndpoint
|
||||
@@ -185,14 +201,17 @@ public class ProprietaryUIDataController {
|
||||
}
|
||||
|
||||
SAML2 saml2 = securityProps.getSaml2();
|
||||
if (securityProps.isSaml2Active()
|
||||
&& applicationProperties.getSystem().getEnableAlphaFunctionality()
|
||||
&& applicationProperties.getPremium().isEnabled()) {
|
||||
if (securityProps.isSaml2Active() && applicationProperties.getPremium().isEnabled()) {
|
||||
String samlIdp = saml2.getProvider();
|
||||
String saml2AuthenticationPath = "/saml2/authenticate/" + saml2.getRegistrationId();
|
||||
|
||||
// For SAML, we need to use the backend URL directly, not a relative path
|
||||
// This ensures Spring Security generates the correct ACS URL
|
||||
String backendUrl = getBackendBaseUrl();
|
||||
String fullSamlPath = backendUrl + saml2AuthenticationPath;
|
||||
|
||||
if (!applicationProperties.getPremium().getProFeatures().isSsoAutoLogin()) {
|
||||
providerList.put(saml2AuthenticationPath, samlIdp + " (SAML 2)");
|
||||
providerList.put(fullSamlPath, samlIdp + " (SAML 2)");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-2
@@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.annotations.api.UserApi;
|
||||
import stirling.software.common.configuration.InstallationPathConfig;
|
||||
import stirling.software.proprietary.model.api.signature.SavedSignatureRequest;
|
||||
import stirling.software.proprietary.model.api.signature.SavedSignatureResponse;
|
||||
@@ -34,7 +33,6 @@ import stirling.software.proprietary.service.SignatureService;
|
||||
* authentication and enforces per-user storage limits. All endpoints require authentication
|
||||
* via @PreAuthorize("isAuthenticated()").
|
||||
*/
|
||||
@UserApi
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/proprietary/signatures")
|
||||
|
||||
+1
-1
@@ -198,7 +198,7 @@ public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
|
||||
private SamlClient getSamlClient(
|
||||
String registrationId, SAML2 samlConf, List<X509Certificate> certificates)
|
||||
throws SamlException {
|
||||
String serverUrl = appConfig.getBaseUrl() + ":" + appConfig.getServerPort();
|
||||
String serverUrl = appConfig.getBackendUrl() + ":" + appConfig.getServerPort();
|
||||
|
||||
String relyingPartyIdentifier =
|
||||
serverUrl + "/saml2/service-provider-metadata/" + registrationId;
|
||||
|
||||
+1
-3
@@ -120,9 +120,7 @@ public class AccountWebController {
|
||||
|
||||
SAML2 saml2 = securityProps.getSaml2();
|
||||
|
||||
if (securityProps.isSaml2Active()
|
||||
&& applicationProperties.getSystem().getEnableAlphaFunctionality()
|
||||
&& applicationProperties.getPremium().isEnabled()) {
|
||||
if (securityProps.isSaml2Active() && applicationProperties.getPremium().isEnabled()) {
|
||||
String samlIdp = saml2.getProvider();
|
||||
String saml2AuthenticationPath = "/saml2/authenticate/" + saml2.getRegistrationId();
|
||||
|
||||
|
||||
+9
-33
@@ -197,7 +197,6 @@ public class SecurityConfiguration {
|
||||
http.csrf(CsrfConfigurer::disable);
|
||||
|
||||
if (loginEnabledValue) {
|
||||
boolean v2Enabled = appConfig.v2Enabled();
|
||||
|
||||
http.addFilterBefore(
|
||||
userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
|
||||
@@ -205,19 +204,9 @@ public class SecurityConfiguration {
|
||||
.addFilterBefore(jwtAuthenticationFilter, UserAuthenticationFilter.class);
|
||||
|
||||
http.sessionManagement(
|
||||
sessionManagement -> {
|
||||
if (v2Enabled) {
|
||||
sessionManagement ->
|
||||
sessionManagement.sessionCreationPolicy(
|
||||
SessionCreationPolicy.STATELESS);
|
||||
} else {
|
||||
sessionManagement
|
||||
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
|
||||
.maximumSessions(10)
|
||||
.maxSessionsPreventsLogin(false)
|
||||
.sessionRegistry(sessionRegistry)
|
||||
.expiredUrl("/login?logout=true");
|
||||
}
|
||||
});
|
||||
SessionCreationPolicy.STATELESS));
|
||||
http.authenticationProvider(daoAuthenticationProvider());
|
||||
http.requestCache(requestCache -> requestCache.requestCache(new NullRequestCache()));
|
||||
|
||||
@@ -300,18 +289,7 @@ public class SecurityConfiguration {
|
||||
if (securityProperties.isOauth2Active()) {
|
||||
http.oauth2Login(
|
||||
oauth2 -> {
|
||||
// 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.
|
||||
*/
|
||||
oauth2.loginPage("/login")
|
||||
.successHandler(
|
||||
new CustomOAuth2AuthenticationSuccessHandler(
|
||||
loginAttemptService,
|
||||
@@ -345,12 +323,8 @@ public class SecurityConfiguration {
|
||||
.saml2Login(
|
||||
saml2 -> {
|
||||
try {
|
||||
// Only set login page for v1/Thymeleaf mode
|
||||
if (!v2Enabled) {
|
||||
saml2.loginPage("/saml2");
|
||||
}
|
||||
|
||||
saml2.relyingPartyRegistrationRepository(
|
||||
saml2.loginPage("/login")
|
||||
.relyingPartyRegistrationRepository(
|
||||
saml2RelyingPartyRegistrations)
|
||||
.authenticationManager(
|
||||
new ProviderManager(authenticationProvider))
|
||||
@@ -360,7 +334,8 @@ public class SecurityConfiguration {
|
||||
securityProperties.getSaml2(),
|
||||
userService,
|
||||
jwtService,
|
||||
licenseSettingsService))
|
||||
licenseSettingsService,
|
||||
applicationProperties))
|
||||
.failureHandler(
|
||||
new CustomSaml2AuthenticationFailureHandler())
|
||||
.authenticationRequestResolver(
|
||||
@@ -369,7 +344,8 @@ public class SecurityConfiguration {
|
||||
log.error("Error configuring SAML 2 login", e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
})
|
||||
.saml2Metadata(metadata -> {});
|
||||
}
|
||||
} else {
|
||||
log.debug("Login is not enabled.");
|
||||
|
||||
+4
-1
@@ -244,10 +244,13 @@ public class AuthController {
|
||||
userMap.put("username", user.getUsername());
|
||||
userMap.put("role", user.getRolesAsString());
|
||||
userMap.put("enabled", user.isEnabled());
|
||||
userMap.put(
|
||||
"authenticationType",
|
||||
user.getAuthenticationType()); // Expose authentication type for SSO detection
|
||||
|
||||
// Add metadata for OAuth compatibility
|
||||
Map<String, Object> appMetadata = new HashMap<>();
|
||||
appMetadata.put("provider", user.getAuthenticationType()); // Default to email provider
|
||||
appMetadata.put("provider", user.getAuthenticationType());
|
||||
userMap.put("app_metadata", appMetadata);
|
||||
|
||||
return userMap;
|
||||
|
||||
+8
-18
@@ -26,6 +26,7 @@ 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;
|
||||
@@ -39,6 +40,7 @@ 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;
|
||||
@@ -47,19 +49,6 @@ 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)
|
||||
@@ -68,7 +57,11 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
if (isStaticResource(request.getContextPath(), request.getRequestURI())) {
|
||||
|
||||
String requestURI = request.getRequestURI();
|
||||
String contextPath = request.getContextPath();
|
||||
|
||||
if (isStaticResource(contextPath, requestURI)) {
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
@@ -77,10 +70,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
String jwtToken = jwtService.extractToken(request);
|
||||
|
||||
if (jwtToken == null) {
|
||||
// Allow specific auth endpoints to pass through without JWT
|
||||
String requestURI = request.getRequestURI();
|
||||
String contextPath = request.getContextPath();
|
||||
|
||||
// Allow auth endpoints to pass through without JWT
|
||||
if (!isPublicAuthEndpoint(requestURI, contextPath)) {
|
||||
// For API requests, return 401 JSON
|
||||
String acceptHeader = request.getHeader("Accept");
|
||||
|
||||
-18
@@ -241,24 +241,6 @@ 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"),
|
||||
|
||||
+40
-17
@@ -51,6 +51,7 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
private final JwtServiceInterface jwtService;
|
||||
private final stirling.software.proprietary.service.UserLicenseSettingsService
|
||||
licenseSettingsService;
|
||||
private final ApplicationProperties applicationProperties;
|
||||
|
||||
@Override
|
||||
@Audited(type = AuditEventType.USER_LOGIN, level = AuditLevel.BASIC)
|
||||
@@ -77,8 +78,8 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
log.warn(
|
||||
"SAML2 login blocked for existing user '{}' - not eligible (not grandfathered and no ENTERPRISE license)",
|
||||
username);
|
||||
response.sendRedirect(
|
||||
request.getContextPath() + "/logout?saml2RequiresLicense=true");
|
||||
String origin = resolveOrigin(request);
|
||||
response.sendRedirect(origin + "/logout?saml2RequiresLicense=true");
|
||||
return;
|
||||
}
|
||||
} else if (!licenseSettingsService.isSamlEligible(null)) {
|
||||
@@ -86,8 +87,8 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
log.warn(
|
||||
"SAML2 login blocked for new user '{}' - not eligible (no ENTERPRISE license for auto-creation)",
|
||||
username);
|
||||
response.sendRedirect(
|
||||
request.getContextPath() + "/logout?saml2RequiresLicense=true");
|
||||
String origin = resolveOrigin(request);
|
||||
response.sendRedirect(origin + "/logout?saml2RequiresLicense=true");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -144,20 +145,28 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
log.debug(
|
||||
"User {} exists with password but is not SSO user, redirecting to logout",
|
||||
username);
|
||||
response.sendRedirect(
|
||||
contextPath + "/logout?oAuth2AuthenticationErrorWeb=true");
|
||||
String origin = resolveOrigin(request);
|
||||
response.sendRedirect(origin + "/logout?oAuth2AuthenticationErrorWeb=true");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!userExists || saml2Properties.getBlockRegistration()) {
|
||||
log.debug("Registration blocked for new user: {}", username);
|
||||
response.sendRedirect(
|
||||
contextPath + "/login?errorOAuth=oAuth2AdminBlockedUser");
|
||||
// Block new users only if: blockRegistration is true OR autoCreateUser is false
|
||||
if (!userExists
|
||||
&& (saml2Properties.getBlockRegistration()
|
||||
|| !saml2Properties.getAutoCreateUser())) {
|
||||
log.debug(
|
||||
"Registration blocked for new user '{}' (blockRegistration: {}, autoCreateUser: {})",
|
||||
username,
|
||||
saml2Properties.getBlockRegistration(),
|
||||
saml2Properties.getAutoCreateUser());
|
||||
String origin = resolveOrigin(request);
|
||||
response.sendRedirect(origin + "/login?errorOAuth=oAuth2AdminBlockedUser");
|
||||
return;
|
||||
}
|
||||
if (!userExists && licenseSettingsService.wouldExceedLimit(1)) {
|
||||
response.sendRedirect(contextPath + "/logout?maxUsersReached=true");
|
||||
String origin = resolveOrigin(request);
|
||||
response.sendRedirect(origin + "/logout?maxUsersReached=true");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -222,16 +231,30 @@ public class CustomSaml2AuthenticationSuccessHandler
|
||||
String contextPath,
|
||||
String jwt) {
|
||||
String redirectPath = resolveRedirectPath(request, contextPath);
|
||||
String origin =
|
||||
resolveForwardedOrigin(request)
|
||||
.orElseGet(
|
||||
() ->
|
||||
resolveOriginFromReferer(request)
|
||||
.orElseGet(() -> buildOriginFromRequest(request)));
|
||||
String origin = resolveOrigin(request);
|
||||
clearRedirectCookie(response);
|
||||
return origin + redirectPath + "#access_token=" + jwt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the origin (frontend URL) for redirects. First checks system.frontendUrl from config,
|
||||
* then falls back to detecting from request headers.
|
||||
*/
|
||||
private String resolveOrigin(HttpServletRequest request) {
|
||||
// First check if frontendUrl is configured
|
||||
String configuredFrontendUrl = applicationProperties.getSystem().getFrontendUrl();
|
||||
if (configuredFrontendUrl != null && !configuredFrontendUrl.trim().isEmpty()) {
|
||||
return configuredFrontendUrl.trim();
|
||||
}
|
||||
|
||||
// Fall back to auto-detection from request headers
|
||||
return resolveForwardedOrigin(request)
|
||||
.orElseGet(
|
||||
() ->
|
||||
resolveOriginFromReferer(request)
|
||||
.orElseGet(() -> buildOriginFromRequest(request)));
|
||||
}
|
||||
|
||||
private String resolveRedirectPath(HttpServletRequest request, String contextPath) {
|
||||
return extractRedirectPathFromCookie(request)
|
||||
.filter(path -> path.startsWith("/"))
|
||||
|
||||
+83
-11
@@ -41,25 +41,92 @@ public class Saml2Configuration {
|
||||
@ConditionalOnProperty(name = "security.saml2.enabled", havingValue = "true")
|
||||
public RelyingPartyRegistrationRepository relyingPartyRegistrations() throws Exception {
|
||||
SAML2 samlConf = applicationProperties.getSecurity().getSaml2();
|
||||
X509Certificate idpCert = CertificateUtils.readCertificate(samlConf.getIdpCert());
|
||||
|
||||
log.info(
|
||||
"Initializing SAML2 configuration with registration ID: {}",
|
||||
samlConf.getRegistrationId());
|
||||
|
||||
// Load IdP certificate
|
||||
X509Certificate idpCert;
|
||||
try {
|
||||
Resource idpCertResource = samlConf.getIdpCert();
|
||||
log.info("Loading IdP certificate from: {}", idpCertResource.getDescription());
|
||||
if (!idpCertResource.exists()) {
|
||||
log.error(
|
||||
"SAML2 IdP certificate not found at: {}", idpCertResource.getDescription());
|
||||
throw new IllegalStateException(
|
||||
"SAML2 IdP certificate file does not exist: "
|
||||
+ idpCertResource.getDescription());
|
||||
}
|
||||
idpCert = CertificateUtils.readCertificate(idpCertResource);
|
||||
log.info(
|
||||
"Successfully loaded IdP certificate. Subject: {}",
|
||||
idpCert.getSubjectX500Principal().getName());
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to load SAML2 IdP certificate: {}", e.getMessage(), e);
|
||||
throw new IllegalStateException("Failed to load SAML2 IdP certificate", e);
|
||||
}
|
||||
|
||||
Saml2X509Credential verificationCredential = Saml2X509Credential.verification(idpCert);
|
||||
|
||||
// Load SP private key and certificate
|
||||
Resource privateKeyResource = samlConf.getPrivateKey();
|
||||
Resource certificateResource = samlConf.getSpCert();
|
||||
Saml2X509Credential signingCredential =
|
||||
new Saml2X509Credential(
|
||||
CertificateUtils.readPrivateKey(privateKeyResource),
|
||||
CertificateUtils.readCertificate(certificateResource),
|
||||
Saml2X509CredentialType.SIGNING);
|
||||
|
||||
log.info("Loading SP private key from: {}", privateKeyResource.getDescription());
|
||||
if (!privateKeyResource.exists()) {
|
||||
log.error("SAML2 SP private key not found at: {}", privateKeyResource.getDescription());
|
||||
throw new IllegalStateException(
|
||||
"SAML2 SP private key file does not exist: "
|
||||
+ privateKeyResource.getDescription());
|
||||
}
|
||||
|
||||
log.info("Loading SP certificate from: {}", certificateResource.getDescription());
|
||||
if (!certificateResource.exists()) {
|
||||
log.error(
|
||||
"SAML2 SP certificate not found at: {}", certificateResource.getDescription());
|
||||
throw new IllegalStateException(
|
||||
"SAML2 SP certificate file does not exist: "
|
||||
+ certificateResource.getDescription());
|
||||
}
|
||||
|
||||
Saml2X509Credential signingCredential;
|
||||
try {
|
||||
signingCredential =
|
||||
new Saml2X509Credential(
|
||||
CertificateUtils.readPrivateKey(privateKeyResource),
|
||||
CertificateUtils.readCertificate(certificateResource),
|
||||
Saml2X509CredentialType.SIGNING);
|
||||
log.info("Successfully loaded SP credentials");
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to load SAML2 SP credentials: {}", e.getMessage(), e);
|
||||
throw new IllegalStateException("Failed to load SAML2 SP credentials", e);
|
||||
}
|
||||
|
||||
// Get backend URL from configuration (for SAML endpoints)
|
||||
String backendUrl = applicationProperties.getSystem().getBackendUrl();
|
||||
if (backendUrl == null || backendUrl.isBlank()) {
|
||||
backendUrl = "{baseUrl}"; // Fallback to Spring's auto-resolution
|
||||
log.warn(
|
||||
"system.backendUrl not configured - SAML metadata will use request-based URLs. Set system.backendUrl for production use.");
|
||||
} else {
|
||||
log.info("Using configured backend URL for SAML: {}", backendUrl);
|
||||
}
|
||||
|
||||
String entityId =
|
||||
backendUrl + "/saml2/service-provider-metadata/" + samlConf.getRegistrationId();
|
||||
String acsLocation = backendUrl + "/login/saml2/sso/{registrationId}";
|
||||
String sloResponseLocation = backendUrl + "/login";
|
||||
|
||||
RelyingPartyRegistration rp =
|
||||
RelyingPartyRegistration.withRegistrationId(samlConf.getRegistrationId())
|
||||
.signingX509Credentials(c -> c.add(signingCredential))
|
||||
.entityId(samlConf.getIdpIssuer())
|
||||
.entityId(entityId)
|
||||
.singleLogoutServiceBinding(Saml2MessageBinding.POST)
|
||||
.singleLogoutServiceLocation(samlConf.getIdpSingleLogoutUrl())
|
||||
.singleLogoutServiceResponseLocation("http://localhost:8080/login")
|
||||
.singleLogoutServiceResponseLocation(sloResponseLocation)
|
||||
.assertionConsumerServiceBinding(Saml2MessageBinding.POST)
|
||||
.assertionConsumerServiceLocation(
|
||||
"{baseUrl}/login/saml2/sso/{registrationId}")
|
||||
.assertionConsumerServiceLocation(acsLocation)
|
||||
.authnRequestsSigned(true)
|
||||
.assertingPartyMetadata(
|
||||
metadata ->
|
||||
@@ -75,9 +142,14 @@ public class Saml2Configuration {
|
||||
.singleLogoutServiceLocation(
|
||||
samlConf.getIdpSingleLogoutUrl())
|
||||
.singleLogoutServiceResponseLocation(
|
||||
"http://localhost:8080/login")
|
||||
sloResponseLocation)
|
||||
.wantAuthnRequestsSigned(true))
|
||||
.build();
|
||||
|
||||
log.info(
|
||||
"SAML2 configuration initialized successfully. Registration ID: {}, IdP: {}",
|
||||
samlConf.getRegistrationId(),
|
||||
samlConf.getIdpIssuer());
|
||||
return new InMemoryRelyingPartyRegistrationRepository(rp);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -226,7 +226,8 @@ public class EmailService {
|
||||
|
||||
@Async
|
||||
public void sendPasswordChangedNotification(
|
||||
String to, String username, String newPassword, String loginUrl) throws MessagingException {
|
||||
String to, String username, String newPassword, String loginUrl)
|
||||
throws MessagingException {
|
||||
String subject = "Your Stirling PDF password has been updated";
|
||||
|
||||
String passwordSection =
|
||||
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
package stirling.software.proprietary.service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.service.LineArtConversionService;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class ImageMagickLineArtConversionService implements LineArtConversionService {
|
||||
|
||||
@Override
|
||||
public PDImageXObject convertImageToLineArt(
|
||||
PDDocument doc, PDImageXObject originalImage, double threshold, int edgeLevel)
|
||||
throws IOException {
|
||||
|
||||
Path inputImage = Files.createTempFile("lineart_image_input_", ".png");
|
||||
Path outputImage = Files.createTempFile("lineart_image_output_", ".tiff");
|
||||
|
||||
try {
|
||||
ImageIO.write(originalImage.getImage(), "png", inputImage.toFile());
|
||||
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("magick");
|
||||
command.add(inputImage.toString());
|
||||
command.add("-colorspace");
|
||||
command.add("Gray");
|
||||
|
||||
// Edge-aware line art conversion using ImageMagick's built-in operators.
|
||||
// -edge/-negate/-normalize are standard convert options (IM v6+/v7) that
|
||||
// accentuate outlines before thresholding to a bilevel image.
|
||||
command.add("-edge");
|
||||
command.add(String.valueOf(edgeLevel));
|
||||
command.add("-negate");
|
||||
command.add("-normalize");
|
||||
|
||||
command.add("-type");
|
||||
command.add("Bilevel");
|
||||
command.add("-threshold");
|
||||
command.add(String.format(Locale.ROOT, "%.1f%%", threshold));
|
||||
command.add("-compress");
|
||||
command.add("Group4");
|
||||
command.add(outputImage.toString());
|
||||
|
||||
ProcessExecutorResult result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.IMAGEMAGICK)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
if (result.getRc() != 0) {
|
||||
log.warn(
|
||||
"ImageMagick line art conversion failed with return code: {}",
|
||||
result.getRc());
|
||||
throw new IOException("ImageMagick line art conversion failed");
|
||||
}
|
||||
|
||||
byte[] convertedBytes = Files.readAllBytes(outputImage);
|
||||
return PDImageXObject.createFromByteArray(
|
||||
doc, convertedBytes, originalImage.getCOSObject().toString());
|
||||
} catch (Exception e) {
|
||||
log.warn("ImageMagick line art conversion failed", e);
|
||||
throw new IOException("ImageMagick line art conversion failed", e);
|
||||
} finally {
|
||||
Files.deleteIfExists(inputImage);
|
||||
Files.deleteIfExists(outputImage);
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
-35
@@ -177,6 +177,13 @@ public class UserLicenseSettingsService {
|
||||
*/
|
||||
@Transactional
|
||||
public void grandfatherExistingOAuthUsers() {
|
||||
// Only grandfather users if this is a V1→V2 upgrade, not a fresh V2 install
|
||||
Boolean isNewServer = applicationProperties.getAutomaticallyGenerated().getIsNewServer();
|
||||
if (Boolean.TRUE.equals(isNewServer)) {
|
||||
log.info("Fresh V2 installation detected - skipping OAuth user grandfathering");
|
||||
return;
|
||||
}
|
||||
|
||||
UserLicenseSettings settings = getOrCreateSettings();
|
||||
|
||||
// Check if we've already run this migration
|
||||
@@ -348,30 +355,22 @@ public class UserLicenseSettingsService {
|
||||
String username = (user != null) ? user.getUsername() : "<new user>";
|
||||
log.info("OAuth eligibility check for user: {}", username);
|
||||
|
||||
// Grandfathered users always have OAuth access
|
||||
if (user != null && user.isOauthGrandfathered()) {
|
||||
log.debug("User {} is grandfathered for OAuth", user.getUsername());
|
||||
// Check license first - if paying, they're eligible (no need to check grandfathering)
|
||||
boolean hasPaid = hasPaidLicense();
|
||||
if (hasPaid) {
|
||||
log.debug("User {} eligible for OAuth via paid license", username);
|
||||
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");
|
||||
// No license - check if grandfathered (fallback for V1 users)
|
||||
if (user != null && user.isOauthGrandfathered()) {
|
||||
log.info("User {} eligible for OAuth via grandfathering (no paid license)", username);
|
||||
return true;
|
||||
}
|
||||
|
||||
// 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;
|
||||
// Not grandfathered and no license
|
||||
log.info("User {} NOT eligible for OAuth: no paid license and not grandfathered", username);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -391,29 +390,26 @@ public class UserLicenseSettingsService {
|
||||
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);
|
||||
// Check license first - if paying, they're eligible (no need to check grandfathering)
|
||||
boolean hasEnterprise = hasEnterpriseLicense();
|
||||
if (hasEnterprise) {
|
||||
log.debug("User {} eligible for SAML2 via ENTERPRISE license", username);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (user != null) {
|
||||
// No license - check if grandfathered (fallback for V1 users)
|
||||
if (user != null && user.isOauthGrandfathered()) {
|
||||
log.info(
|
||||
"User {} is NOT grandfathered (isOauthGrandfathered={})",
|
||||
username,
|
||||
user.isOauthGrandfathered());
|
||||
} else {
|
||||
log.info("New user attempting SAML2 login - checking license requirement");
|
||||
"User {} eligible for SAML2 via grandfathering (no ENTERPRISE license)",
|
||||
username);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Users can use SAML only with ENTERPRISE license
|
||||
boolean hasEnterprise = hasEnterpriseLicense();
|
||||
// Not grandfathered and no license
|
||||
log.info(
|
||||
"SAML2 eligibility result: hasEnterpriseLicense={}, user={}, eligible={}",
|
||||
hasEnterprise,
|
||||
username,
|
||||
hasEnterprise);
|
||||
return hasEnterprise;
|
||||
"User {} NOT eligible for SAML2: no ENTERPRISE license and not grandfathered",
|
||||
username);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+4
@@ -33,6 +33,7 @@ class UserLicenseSettingsServiceTest {
|
||||
@Mock private UserService userService;
|
||||
@Mock private ApplicationProperties applicationProperties;
|
||||
@Mock private ApplicationProperties.Premium premium;
|
||||
@Mock private ApplicationProperties.AutomaticallyGenerated automaticallyGenerated;
|
||||
@Mock private LicenseKeyChecker licenseKeyChecker;
|
||||
@Mock private ObjectProvider<LicenseKeyChecker> licenseKeyCheckerProvider;
|
||||
|
||||
@@ -49,6 +50,9 @@ class UserLicenseSettingsServiceTest {
|
||||
mockSettings.setGrandfatheredUserSignature("80:test-signature");
|
||||
|
||||
when(applicationProperties.getPremium()).thenReturn(premium);
|
||||
when(applicationProperties.getAutomaticallyGenerated()).thenReturn(automaticallyGenerated);
|
||||
when(automaticallyGenerated.getIsNewServer())
|
||||
.thenReturn(false); // Default: not a new server
|
||||
when(settingsRepository.findSettings()).thenReturn(Optional.of(mockSettings));
|
||||
when(userService.getTotalUsersCount()).thenReturn(80L);
|
||||
when(settingsRepository.save(any(UserLicenseSettings.class)))
|
||||
|
||||
+49
-2
@@ -12,6 +12,8 @@ plugins {
|
||||
}
|
||||
|
||||
import com.github.jk1.license.render.*
|
||||
import groovy.json.JsonOutput
|
||||
import groovy.json.JsonSlurper
|
||||
|
||||
ext {
|
||||
springBootVersion = "3.5.6"
|
||||
@@ -57,7 +59,7 @@ repositories {
|
||||
|
||||
allprojects {
|
||||
group = 'stirling.software'
|
||||
version = '2.1.2'
|
||||
version = '2.1.5'
|
||||
|
||||
configurations.configureEach {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
@@ -65,6 +67,51 @@ 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}"
|
||||
@@ -314,7 +361,7 @@ tasks.named('bootRun') {
|
||||
tasks.named('build') {
|
||||
group = 'build'
|
||||
description = 'Delegates to :stirling-pdf:bootJar'
|
||||
dependsOn ':stirling-pdf:bootJar', 'buildRestartHelper'
|
||||
dependsOn ':stirling-pdf:bootJar', 'buildRestartHelper', 'syncAppVersion'
|
||||
|
||||
doFirst {
|
||||
println "Delegating to :stirling-pdf:bootJar"
|
||||
|
||||
@@ -105,6 +105,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
||||
gcompat \
|
||||
libc6-compat \
|
||||
libreoffice \
|
||||
imagemagick \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
# OCR MY PDF
|
||||
|
||||
@@ -81,6 +81,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
||||
libc6-compat \
|
||||
libreoffice \
|
||||
ghostscript \
|
||||
imagemagick \
|
||||
fontforge \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
|
||||
@@ -74,6 +74,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
||||
libc6-compat \
|
||||
libreoffice \
|
||||
ghostscript \
|
||||
imagemagick \
|
||||
fontforge \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
|
||||
@@ -99,6 +99,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
||||
libc6-compat \
|
||||
libreoffice \
|
||||
ghostscript \
|
||||
imagemagick \
|
||||
fontforge \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
|
||||
@@ -101,6 +101,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
||||
libc6-compat \
|
||||
libreoffice \
|
||||
ghostscript \
|
||||
imagemagick \
|
||||
fontforge \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
|
||||
Generated
+94
-41
@@ -51,6 +51,7 @@
|
||||
"@tauri-apps/plugin-http": "^2.5.4",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"axios": "^1.12.2",
|
||||
"framer-motion": "^12.23.26",
|
||||
"globals": "^16.4.0",
|
||||
"i18next": "^25.5.2",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
@@ -105,6 +106,7 @@
|
||||
"typescript": "^5.9.2",
|
||||
"typescript-eslint": "^8.44.1",
|
||||
"vite": "^7.1.7",
|
||||
"vite-plugin-static-copy": "^3.1.4",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.2.4"
|
||||
}
|
||||
@@ -456,7 +458,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
@@ -500,7 +501,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
@@ -581,7 +581,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 +680,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 +696,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 +713,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 +766,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 +800,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 +836,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 +911,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 +1066,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 +1109,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 +2139,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 +2189,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 +2256,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 +3188,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 +3306,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 +4083,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 +4411,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 +4421,6 @@
|
||||
"integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.2.0"
|
||||
}
|
||||
@@ -4506,7 +4490,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 +5203,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 +5213,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 +5224,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 +5237,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 +5264,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 +5671,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 +5948,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"baseline-browser-mapping": "^2.8.19",
|
||||
"caniuse-lite": "^1.0.30001751",
|
||||
@@ -7009,8 +6995,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 +7390,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 +7560,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 +7726,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 +7792,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"
|
||||
}
|
||||
@@ -8271,6 +8256,37 @@
|
||||
"url": "https://github.com/sponsors/rawify"
|
||||
}
|
||||
},
|
||||
"node_modules/framer-motion": {
|
||||
"version": "12.23.26",
|
||||
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.26.tgz",
|
||||
"integrity": "sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==",
|
||||
"dependencies": {
|
||||
"motion-dom": "^12.23.23",
|
||||
"motion-utils": "^12.23.6",
|
||||
"tslib": "^2.4.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@emotion/is-prop-valid": "*",
|
||||
"react": "^18.0.0 || ^19.0.0",
|
||||
"react-dom": "^18.0.0 || ^19.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@emotion/is-prop-valid": {
|
||||
"optional": true
|
||||
},
|
||||
"react": {
|
||||
"optional": true
|
||||
},
|
||||
"react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/framer-motion/node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
|
||||
@@ -8898,7 +8914,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.27.6"
|
||||
},
|
||||
@@ -9375,6 +9390,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 +9711,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 +10297,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",
|
||||
@@ -10677,6 +10693,19 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/motion-dom": {
|
||||
"version": "12.23.23",
|
||||
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
|
||||
"integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
|
||||
"dependencies": {
|
||||
"motion-utils": "^12.23.6"
|
||||
}
|
||||
},
|
||||
"node_modules/motion-utils": {
|
||||
"version": "12.23.6",
|
||||
"resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
|
||||
"integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
@@ -11093,6 +11122,19 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/p-map": {
|
||||
"version": "7.0.4",
|
||||
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
|
||||
"integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/pac-proxy-agent": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
|
||||
@@ -11428,7 +11470,6 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.11",
|
||||
"picocolors": "^1.1.1",
|
||||
@@ -11708,7 +11749,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 +12131,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 +12140,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 +13651,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 +13860,6 @@
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -14123,7 +14161,6 @@
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
@@ -14205,7 +14242,6 @@
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"napi-postinstall": "^0.3.0"
|
||||
},
|
||||
@@ -14410,7 +14446,6 @@
|
||||
"integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.5.0",
|
||||
@@ -14503,6 +14538,25 @@
|
||||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/vite-plugin-static-copy": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz",
|
||||
"integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chokidar": "^3.6.0",
|
||||
"p-map": "^7.0.3",
|
||||
"picocolors": "^1.1.1",
|
||||
"tinyglobby": "^0.2.15"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.0.0 || >=20.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vite-tsconfig-paths": {
|
||||
"version": "5.1.4",
|
||||
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",
|
||||
@@ -14562,7 +14616,6 @@
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -14576,7 +14629,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 +15240,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",
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"@tauri-apps/plugin-http": "^2.5.4",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"axios": "^1.12.2",
|
||||
"framer-motion": "^12.23.26",
|
||||
"globals": "^16.4.0",
|
||||
"i18next": "^25.5.2",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
@@ -152,6 +153,7 @@
|
||||
"typescript": "^5.9.2",
|
||||
"typescript-eslint": "^8.44.1",
|
||||
"vite": "^7.1.7",
|
||||
"vite-plugin-static-copy": "^3.1.4",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.2.4"
|
||||
},
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "استخراج"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "اكتب أو الصق عناوين البريد الإلكتروني أدناه مفصولة بفواصل. سيتلقى المستخدمون بيانات اعتماد تسجيل الدخول عبر البريد الإلكتروني."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "سجّل الدخول بحساب Stirling الخاص بك"
|
||||
[setup.selfhosted]
|
||||
title = "سجّل الدخول إلى الخادم"
|
||||
subtitle = "أدخل بيانات اعتماد الخادم"
|
||||
link = "أو الاتصال بحساب مُستضاف ذاتيًا"
|
||||
|
||||
[setup.server]
|
||||
title = "الاتصال بالخادم"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "تسجيل الدخول"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "وصول مبكر"
|
||||
reset = "إعادة تعيين التغييرات"
|
||||
downloadJson = "تنزيل JSON"
|
||||
generatePdf = "توليد PDF"
|
||||
saveChanges = "حفظ التغييرات"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ضبط النص تلقائياً ليتناسب مع الصناديق"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "هذا العارض بنسخة ألفا ولا يزال يتطور—ق
|
||||
[pdfTextEditor.empty]
|
||||
title = "لم يتم تحميل مستند"
|
||||
subtitle = "حمّل ملف PDF أو JSON لبدء تحرير محتوى النص."
|
||||
dropzone = "اسحب وأفلت ملف PDF أو JSON هنا، أو انقر للاستعراض"
|
||||
dropzoneWithFiles = "حدد ملفًا من علامة تبويب الملفات، أو اسحب وأفلت ملف PDF أو JSON هنا، أو انقر للاستعراض"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "مرحباً بك في محرر نصوص PDF (وصول مبكر)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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 = "извличане"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "Въведете или поставете имейли по-долу, разделени със запетаи. Потребителите ще получат данни за вход по имейл."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Впишете се с вашия Stirling акаунт"
|
||||
[setup.selfhosted]
|
||||
title = "Впишете се в сървъра"
|
||||
subtitle = "Въведете своите данни за сървъра"
|
||||
link = "или се свържете със самостоятелно хостван акаунт"
|
||||
|
||||
[setup.server]
|
||||
title = "Свързване към сървър"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "Вписване"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Ранен достъп"
|
||||
reset = "Отмени промените"
|
||||
downloadJson = "Изтегли JSON"
|
||||
generatePdf = "Генерирай PDF"
|
||||
saveChanges = "Запази промените"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Авто-мащабиране на текст за напасване в полетата"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "Този алфа визуализатор все още се разв
|
||||
[pdfTextEditor.empty]
|
||||
title = "Няма зареден документ"
|
||||
subtitle = "Заредете PDF или JSON файл, за да започнете да редактирате текстовото съдържание."
|
||||
dropzone = "Плъзнете и пуснете тук PDF или JSON файл или щракнете, за да прегледате"
|
||||
dropzoneWithFiles = "Изберете файл от раздела Файлове или плъзнете и пуснете тук PDF или JSON файл, или щракнете, за да прегледате"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Добре дошли в PDF Text Editor (ранен достъп)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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ó"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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í"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -4258,11 +4343,11 @@ label = "Issuer-URL"
|
||||
description = "OAuth2-udbyderens issuer-URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "Klient-ID"
|
||||
description = "OAuth2 Client ID fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "Klienthemmelighed"
|
||||
description = "OAuth2 Client Secret fra din udbyder"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
@@ -6009,8 +6131,8 @@ tags = "text,anmerkung,beschriftung"
|
||||
applySignatures = "Text anwenden"
|
||||
|
||||
[addText.text]
|
||||
name = "Textinhalt"
|
||||
placeholder = "Geben Sie den hinzuzufügenden Text ein"
|
||||
name = "Text"
|
||||
placeholder = "Text eingeben"
|
||||
fontLabel = "Schriftart"
|
||||
fontSizeLabel = "Schriftgröße"
|
||||
fontSizePlaceholder = "Schriftgröße eingeben oder wählen (8-200)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "εξαγωγή"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Συνδεθείτε με τον λογαριασμό Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Σύνδεση στον διακομιστή"
|
||||
subtitle = "Εισαγάγετε τα διαπιστευτήρια του διακομιστή σας"
|
||||
link = "ή συνδεθείτε σε έναν self-hosted λογαριασμό"
|
||||
|
||||
[setup.server]
|
||||
title = "Σύνδεση σε διακομιστή"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "Σύνδεση"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Πρόωρη πρόσβαση"
|
||||
reset = "Επαναφορά αλλαγών"
|
||||
downloadJson = "Λήψη JSON"
|
||||
generatePdf = "Δημιουργία PDF"
|
||||
saveChanges = "Αποθήκευση αλλαγών"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Αυτόματη προσαρμογή κειμένου στα πλαίσια"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "Αυτός ο προβολέας άλφα εξελίσσεται ακό
|
||||
[pdfTextEditor.empty]
|
||||
title = "Δεν φορτώθηκε έγγραφο"
|
||||
subtitle = "Φορτώστε ένα αρχείο PDF ή JSON για να ξεκινήσετε την επεξεργασία κειμένου."
|
||||
dropzone = "Σύρετε και αποθέστε εδώ ένα αρχείο PDF ή JSON, ή κάντε κλικ για περιήγηση"
|
||||
dropzoneWithFiles = "Επιλέξτε ένα αρχείο από την καρτέλα Αρχεία, ή σύρετε και αποθέστε εδώ ένα αρχείο PDF ή JSON, ή κάντε κλικ για περιήγηση"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Καλώς ορίσατε στο PDF Text Editor (Πρώιμη πρόσβαση)"
|
||||
|
||||
@@ -312,10 +312,10 @@ yamlAdvert = "Stirling PDF Pro supports YAML configuration files and other SSO f
|
||||
ssoAdvert = "Looking for more user management features? Check out Stirling PDF Pro"
|
||||
|
||||
[analytics]
|
||||
title = "Do you want make Stirling PDF better?"
|
||||
paragraph1 = "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents."
|
||||
title = "Do you want to help make Stirling PDF better?"
|
||||
paragraph1 = "Stirling PDF has opt-in analytics to help us improve the product. We do not track any personal information or file contents."
|
||||
paragraph2 = "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better."
|
||||
learnMore = "Learn more"
|
||||
learnMore = "Learn more about our analytics"
|
||||
enable = "Enable analytics"
|
||||
disable = "Disable analytics"
|
||||
settings = "You can change the settings for analytics in the config/settings.yml file"
|
||||
@@ -340,6 +340,10 @@ advance = "Advanced"
|
||||
edit = "View & Edit"
|
||||
popular = "Popular"
|
||||
|
||||
[footer]
|
||||
discord = "Discord"
|
||||
issues = "GitHub"
|
||||
|
||||
[settings.preferences]
|
||||
title = "Preferences"
|
||||
|
||||
@@ -435,6 +439,25 @@ latestVersion = "Latest Version"
|
||||
checkForUpdates = "Check for Updates"
|
||||
viewDetails = "View Details"
|
||||
|
||||
[settings.security]
|
||||
title = "Security"
|
||||
description = "Update your password to keep your account secure."
|
||||
|
||||
[settings.security.password]
|
||||
subtitle = "Change your password. You will be logged out after updating."
|
||||
required = "All fields are required."
|
||||
mismatch = "New passwords do not match."
|
||||
error = "Unable to update password. Please verify your current password and try again."
|
||||
success = "Password updated successfully. Please sign in again."
|
||||
ssoDisabled = "Password changes are managed by your identity provider."
|
||||
current = "Current password"
|
||||
currentPlaceholder = "Enter your current password"
|
||||
new = "New password"
|
||||
newPlaceholder = "Enter a new password"
|
||||
confirm = "Confirm new password"
|
||||
confirmPlaceholder = "Re-enter your new password"
|
||||
update = "Update password"
|
||||
|
||||
[settings.hotkeys]
|
||||
title = "Keyboard Shortcuts"
|
||||
description = "Customize keyboard shortcuts for quick tool access. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel."
|
||||
@@ -488,11 +511,16 @@ low = "Low"
|
||||
title = "Change Credentials"
|
||||
header = "Update Your Account Details"
|
||||
changePassword = "You are using default login credentials. Please enter a new password"
|
||||
ssoManaged = "Your account is managed by your identity provider."
|
||||
newUsername = "New Username"
|
||||
oldPassword = "Current Password"
|
||||
newPassword = "New Password"
|
||||
confirmNewPassword = "Confirm New Password"
|
||||
submit = "Submit Changes"
|
||||
credsUpdated = "Account updated"
|
||||
description = "Changes saved. Please log in again."
|
||||
error = "Unable to update username. Please verify your password and try again."
|
||||
changeUsername = "Update your username. You will be logged out after updating."
|
||||
|
||||
[account]
|
||||
title = "Account Settings"
|
||||
@@ -708,6 +736,11 @@ tags = "signature,autograph"
|
||||
title = "Sign"
|
||||
desc = "Adds signature to PDF by drawing, text or image"
|
||||
|
||||
[home.annotate]
|
||||
tags = "annotate,highlight,draw"
|
||||
title = "Annotate"
|
||||
desc = "Highlight, draw, add notes and shapes in the viewer"
|
||||
|
||||
[home.flatten]
|
||||
tags = "simplify,remove,interactive"
|
||||
title = "Flatten"
|
||||
@@ -3703,6 +3736,16 @@ filesize = "File Size"
|
||||
[compress.grayscale]
|
||||
label = "Apply Grayscale for Compression"
|
||||
|
||||
[compress.lineArt]
|
||||
label = "Convert images to line art"
|
||||
description = "Uses ImageMagick to reduce pages to high-contrast black and white for maximum size reduction."
|
||||
unavailable = "ImageMagick is not installed or enabled on this server"
|
||||
detailLevel = "Detail level"
|
||||
edgeEmphasis = "Edge emphasis"
|
||||
edgeLow = "Gentle"
|
||||
edgeMedium = "Balanced"
|
||||
edgeHigh = "Strong"
|
||||
|
||||
[compress.tooltip.header]
|
||||
title = "Compress Settings Overview"
|
||||
|
||||
@@ -3720,6 +3763,10 @@ bullet2 = "Higher values reduce file size"
|
||||
title = "Grayscale"
|
||||
text = "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents."
|
||||
|
||||
[compress.tooltip.lineArt]
|
||||
title = "Line Art"
|
||||
text = "Convert pages to high-contrast black and white using ImageMagick. Use detail level to control how much content becomes black, and edge emphasis to control how aggressively edges are detected."
|
||||
|
||||
[compress.error]
|
||||
failed = "An error occurred while compressing the PDF."
|
||||
|
||||
@@ -3971,23 +4018,92 @@ deleteSelected = "Delete Selected Pages"
|
||||
closePdf = "Close PDF"
|
||||
exportAll = "Export PDF"
|
||||
downloadSelected = "Download Selected Files"
|
||||
downloadAll = "Download All"
|
||||
saveAll = "Save All"
|
||||
annotations = "Annotations"
|
||||
exportSelected = "Export Selected Pages"
|
||||
saveChanges = "Save Changes"
|
||||
toggleTheme = "Toggle Theme"
|
||||
toggleBookmarks = "Toggle Bookmarks"
|
||||
language = "Language"
|
||||
toggleAnnotations = "Toggle Annotations Visibility"
|
||||
search = "Search PDF"
|
||||
panMode = "Pan Mode"
|
||||
rotateLeft = "Rotate Left"
|
||||
rotateRight = "Rotate Right"
|
||||
toggleSidebar = "Toggle Sidebar"
|
||||
exportSelected = "Export Selected Pages"
|
||||
toggleAnnotations = "Toggle Annotations Visibility"
|
||||
annotationMode = "Toggle Annotation Mode"
|
||||
toggleBookmarks = "Toggle Bookmarks"
|
||||
print = "Print PDF"
|
||||
draw = "Draw"
|
||||
save = "Save"
|
||||
saveChanges = "Save Changes"
|
||||
downloadAll = "Download All"
|
||||
saveAll = "Save All"
|
||||
|
||||
[textAlign]
|
||||
left = "Left"
|
||||
center = "Center"
|
||||
right = "Right"
|
||||
|
||||
[annotation]
|
||||
title = "Annotate"
|
||||
desc = "Use highlight, pen, text, and notes. Changes stay live—no flattening required."
|
||||
highlight = "Highlight"
|
||||
pen = "Pen"
|
||||
text = "Text box"
|
||||
note = "Note"
|
||||
rectangle = "Rectangle"
|
||||
ellipse = "Ellipse"
|
||||
select = "Select"
|
||||
exit = "Exit annotation mode"
|
||||
strokeWidth = "Width"
|
||||
opacity = "Opacity"
|
||||
strokeOpacity = "Stroke Opacity"
|
||||
fillOpacity = "Fill Opacity"
|
||||
fontSize = "Font size"
|
||||
chooseColor = "Choose colour"
|
||||
color = "Colour"
|
||||
strokeColor = "Stroke Colour"
|
||||
fillColor = "Fill Colour"
|
||||
underline = "Underline"
|
||||
strikeout = "Strikeout"
|
||||
squiggly = "Squiggly"
|
||||
inkHighlighter = "Freehand Highlighter"
|
||||
freehandHighlighter = "Freehand Highlighter"
|
||||
square = "Square"
|
||||
circle = "Circle"
|
||||
polygon = "Polygon"
|
||||
line = "Line"
|
||||
stamp = "Add Image"
|
||||
textMarkup = "Text Markup"
|
||||
drawing = "Drawing"
|
||||
shapes = "Shapes"
|
||||
notesStamps = "Notes & Stamps"
|
||||
settings = "Settings"
|
||||
borderOn = "Border: On"
|
||||
borderOff = "Border: Off"
|
||||
editInk = "Edit Pen"
|
||||
editLine = "Edit Line"
|
||||
editNote = "Edit Note"
|
||||
editText = "Edit Text Box"
|
||||
editTextMarkup = "Edit Text Markup"
|
||||
editSelected = "Edit Annotation"
|
||||
editSquare = "Edit Square"
|
||||
editCircle = "Edit Circle"
|
||||
editPolygon = "Edit Polygon"
|
||||
unsupportedType = "This annotation type is not fully supported for editing."
|
||||
textAlignment = "Text Alignment"
|
||||
noteIcon = "Note Icon"
|
||||
imagePreview = "Preview"
|
||||
contents = "Text"
|
||||
backgroundColor = "Background colour"
|
||||
clearBackground = "Remove background"
|
||||
noBackground = "No background"
|
||||
stampSettings = "Stamp Settings"
|
||||
savingCopy = "Preparing download..."
|
||||
saveFailed = "Unable to save copy"
|
||||
saveReady = "Download ready"
|
||||
selectAndMove = "Select and Edit"
|
||||
editSelectDescription = "Click an existing annotation to edit its colour, opacity, text, or size."
|
||||
editStampHint = "To change the image, delete this stamp and add a new one."
|
||||
editSwitchToSelect = "Switch to Select & Edit to edit this annotation."
|
||||
undo = "Undo"
|
||||
redo = "Redo"
|
||||
applyChanges = "Apply Changes"
|
||||
|
||||
[search]
|
||||
title = "Search PDF"
|
||||
@@ -4038,12 +4154,20 @@ settings = "Settings"
|
||||
adminSettings = "Admin Settings"
|
||||
allTools = "Tools"
|
||||
reader = "Reader"
|
||||
tours = "Tours"
|
||||
showMeAround = "Show me around"
|
||||
|
||||
[quickAccess.toursTooltip]
|
||||
admin = "Watch walkthroughs here: Tools tour, New V2 layout tour, and the Admin tour."
|
||||
user = "Watch walkthroughs here: Tools tour and the New V2 layout tour."
|
||||
|
||||
[quickAccess.helpMenu]
|
||||
toolsTour = "Tools Tour"
|
||||
toolsTourDesc = "Learn what the tools can do"
|
||||
adminTour = "Admin Tour"
|
||||
adminTourDesc = "Explore admin settings & features"
|
||||
whatsNewTour = "See what's new in V2"
|
||||
whatsNewTourDesc = "Tour the updated layout"
|
||||
|
||||
[admin]
|
||||
error = "Error"
|
||||
@@ -5070,6 +5194,7 @@ loading = "Loading..."
|
||||
back = "Back"
|
||||
continue = "Continue"
|
||||
error = "Error"
|
||||
save = "Save"
|
||||
|
||||
[config.overview]
|
||||
title = "Application Configuration"
|
||||
@@ -5236,6 +5361,16 @@ finish = "Finish"
|
||||
startTour = "Start Tour"
|
||||
startTourDescription = "Take a guided tour of Stirling PDF's key features"
|
||||
|
||||
[onboarding.whatsNew]
|
||||
quickAccess = "Start at the <strong>Quick Access</strong> rail to jump between Reader, Automate, your files, and all the tours."
|
||||
leftPanel = "The left <strong>Tools</strong> panel lists everything you can do. Browse categories or search to find a tool quickly."
|
||||
fileUpload = "Use the <strong>Files</strong> button to upload or pick a recent PDF. We will load a sample so you can see the workspace."
|
||||
rightRail = "The <strong>Right Rail</strong> holds quick actions to select files, change theme or language, and download results."
|
||||
topBar = "The top bar lets you swap between <strong>Viewer</strong>, <strong>Page Editor</strong>, and <strong>Active Files</strong>."
|
||||
pageEditorView = "Switch to the Page Editor to reorder, rotate, or delete pages."
|
||||
activeFilesView = "Use Active Files to see everything you have open and pick what to work on."
|
||||
wrapUp = "That is what is new in V2. Open the <strong>Tours</strong> menu anytime to replay this, the Tools tour, or the Admin tour."
|
||||
|
||||
[onboarding.welcomeModal]
|
||||
title = "Welcome to Stirling PDF!"
|
||||
description = "Would you like to take a quick 1-minute tour to learn the key features and how to get started?"
|
||||
@@ -5256,6 +5391,10 @@ download = "Download →"
|
||||
showMeAround = "Show me around"
|
||||
skipTheTour = "Skip the tour"
|
||||
|
||||
[onboarding.tourOverview]
|
||||
title = "Tour Overview"
|
||||
body = "Stirling PDF V2 ships with dozens of tools and a refreshed layout. Take a quick tour to see what changed and where to find the features you need."
|
||||
|
||||
[onboarding.serverLicense]
|
||||
skip = "Skip for now"
|
||||
seePlans = "See Plans →"
|
||||
@@ -5569,6 +5708,28 @@ 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"
|
||||
@@ -5772,6 +5933,8 @@ notAvailable = "Audit system not available"
|
||||
notAvailableMessage = "The audit system is not configured or not available."
|
||||
disabled = "Audit logging is disabled"
|
||||
disabledMessage = "Enable audit logging in your application configuration to track system events."
|
||||
enterpriseRequired = "Enterprise License Required"
|
||||
enterpriseRequiredMessage = "The audit logging system is an enterprise feature. Please upgrade to an enterprise license to access audit logs and analytics."
|
||||
|
||||
[audit.error]
|
||||
title = "Error loading audit system"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Sarbide goiztiarra"
|
||||
reset = "Aldaketak berrezarri"
|
||||
downloadJson = "JSON deskargatu"
|
||||
generatePdf = "PDF sortu"
|
||||
saveChanges = "Gorde aldaketak"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Testua automatikoki eskalatu kutxetara egokitzeko"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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 = "استخراج"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "در زیر ایمیلها را تایپ یا بچسبانید و با کاما جدا کنید. به کاربران اطلاعات ورود از طریق ایمیل ارسال میشود."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "با حساب Stirling خود وارد شوید"
|
||||
[setup.selfhosted]
|
||||
title = "ورود به سرور"
|
||||
subtitle = "اطلاعات کاربری سرور خود را وارد کنید"
|
||||
link = "یا به یک حساب خودمیزبان متصل شوید"
|
||||
|
||||
[setup.server]
|
||||
title = "اتصال به سرور"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "ورود"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "دسترسی زودهنگام"
|
||||
reset = "بازنشانی تغییرات"
|
||||
downloadJson = "دانلود JSON"
|
||||
generatePdf = "تولید PDF"
|
||||
saveChanges = "ذخیرهٔ تغییرات"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "مقیاس خودکار متن برای جا شدن در باکسها"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "این نمایشگر آلفا هنوز در حال تکامل است
|
||||
[pdfTextEditor.empty]
|
||||
title = "هیچ سندی بارگذاری نشده است"
|
||||
subtitle = "برای شروع ویرایش متن، یک فایل PDF یا JSON بارگذاری کنید."
|
||||
dropzone = "یک فایل PDF یا JSON را اینجا بکشید و رها کنید، یا برای مرور کلیک کنید"
|
||||
dropzoneWithFiles = "یک فایل را از برگهٔ فایلها انتخاب کنید، یا یک فایل PDF یا JSON را اینجا بکشید و رها کنید، یا برای مرور کلیک کنید"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "به ویرایشگر متن PDF (دسترسی زودهنگام) خوش آمدید"
|
||||
|
||||
@@ -1225,7 +1225,7 @@ odtExt = "Texte OpenDocument (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "Présentation OpenDocument (.odp)"
|
||||
txtExt = "Texte brut (.txt)"
|
||||
rtfExt = "Rich Text Format (.rtf)"
|
||||
rtfExt = "Format de texte enrichi (.rtf)"
|
||||
selectedFiles = "Fichiers sélectionnés"
|
||||
noFileSelected = "Aucun fichier sélectionné. Utilisez le panneau de fichiers pour ajouter des fichiers."
|
||||
convertFiles = "Convertir les fichiers"
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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í"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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ú"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -1221,9 +1221,9 @@ pdfaDigitalSignatureWarning = "PDF में एक डिजिटल हस्
|
||||
fileFormat = "फ़ाइल फ़ॉर्मेट"
|
||||
wordDoc = "Word दस्तावेज़"
|
||||
wordDocExt = "Word दस्तावेज़ (.docx)"
|
||||
odtExt = "OpenDocument Text (.odt)"
|
||||
odtExt = "OpenDocument टेक्स्ट (.odt)"
|
||||
pptExt = "PowerPoint (.pptx)"
|
||||
odpExt = "OpenDocument Presentation (.odp)"
|
||||
odpExt = "OpenDocument प्रस्तुति (.odp)"
|
||||
txtExt = "सादा पाठ (.txt)"
|
||||
rtfExt = "रिच टेक्स्ट फ़ॉर्मेट (.rtf)"
|
||||
selectedFiles = "चयनित फ़ाइलें"
|
||||
@@ -3036,6 +3036,91 @@ 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 = "निकालें"
|
||||
@@ -4258,11 +4343,11 @@ label = "जारीकर्ता URL"
|
||||
description = "OAuth2 प्रदाता का Issuer URL"
|
||||
|
||||
[admin.settings.connections.oauth2.clientId]
|
||||
label = "Client ID"
|
||||
label = "क्लाइंट ID"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client ID"
|
||||
|
||||
[admin.settings.connections.oauth2.clientSecret]
|
||||
label = "Client Secret"
|
||||
label = "क्लाइंट सीक्रेट"
|
||||
description = "आपके प्रदाता से प्राप्त OAuth2 Client Secret"
|
||||
|
||||
[admin.settings.connections.oauth2.useAsUsername]
|
||||
@@ -5282,6 +5367,31 @@ 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 = "नीचे ईमेल टाइप या पेस्ट करें, अल्पविराम से अलग करें। उपयोगकर्ताओं को ईमेल के माध्यम से लॉगिन क्रेडेंशियल मिलेंगे।"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "अपने Stirling खाते से साइन इन कर
|
||||
[setup.selfhosted]
|
||||
title = "सर्वर में साइन इन"
|
||||
subtitle = "अपने सर्वर क्रेडेंशियल्स दर्ज करें"
|
||||
link = "या किसी स्व-होस्टेड खाते से कनेक्ट करें"
|
||||
|
||||
[setup.server]
|
||||
title = "सर्वर से कनेक्ट करें"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "साइन इन"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "अर्ली एक्सेस"
|
||||
reset = "परिवर्तन रीसेट करें"
|
||||
downloadJson = "JSON डाउनलोड करें"
|
||||
generatePdf = "PDF जनरेट करें"
|
||||
saveChanges = "परिवर्तन सहेजें"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "टेक्स्ट को बॉक्स में फिट करने हेतु ऑटो-स्केल"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "यह alpha व्यूअर अभी विकसित हो र
|
||||
[pdfTextEditor.empty]
|
||||
title = "कोई दस्तावेज़ लोड नहीं"
|
||||
subtitle = "टेक्स्ट सामग्री संपादित करने के लिए PDF या JSON फ़ाइल लोड करें."
|
||||
dropzone = "यहाँ PDF या JSON फ़ाइल खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें"
|
||||
dropzoneWithFiles = "फ़ाइलें टैब से कोई फ़ाइल चुनें, या यहाँ PDF या JSON फ़ाइल खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor में आपका स्वागत है (Early Access)"
|
||||
@@ -5984,7 +6106,7 @@ warnings = "चेतावनियाँ"
|
||||
suggestions = "नोट्स"
|
||||
currentPageFonts = "इस पेज के फ़ॉन्ट्स"
|
||||
allFonts = "सभी फ़ॉन्ट्स"
|
||||
fallback = "fallback"
|
||||
fallback = "फॉलबैक"
|
||||
missing = "गायब"
|
||||
perfectMessage = "सभी फ़ॉन्ट्स को पूरी तरह पुनरुत्पादित किया जा सकता है."
|
||||
warningMessage = "कुछ फ़ॉन्ट्स सही से रेंडर नहीं हो सकते हैं."
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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 = "Database"
|
||||
database = "Basis Data"
|
||||
advanced = "Lanjutan"
|
||||
|
||||
[settings.securityAuth]
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -4305,7 +4390,7 @@ label = "Blokir Pendaftaran"
|
||||
description = "Cegah pendaftaran pengguna baru melalui SAML2"
|
||||
|
||||
[admin.settings.database]
|
||||
title = "Database"
|
||||
title = "Basis Data"
|
||||
description = "Konfigurasikan pengaturan koneksi database kustom untuk penerapan enterprise."
|
||||
configuration = "Konfigurasi Database"
|
||||
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Akses Awal"
|
||||
reset = "Reset Perubahan"
|
||||
downloadJson = "Unduh JSON"
|
||||
generatePdf = "Buat PDF"
|
||||
saveChanges = "Simpan Perubahan"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Sesuaikan teks otomatis ke kotak"
|
||||
@@ -5942,6 +6062,8 @@ 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 = "Thai"
|
||||
thai = "Tailandese"
|
||||
|
||||
[watermark.steps]
|
||||
type = "Tipo di filigrana"
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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 = "抽出"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "下にメールアドレスをカンマ区切りで入力または貼り付けてください。ユーザーにはメールでログイン情報が届きます。"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Stirling アカウントでサインイン"
|
||||
[setup.selfhosted]
|
||||
title = "サーバーにサインイン"
|
||||
subtitle = "サーバーの認証情報を入力"
|
||||
link = "またはセルフホスト型アカウントに接続"
|
||||
|
||||
[setup.server]
|
||||
title = "サーバーに接続"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "サインイン"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "早期アクセス"
|
||||
reset = "変更をリセット"
|
||||
downloadJson = "JSON をダウンロード"
|
||||
generatePdf = "PDF を生成"
|
||||
saveChanges = "変更を保存"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ボックスに収まるようテキストを自動スケール"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "このアルファ版ビューアは開発途上です。一部のフ
|
||||
[pdfTextEditor.empty]
|
||||
title = "ドキュメントが読み込まれていません"
|
||||
subtitle = "テキスト編集を開始するにはPDFまたはJSONファイルを読み込んでください。"
|
||||
dropzone = "ここに PDF または JSON ファイルをドラッグ&ドロップするか、クリックして参照"
|
||||
dropzoneWithFiles = "ファイルタブからファイルを選択するか、ここに PDF または JSON ファイルをドラッグ&ドロップするか、クリックして参照"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor(早期アクセス)へようこそ"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "추출"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "아래에 이메일을 쉼표로 구분해 입력하거나 붙여넣으세요. 사용자는 이메일로 로그인 자격 증명을 받습니다."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Stirling 계정으로 로그인"
|
||||
[setup.selfhosted]
|
||||
title = "서버에 로그인"
|
||||
subtitle = "서버 자격 증명을 입력하세요"
|
||||
link = "또는 셀프 호스팅 계정에 연결"
|
||||
|
||||
[setup.server]
|
||||
title = "서버에 연결"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "로그인"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "얼리 액세스"
|
||||
reset = "변경 사항 초기화"
|
||||
downloadJson = "JSON 다운로드"
|
||||
generatePdf = "PDF 생성"
|
||||
saveChanges = "변경 사항 저장"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "텍스트 자동 크기 조정"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "이 알파 뷰어는 아직 발전 중입니다—일부 글꼴, 색상
|
||||
[pdfTextEditor.empty]
|
||||
title = "로드된 문서 없음"
|
||||
subtitle = "텍스트 편집을 시작하려면 PDF 또는 JSON 파일을 로드하세요."
|
||||
dropzone = "여기에 PDF 또는 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요"
|
||||
dropzoneWithFiles = "파일 탭에서 파일을 선택하거나, 여기에 PDF 또는 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF 텍스트 편집기(얼리 액세스)에 오신 것을 환영합니다"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "വേർതിരിച്ചെടുക്കുക"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "താഴെ ഇമെയിലുകൾ കോമ ഉപയോഗിച്ച് വേർതിരിച്ച് ടൈപ്പ് ചെയ്യുകയോ പതിക്കുകയോ ചെയ്യുക. ഉപയോക്താക്കൾക്ക് ലോഗിൻ വിവരങ്ങൾ ഇമെയിലിലൂടെ ലഭിക്കും."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "നിങ്ങളുടെ Stirling അക്കൗണ്ടില
|
||||
[setup.selfhosted]
|
||||
title = "സെർവറിൽ സൈൻ ഇൻ ചെയ്യുക"
|
||||
subtitle = "നിങ്ങളുടെ സെർവർ ക്രെഡൻഷ്യലുകൾ നൽകുക"
|
||||
link = "അല്ലെങ്കിൽ സ്വയം-ഹോസ്റ്റുചെയ്ത അക്കൗണ്ടുമായി ബന്ധിപ്പിക്കുക"
|
||||
|
||||
[setup.server]
|
||||
title = "സെർവറിലേക്ക് കണക്റ്റുചെയ്യുക"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "സൈൻ ഇൻ"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "എർലി ആക്സസ്"
|
||||
reset = "മാറ്റങ്ങൾ റീസെറ്റ് ചെയ്യുക"
|
||||
downloadJson = "JSON ഡൗൺലോഡ് ചെയ്യുക"
|
||||
generatePdf = "PDF സൃഷ്ടിക്കുക"
|
||||
saveChanges = "മാറ്റങ്ങൾ സംരക്ഷിക്കുക"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ബോക്സിൽ ഒതുങ്ങാൻ ടെക്സ്റ്റ് സ്വയം സ്കെയിൽ ചെയ്യുക"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "ഈ ആൽഫ വീവർ ഇനിയും വികസനത്ത
|
||||
[pdfTextEditor.empty]
|
||||
title = "പ്രമാണം ലോഡ് ചെയ്തിട്ടില്ല"
|
||||
subtitle = "ടെക്സ്റ്റ് എഡിറ്റ് ആരംഭിക്കാൻ PDF അല്ലെങ്കിൽ JSON ഫയൽ ലോഡ് ചെയ്യുക."
|
||||
dropzone = "ഒരു PDF അല്ലെങ്കിൽ JSON ഫയൽ ഇവിടെ വലിച്ചിടുക, അല്ലെങ്കിൽ ബ്രൗസ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"
|
||||
dropzoneWithFiles = "Files ടാബിൽ നിന്ന് ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക, അല്ലെങ്കിൽ ഒരു PDF അല്ലെങ്കിൽ JSON ഫയൽ ഇവിടെ വലിച്ചിടുക, അല്ലെങ്കിൽ ബ്രൗസ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "PDF Text Editor-ലേക്ക് സ്വാഗതം (Early Access)"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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ę"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "извлечение"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Войдите в аккаунт Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Вход на сервер"
|
||||
subtitle = "Введите учётные данные сервера"
|
||||
link = "или подключитесь к самохостируемой учётной записи"
|
||||
|
||||
[setup.server]
|
||||
title = "Подключение к серверу"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "Вход"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Ранний доступ"
|
||||
reset = "Сбросить изменения"
|
||||
downloadJson = "Скачать JSON"
|
||||
generatePdf = "Сформировать PDF"
|
||||
saveChanges = "Сохранить изменения"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Автоматически подгонять текст по рамке"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "Этот альфа‑просмотрщик ещё развивает
|
||||
[pdfTextEditor.empty]
|
||||
title = "Документ не загружен"
|
||||
subtitle = "Загрузите файл PDF или JSON, чтобы начать редактирование текста."
|
||||
dropzone = "Перетащите сюда файл PDF или JSON, или нажмите, чтобы выбрать"
|
||||
dropzoneWithFiles = "Выберите файл на вкладке «Файлы» или перетащите сюда файл PDF или JSON, или нажмите, чтобы выбрать"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Добро пожаловать в редактор текста PDF (ранний доступ)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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ť"
|
||||
@@ -3552,7 +3637,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 = "single_page"
|
||||
filenamePrefix = "jedna_strana"
|
||||
|
||||
[pdfToSinglePage.files]
|
||||
placeholder = "Vyberte súbor PDF v hlavnom zobrazení, aby ste začali"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Zgodnji dostop"
|
||||
reset = "Ponastavi spremembe"
|
||||
downloadJson = "Prenesi JSON"
|
||||
generatePdf = "Ustvari PDF"
|
||||
saveChanges = "Shrani spremembe"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Samodejno prilagodi besedilo okvirjem"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -3790,7 +3875,7 @@ version = "Aktuelno izdanje"
|
||||
title = "API dokumentacija"
|
||||
header = "API dokumentacija"
|
||||
desc = "Pregledajte i testirajte Stirling PDF API endpoints"
|
||||
tags = "api,documentation,swagger,endpoints,development"
|
||||
tags = "api,dokumentacija,swagger,krajnje tačke,razvoj"
|
||||
|
||||
[cookieBanner.popUp]
|
||||
title = "Kako koristimo kolačiće"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "แยก"
|
||||
@@ -4293,7 +4378,7 @@ label = "ผู้ให้บริการ"
|
||||
description = "ชื่อผู้ให้บริการ SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.registrationId]
|
||||
label = "Registration ID"
|
||||
label = "รหัสการลงทะเบียน"
|
||||
description = "ตัวระบุการลงทะเบียนของ SAML2"
|
||||
|
||||
[admin.settings.connections.saml2.autoCreateUser]
|
||||
@@ -5282,6 +5367,31 @@ 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 = "พิมพ์หรือวางอีเมลด้านล่าง คั่นด้วยเครื่องหมายจุลภาค ผู้ใช้จะได้รับข้อมูลเข้าสู่ระบบทางอีเมล"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "ลงชื่อเข้าใช้ด้วยบัญชี S
|
||||
[setup.selfhosted]
|
||||
title = "ลงชื่อเข้าใช้เซิร์ฟเวอร์"
|
||||
subtitle = "ป้อนข้อมูลรับรองของเซิร์ฟเวอร์ของคุณ"
|
||||
link = "หรือเชื่อมต่อกับบัญชีแบบ self-hosted"
|
||||
|
||||
[setup.server]
|
||||
title = "เชื่อมต่อกับเซิร์ฟเวอร์"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "เข้าสู่ระบบ"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "เข้าถึงล่วงหน้า"
|
||||
reset = "รีเซ็ตการเปลี่ยนแปลง"
|
||||
downloadJson = "ดาวน์โหลด JSON"
|
||||
generatePdf = "สร้าง PDF"
|
||||
saveChanges = "บันทึกการเปลี่ยนแปลง"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "ปรับขนาดข้อความอัตโนมัติให้พอดีกล่อง"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "ตัวดูแบบ alpha นี้ยังพัฒนาอย
|
||||
[pdfTextEditor.empty]
|
||||
title = "ยังไม่ได้โหลดเอกสาร"
|
||||
subtitle = "โหลดไฟล์ PDF หรือ JSON เพื่อเริ่มแก้ไขข้อความ"
|
||||
dropzone = "ลากและวางไฟล์ PDF หรือ JSON ที่นี่ หรือคลิกเพื่อเรียกดู"
|
||||
dropzoneWithFiles = "เลือกไฟล์จากแท็บไฟล์ หรือลากและวางไฟล์ PDF หรือ JSON ที่นี่ หรือคลิกเพื่อเรียกดู"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "ยินดีต้อนรับสู่ PDF Text Editor (Early Access)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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ç"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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,6 +3036,91 @@ 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 = "екстракт"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "Введіть або вставте адреси нижче, розділені комами. Користувачі отримають дані для входу електронною поштою."
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "Увійдіть через обліковий запис Stirling"
|
||||
[setup.selfhosted]
|
||||
title = "Увійдіть на сервер"
|
||||
subtitle = "Введіть облікові дані сервера"
|
||||
link = "або підключіться до самохостингового облікового запису"
|
||||
|
||||
[setup.server]
|
||||
title = "Під’єднатися до сервера"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "Вхід"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "Ранній доступ"
|
||||
reset = "Скинути зміни"
|
||||
downloadJson = "Завантажити JSON"
|
||||
generatePdf = "Згенерувати PDF"
|
||||
saveChanges = "Зберегти зміни"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "Автопідгін тексту під рамки"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "Цей альфа-переглядач ще розвивається
|
||||
[pdfTextEditor.empty]
|
||||
title = "Документ не завантажено"
|
||||
subtitle = "Завантажте файл PDF або JSON, щоб почати редагувати текстовий вміст."
|
||||
dropzone = "Перетягніть і відпустіть файл PDF або JSON сюди, або натисніть, щоб вибрати"
|
||||
dropzoneWithFiles = "Виберіть файл на вкладці Файли або перетягніть і відпустіть файл PDF чи JSON сюди, або натисніть, щоб вибрати"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "Вітаємо у Редакторі тексту PDF (ранній доступ)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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"
|
||||
@@ -5282,6 +5367,31 @@ 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."
|
||||
@@ -5815,6 +5925,7 @@ 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"
|
||||
@@ -5833,6 +5944,14 @@ 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"
|
||||
@@ -5905,6 +6024,7 @@ 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"
|
||||
@@ -5942,6 +6062,8 @@ 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)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "ཕྱིར་འདོན།"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "在下方输入或粘贴邮箱,使用逗号分隔。用户将通过邮件收到登录凭据。"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "使用您的 Stirling 账户登录"
|
||||
[setup.selfhosted]
|
||||
title = "登录服务器"
|
||||
subtitle = "输入您的服务器凭据"
|
||||
link = "或连接到自托管账户"
|
||||
|
||||
[setup.server]
|
||||
title = "连接到服务器"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "登录"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "抢先体验"
|
||||
reset = "重置更改"
|
||||
downloadJson = "下载 JSON"
|
||||
generatePdf = "生成 PDF"
|
||||
saveChanges = "保存更改"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自动缩放文本以适配框"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "此 Alpha 预览器仍在演进中——某些字体、颜色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "未加载文档"
|
||||
subtitle = "加载 PDF 或 JSON 文件以开始编辑文本内容。"
|
||||
dropzone = "将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
dropzoneWithFiles = "从“文件”选项卡选择文件,或将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "欢迎使用 PDF 文本编辑器(抢先体验)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "提取"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "在下方输入或粘贴电子邮件地址,用逗号分隔。用户将通过电子邮件收到登录凭据。"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "使用您的 Stirling 账户登录"
|
||||
[setup.selfhosted]
|
||||
title = "登录到服务器"
|
||||
subtitle = "输入您的服务器凭据"
|
||||
link = "或连接到自托管账户"
|
||||
|
||||
[setup.server]
|
||||
title = "连接到服务器"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "登录"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "抢先体验"
|
||||
reset = "重置更改"
|
||||
downloadJson = "下载 JSON"
|
||||
generatePdf = "生成 PDF"
|
||||
saveChanges = "保存更改"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自动缩放文本以适配框体"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "此 Alpha 预览器仍在演进中——某些字体、颜色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "未加载文档"
|
||||
subtitle = "加载 PDF 或 JSON 文件以开始编辑文本内容。"
|
||||
dropzone = "将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
dropzoneWithFiles = "从“文件”选项卡选择文件,或将 PDF 或 JSON 文件拖放到此处,或点击浏览"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "欢迎使用 PDF 文本编辑器(抢先体验)"
|
||||
|
||||
@@ -3036,6 +3036,91 @@ 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 = "提取"
|
||||
@@ -5282,6 +5367,31 @@ 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 = "在下方輸入或貼上電子郵件,使用逗號分隔。使用者將透過電子郵件收到登入憑證。"
|
||||
@@ -5815,6 +5925,7 @@ subtitle = "使用你的 Stirling 帳戶登入"
|
||||
[setup.selfhosted]
|
||||
title = "登入伺服器"
|
||||
subtitle = "輸入你的伺服器認證資訊"
|
||||
link = "或連線到自行託管的帳戶"
|
||||
|
||||
[setup.server]
|
||||
title = "連線至伺服器"
|
||||
@@ -5833,6 +5944,14 @@ 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 = "登入"
|
||||
@@ -5905,6 +6024,7 @@ earlyAccess = "搶先體驗"
|
||||
reset = "重設變更"
|
||||
downloadJson = "下載 JSON"
|
||||
generatePdf = "產生 PDF"
|
||||
saveChanges = "儲存變更"
|
||||
|
||||
[pdfTextEditor.options.autoScaleText]
|
||||
title = "自動縮放文字以符合方框"
|
||||
@@ -5942,6 +6062,8 @@ alpha = "此 Alpha 檢視器仍在演進中——部分字型、顏色、透明
|
||||
[pdfTextEditor.empty]
|
||||
title = "尚未載入文件"
|
||||
subtitle = "載入 PDF 或 JSON 檔以開始編輯文字內容。"
|
||||
dropzone = "將 PDF 或 JSON 檔案拖放到此處,或點擊以瀏覽"
|
||||
dropzoneWithFiles = "從「檔案」分頁選取檔案,或將 PDF 或 JSON 檔案拖放到此處,或點擊以瀏覽"
|
||||
|
||||
[pdfTextEditor.welcomeBanner]
|
||||
title = "歡迎使用 PDF 文字編輯器(搶先體驗)"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user