Merge branch 'main' into copilot/refactor-template-localization
This commit is contained in:
@@ -5,6 +5,7 @@ REDIS_URL=redis://redis:6379/0
|
||||
EXTERNAL_HOSTNAME=docuelevate.example.com
|
||||
GOTENBERG_URL=http://gotenberg:3000
|
||||
ALLOW_FILE_DELETE=true # Allow deletion of file records
|
||||
COMPLIANCE_ENABLED=true # Enable compliance templates dashboard (GDPR, HIPAA, SOC 2)
|
||||
|
||||
# **UI / Appearance**
|
||||
# Default colour scheme: system (follow OS), light, or dark
|
||||
@@ -174,6 +175,33 @@ AUTHENTIK_CLIENT_SECRET=<yourAuthentikClientSecret>
|
||||
AUTHENTIK_CONFIG_URL=<ConfigUrlOfYourApp, e.g. https://authentik.example.com/application/o/docuelevate/.well-known/openid-configuration>
|
||||
OAUTH_PROVIDER_NAME="Authentik SSO"
|
||||
|
||||
# **Social Login Providers**
|
||||
# Enable one or more social login providers to let users sign in with existing accounts.
|
||||
# Each provider requires separate OAuth credentials. See docs/SocialLoginSetup.md for details.
|
||||
|
||||
# Google Sign-In (https://console.cloud.google.com/apis/credentials)
|
||||
# SOCIAL_AUTH_GOOGLE_ENABLED=false
|
||||
# SOCIAL_AUTH_GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com
|
||||
# SOCIAL_AUTH_GOOGLE_CLIENT_SECRET=your-google-client-secret
|
||||
|
||||
# Microsoft Sign-In / Azure AD (https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps)
|
||||
# SOCIAL_AUTH_MICROSOFT_ENABLED=false
|
||||
# SOCIAL_AUTH_MICROSOFT_CLIENT_ID=your-microsoft-application-id
|
||||
# SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET=your-microsoft-client-secret
|
||||
# SOCIAL_AUTH_MICROSOFT_TENANT=common # common | organizations | consumers | <tenant-id>
|
||||
|
||||
# Apple Sign-In (https://developer.apple.com/account/resources)
|
||||
# SOCIAL_AUTH_APPLE_ENABLED=false
|
||||
# SOCIAL_AUTH_APPLE_CLIENT_ID=com.example.docuelevate
|
||||
# SOCIAL_AUTH_APPLE_TEAM_ID=ABCDE12345
|
||||
# SOCIAL_AUTH_APPLE_KEY_ID=FGHIJ67890
|
||||
# SOCIAL_AUTH_APPLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
|
||||
|
||||
# Dropbox Sign-In (https://www.dropbox.com/developers/apps)
|
||||
# SOCIAL_AUTH_DROPBOX_ENABLED=false
|
||||
# SOCIAL_AUTH_DROPBOX_CLIENT_ID=your-dropbox-app-key
|
||||
# SOCIAL_AUTH_DROPBOX_CLIENT_SECRET=your-dropbox-app-secret
|
||||
|
||||
# **AI/ML Services**
|
||||
# Select your AI provider: openai | azure | anthropic | gemini | ollama | openrouter | portkey | litellm
|
||||
AI_PROVIDER=openai
|
||||
@@ -226,6 +254,7 @@ EMAIL_SENDER=DocuElevate System <docuelevate@example.com>
|
||||
# These settings are intentionally separate from the shared EMAIL_* settings above.
|
||||
# Configuring EMAIL_HOST for password reset / notifications does NOT automatically
|
||||
# enable the email destination – you must set DEST_EMAIL_HOST to activate it.
|
||||
# DEST_EMAIL_ENABLED=true # Set to false to disable email delivery without removing credentials
|
||||
DEST_EMAIL_HOST=smtp.example.com
|
||||
DEST_EMAIL_PORT=587
|
||||
DEST_EMAIL_USERNAME=docuelevate@example.com
|
||||
@@ -310,8 +339,15 @@ IMAP2_DELETE_AFTER_PROCESS=false
|
||||
# Use for pre-production instances that share a mailbox with production.
|
||||
IMAP_READONLY_MODE=false
|
||||
|
||||
# Controls which attachment types are ingested from IMAP emails.
|
||||
# 'documents_only' (default) – PDFs and office files only; images are skipped.
|
||||
# 'all' – all supported file types including images.
|
||||
# Per-user IMAP accounts can override this global default.
|
||||
IMAP_ATTACHMENT_FILTER=documents_only
|
||||
|
||||
# **Storage/Document Services**
|
||||
# Amazon S3
|
||||
# S3_ENABLED=true # Set to false to disable S3 uploads without removing credentials
|
||||
AWS_REGION=us-east-1
|
||||
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
|
||||
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
||||
@@ -321,12 +357,14 @@ S3_STORAGE_CLASS=STANDARD
|
||||
S3_ACL=private
|
||||
|
||||
# NextCloud
|
||||
# NEXTCLOUD_ENABLED=true # Set to false to disable NextCloud uploads without removing credentials
|
||||
NEXTCLOUD_UPLOAD_URL=https://nextcloud.example.com/remote.php/dav/files/<USERNAME>
|
||||
NEXTCLOUD_FOLDER="<NEXTCLOUD_FOLDER_PATH>"
|
||||
NEXTCLOUD_USERNAME=<NEXTCLOUD_USERNAME>
|
||||
NEXTCLOUD_PASSWORD=<NEXTCLOUD_PASSWORD>
|
||||
|
||||
# Paperless-ngx
|
||||
# PAPERLESS_ENABLED=true # Set to false to disable Paperless uploads without removing credentials
|
||||
PAPERLESS_HOST=https://paperless.example.com
|
||||
PAPERLESS_NGX_API_TOKEN=<PAPERLESS_API_TOKEN>
|
||||
# Optional: Name of the custom field in Paperless-ngx to store the "absender" (sender) value
|
||||
@@ -343,12 +381,14 @@ PAPERLESS_NGX_API_TOKEN=<PAPERLESS_API_TOKEN>
|
||||
# PAPERLESS_CUSTOM_FIELDS_MAPPING=
|
||||
|
||||
# Dropbox
|
||||
# DROPBOX_ENABLED=true # Set to false to disable Dropbox uploads without removing credentials
|
||||
DROPBOX_APP_KEY=<DROPBOX_APP_KEY>
|
||||
DROPBOX_APP_SECRET=<DROPBOX_APP_SECRET>
|
||||
DROPBOX_REFRESH_TOKEN=<DROPBOX_REFRESH_TOKEN>
|
||||
DROPBOX_FOLDER="/Documents/Uploads"
|
||||
|
||||
# Google Drive
|
||||
# GOOGLE_DRIVE_ENABLED=true # Set to false to disable Google Drive uploads without removing credentials
|
||||
# Service Account Method:
|
||||
GOOGLE_DRIVE_CREDENTIALS_JSON={"type":"service_account","project_id":"your-project","private_key_id":"key-id","private_key":"-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY\n-----END PRIVATE KEY-----\n","client_email":"service-account@project.iam.gserviceaccount.com","client_id":"client-id","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/service-account%40project.iam.gserviceaccount.com"}
|
||||
GOOGLE_DRIVE_FOLDER_ID=<YOUR_FOLDER_ID>
|
||||
@@ -361,6 +401,7 @@ GOOGLE_DRIVE_CLIENT_SECRET=your-oauth-client-secret # Required for OAuth method
|
||||
GOOGLE_DRIVE_REFRESH_TOKEN=your-oauth-refresh-token # Required for OAuth method
|
||||
|
||||
# OneDrive
|
||||
# ONEDRIVE_ENABLED=true # Set to false to disable OneDrive uploads without removing credentials
|
||||
ONEDRIVE_CLIENT_ID=your-client-id
|
||||
ONEDRIVE_CLIENT_SECRET=your-client-secret
|
||||
ONEDRIVE_TENANT_ID=common
|
||||
@@ -368,6 +409,7 @@ ONEDRIVE_REFRESH_TOKEN=your-refresh-token
|
||||
ONEDRIVE_FOLDER_PATH=Documents/Uploads
|
||||
|
||||
# WebDAV
|
||||
# WEBDAV_ENABLED=true # Set to false to disable WebDAV uploads without removing credentials
|
||||
WEBDAV_URL=https://webdav.example.com/path
|
||||
WEBDAV_USERNAME=webdav_user
|
||||
WEBDAV_PASSWORD=your_secure_webdav_password
|
||||
@@ -375,6 +417,7 @@ WEBDAV_FOLDER=/Documents/Uploads
|
||||
WEBDAV_VERIFY_SSL=True
|
||||
|
||||
# FTP
|
||||
# FTP_ENABLED=true # Set to false to disable FTP uploads without removing credentials
|
||||
# Security Note: FTP_USE_TLS=True is strongly recommended for secure connections
|
||||
# Set FTP_ALLOW_PLAINTEXT=False in production to prevent unencrypted FTP
|
||||
FTP_HOST=ftp.example.com
|
||||
@@ -386,6 +429,7 @@ FTP_USE_TLS=True
|
||||
FTP_ALLOW_PLAINTEXT=True
|
||||
|
||||
# SFTP
|
||||
# SFTP_ENABLED=true # Set to false to disable SFTP uploads without removing credentials
|
||||
# Security Note: Host key verification is enabled by default (False)
|
||||
# Only set to True in development/testing environments if needed
|
||||
# When false, configure SSH known_hosts for proper host key verification
|
||||
@@ -398,6 +442,16 @@ SFTP_PASSWORD=your_secure_sftp_password
|
||||
SFTP_FOLDER=/Documents/Uploads
|
||||
SFTP_DISABLE_HOST_KEY_VERIFICATION=False # Default is False (secure); set to True only for testing
|
||||
|
||||
# iCloud Drive
|
||||
# ICLOUD_ENABLED=true # Set to false to disable iCloud uploads without removing credentials
|
||||
# Requires an Apple ID with iCloud Drive enabled.
|
||||
# For accounts with two-factor authentication (most accounts), generate an
|
||||
# app-specific password at https://appleid.apple.com/account/manage
|
||||
ICLOUD_USERNAME=your_apple_id@example.com
|
||||
ICLOUD_PASSWORD=your-app-specific-password
|
||||
ICLOUD_FOLDER=Documents/Uploads
|
||||
# ICLOUD_COOKIE_DIRECTORY=/path/to/cookie/dir # Optional: defaults to ~/.pyicloud
|
||||
|
||||
# **HTTP Request Settings**
|
||||
# Timeout for HTTP requests - set higher to handle large PDF files (up to 1GB)
|
||||
HTTP_REQUEST_TIMEOUT=120 # Timeout in seconds (default: 120 for large file operations)
|
||||
@@ -526,3 +580,12 @@ EMBEDDING_MAX_TOKENS=8000
|
||||
# Attach PII (IP addresses, user agents) to Sentry events.
|
||||
# Disable (default) to stay GDPR/CCPA compliant.
|
||||
# SENTRY_SEND_DEFAULT_PII=false
|
||||
|
||||
# **Mobile App – Push Notifications**
|
||||
# Push notifications are delivered via Expo's push notification service
|
||||
# (https://expo.dev/notifications) which routes to APNs (iOS) and FCM (Android).
|
||||
# No additional credentials are required on the server side.
|
||||
# The mobile app registers its Expo push token via POST /api/mobile/register-device.
|
||||
#
|
||||
# To use native FCM/APNs directly (without Expo relay), replace the
|
||||
# send_expo_push_notification function in app/utils/push_notification.py.
|
||||
|
||||
@@ -17,6 +17,7 @@ concurrency:
|
||||
|
||||
env:
|
||||
IMAGE_NAME: christianlouis/docuelevate
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
# ══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
@@ -8,6 +8,9 @@ on:
|
||||
schedule:
|
||||
- cron: '37 1 * * 1'
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze (${{ matrix.language }})
|
||||
|
||||
@@ -12,6 +12,9 @@ permissions:
|
||||
pull-requests: write
|
||||
packages: write
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Semantic Release
|
||||
|
||||
@@ -16,6 +16,9 @@ permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
ruff-auto-fix:
|
||||
name: Auto-fix Ruff Issues
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026-03-11T11:44:20Z
|
||||
2026-03-12T11:43:30Z
|
||||
|
||||
+207
@@ -10,6 +10,213 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
<!-- version list -->
|
||||
|
||||
## v0.123.1 (2026-03-12)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- **tests**: Fix two failing tests - missing DB table and MagicMock IP address
|
||||
([`be6b49c`](https://github.com/christianlouis/DocuElevate/commit/be6b49c8721445dc8ea870afda87f311acb192e3))
|
||||
|
||||
### Code Style
|
||||
|
||||
- Fix ruff formatting in tests/test_imap_profiles.py
|
||||
([`8060a79`](https://github.com/christianlouis/DocuElevate/commit/8060a79b9c5172c40edff87bdcf0e095e177560e))
|
||||
|
||||
|
||||
## v0.123.0 (2026-03-12)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- **imap**: Address code review feedback on ingestion profiles
|
||||
([`2e08773`](https://github.com/christianlouis/DocuElevate/commit/2e087731b92fe554e54955c97166d61fe644bafc))
|
||||
|
||||
### Features
|
||||
|
||||
- **imap**: Add attachment type filter for IMAP ingestion
|
||||
([`554bb21`](https://github.com/christianlouis/DocuElevate/commit/554bb21d329ca2cca868a61adf337e29e4284ca4))
|
||||
|
||||
- **imap**: Add ImapIngestionProfile model, API, migration and UI
|
||||
([`c9f5544`](https://github.com/christianlouis/DocuElevate/commit/c9f554465d5bf027a92bb4aa56db244aad4a6ff6))
|
||||
|
||||
|
||||
## v0.122.0 (2026-03-12)
|
||||
|
||||
### Documentation
|
||||
|
||||
- **storage**: Document explicit enable/disable flags in ConfigurationGuide and .env.demo
|
||||
([`fd75961`](https://github.com/christianlouis/DocuElevate/commit/fd7596158064b68a23df4a89201f456df8f28b38))
|
||||
|
||||
### Features
|
||||
|
||||
- **storage**: Add explicit enable/disable flag for each global storage destination
|
||||
([`b72ab3b`](https://github.com/christianlouis/DocuElevate/commit/b72ab3b31835ab6ab574067499544427c4101231))
|
||||
|
||||
|
||||
## v0.121.1 (2026-03-12)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- Remove duplicate Audit Logs nav entry and add login/logout audit log events
|
||||
([`1e8f433`](https://github.com/christianlouis/DocuElevate/commit/1e8f433419c5c7b0c551dffe05f107d2bb5a35a1))
|
||||
|
||||
### Documentation
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`50ef607`](https://github.com/christianlouis/DocuElevate/commit/50ef6072935083554dd52a11cc6438891f177a8b))
|
||||
|
||||
### Testing
|
||||
|
||||
- **notifications**: Improve coverage for user_notification.py to 100%
|
||||
([`78204c2`](https://github.com/christianlouis/DocuElevate/commit/78204c2490ffd9ed0bcb62154c3da54fa9614450))
|
||||
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Testing
|
||||
|
||||
- **notifications**: Improve coverage for user_notification.py to 100%
|
||||
([`78204c2`](https://github.com/christianlouis/DocuElevate/commit/78204c2490ffd9ed0bcb62154c3da54fa9614450))
|
||||
|
||||
|
||||
## v0.121.0 (2026-03-12)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- **auth**: Address code review feedback - sanitize error messages, remove unused import
|
||||
([`5d716ad`](https://github.com/christianlouis/DocuElevate/commit/5d716ad78fdcd92cafa0a7765580ef290cc842fc))
|
||||
|
||||
### Documentation
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`04cde33`](https://github.com/christianlouis/DocuElevate/commit/04cde33d01d53877fc34a60b887c6978d167a97e))
|
||||
|
||||
### Features
|
||||
|
||||
- **auth**: Add social login support for Google, Microsoft, Apple, and Dropbox
|
||||
([`ac6e052`](https://github.com/christianlouis/DocuElevate/commit/ac6e05278896986ca234e6109e225c599eb982c7))
|
||||
|
||||
### Testing
|
||||
|
||||
- Improve coverage for app/utils/audit_service.py from 59% to 100%
|
||||
([`7438551`](https://github.com/christianlouis/DocuElevate/commit/7438551080dfec645a9e9c9ea8ee059764430e90))
|
||||
|
||||
- **auth**: Add tests for social login and fix existing config validator tests
|
||||
([`9c26d41`](https://github.com/christianlouis/DocuElevate/commit/9c26d412d7710dce47d06969270f184411cd6898))
|
||||
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Testing
|
||||
|
||||
- Improve coverage for app/utils/audit_service.py from 59% to 100%
|
||||
([`7438551`](https://github.com/christianlouis/DocuElevate/commit/7438551080dfec645a9e9c9ea8ee059764430e90))
|
||||
|
||||
|
||||
## v0.120.0 (2026-03-12)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- Remove accidental pip artifact file and update docs for iCloud Drive
|
||||
([`ca84a11`](https://github.com/christianlouis/DocuElevate/commit/ca84a11284a979409db186b20b0381f5025d4fdf))
|
||||
|
||||
- Remove accidental pip artifact file and update docs for iCloud Drive
|
||||
([`528f0a6`](https://github.com/christianlouis/DocuElevate/commit/528f0a624de335b21125b8b86700eb4d85dfed86))
|
||||
|
||||
- **tests**: Add iCloud mocks to all test files and address code review feedback
|
||||
([`50af0ea`](https://github.com/christianlouis/DocuElevate/commit/50af0ea67942e545849bbd745258cbed7822af45))
|
||||
|
||||
### Features
|
||||
|
||||
- **storage**: Add Apple iCloud Drive storage provider
|
||||
([`82d67c5`](https://github.com/christianlouis/DocuElevate/commit/82d67c56b34ec5a849bb3fa46aba0182c7f51dcd))
|
||||
|
||||
- **storage**: Add Apple iCloud Drive storage provider
|
||||
([`30f06e0`](https://github.com/christianlouis/DocuElevate/commit/30f06e0b3292d9b01428fc945913ab91888644a3))
|
||||
|
||||
### Testing
|
||||
|
||||
- **tasks**: Add _should_upload_to_icloud mock to send_to_all tests
|
||||
([`6e50c61`](https://github.com/christianlouis/DocuElevate/commit/6e50c6197082bbf2de2935cca1b74602789383f4))
|
||||
|
||||
- **tasks**: Add _should_upload_to_icloud mock to send_to_all tests
|
||||
([`9bc23aa`](https://github.com/christianlouis/DocuElevate/commit/9bc23aa40b9c8a9c943cf75f1051fac9e38c24fc))
|
||||
|
||||
|
||||
## v0.119.0 (2026-03-12)
|
||||
|
||||
|
||||
## v0.118.0 (2026-03-11)
|
||||
|
||||
### Features
|
||||
|
||||
- **api**: Add GraphQL endpoint at /graphql with Strawberry
|
||||
([`a41ded5`](https://github.com/christianlouis/DocuElevate/commit/a41ded535f32d4892199208e1cab54cc189fde13))
|
||||
|
||||
|
||||
## v0.117.1 (2026-03-11)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- Resolve all 47 failing tests in main
|
||||
([`df4c91a`](https://github.com/christianlouis/DocuElevate/commit/df4c91a58661e2ecf9fda15500e4ba1259674168))
|
||||
|
||||
|
||||
## v0.117.0 (2026-03-11)
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
- Opt into Node.js 24 for all GitHub Actions workflows
|
||||
([`c306d80`](https://github.com/christianlouis/DocuElevate/commit/c306d80755193e4b12222c73ed4da442a2d5e23c))
|
||||
|
||||
### Documentation
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`ab19ae5`](https://github.com/christianlouis/DocuElevate/commit/ab19ae57060ff2be8e9172714c5e3b308c45334d))
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`c5b67fe`](https://github.com/christianlouis/DocuElevate/commit/c5b67fe36464b0756553cc54614d0f77273772ec))
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`eb22a58`](https://github.com/christianlouis/DocuElevate/commit/eb22a580651b4de477b3b5cc945581776a6775fa))
|
||||
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
- Opt into Node.js 24 for all GitHub Actions workflows
|
||||
([`c306d80`](https://github.com/christianlouis/DocuElevate/commit/c306d80755193e4b12222c73ed4da442a2d5e23c))
|
||||
|
||||
### Documentation
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`c5b67fe`](https://github.com/christianlouis/DocuElevate/commit/c5b67fe36464b0756553cc54614d0f77273772ec))
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`eb22a58`](https://github.com/christianlouis/DocuElevate/commit/eb22a580651b4de477b3b5cc945581776a6775fa))
|
||||
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
- Opt into Node.js 24 for all GitHub Actions workflows
|
||||
([`c306d80`](https://github.com/christianlouis/DocuElevate/commit/c306d80755193e4b12222c73ed4da442a2d5e23c))
|
||||
|
||||
### Documentation
|
||||
|
||||
- **changelog**: Update changelog [skip ci]
|
||||
([`eb22a58`](https://github.com/christianlouis/DocuElevate/commit/eb22a580651b4de477b3b5cc945581776a6775fa))
|
||||
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Continuous Integration
|
||||
|
||||
- Opt into Node.js 24 for all GitHub Actions workflows
|
||||
([`c306d80`](https://github.com/christianlouis/DocuElevate/commit/c306d80755193e4b12222c73ed4da442a2d5e23c))
|
||||
|
||||
|
||||
## v0.116.0 (2026-03-11)
|
||||
|
||||
### Documentation
|
||||
|
||||
+6
-6
@@ -1,10 +1,10 @@
|
||||
DocuElevate Build Information
|
||||
==============================
|
||||
Version: 0.116.0
|
||||
Build Date: 2026-03-11T11:44:20Z
|
||||
Git Commit: 9f7d6c85488081f546e7c392bc46b2827bb1caa6
|
||||
Git Short SHA: 9f7d6c8
|
||||
Version: 0.123.1
|
||||
Build Date: 2026-03-12T11:43:30Z
|
||||
Git Commit: 5d239e904bba584a5c02c9ec8d9da110d37d548f
|
||||
Git Short SHA: 5d239e9
|
||||
Git Branch: main
|
||||
Commit Date: 2026-03-11T12:43:59+01:00
|
||||
Build Timestamp: 2026-03-11T11:44:20Z
|
||||
Commit Date: 2026-03-12T12:43:08+01:00
|
||||
Build Timestamp: 2026-03-12T11:43:30Z
|
||||
==============================
|
||||
|
||||
@@ -12,6 +12,7 @@ from app.api.audit_logs import router as audit_logs_router
|
||||
from app.api.azure import router as azure_router
|
||||
from app.api.backup import router as backup_router
|
||||
from app.api.billing import router as billing_router
|
||||
from app.api.compliance import router as compliance_router
|
||||
from app.api.database import router as database_router
|
||||
from app.api.diagnostic import router as diagnostic_router
|
||||
from app.api.dropbox import router as dropbox_router
|
||||
@@ -20,8 +21,10 @@ from app.api.files import router as files_router
|
||||
from app.api.google_drive import router as google_drive_router
|
||||
from app.api.i18n import router as i18n_router
|
||||
from app.api.imap_accounts import router as imap_accounts_router
|
||||
from app.api.imap_profiles import router as imap_profiles_router
|
||||
from app.api.integrations import router as integrations_router
|
||||
from app.api.logs import router as logs_router
|
||||
from app.api.mobile import router as mobile_router
|
||||
from app.api.notifications import router as notifications_router
|
||||
from app.api.onboarding import router as onboarding_router
|
||||
from app.api.onedrive import router as onedrive_router
|
||||
@@ -81,8 +84,11 @@ router.include_router(onboarding_router)
|
||||
router.include_router(billing_router)
|
||||
router.include_router(pipelines_router)
|
||||
router.include_router(imap_accounts_router)
|
||||
router.include_router(imap_profiles_router)
|
||||
router.include_router(integrations_router)
|
||||
router.include_router(notifications_router)
|
||||
router.include_router(scheduled_jobs_router)
|
||||
router.include_router(audit_logs_router)
|
||||
router.include_router(i18n_router)
|
||||
router.include_router(mobile_router)
|
||||
router.include_router(compliance_router)
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
"""API endpoints for managing compliance templates (GDPR, HIPAA, SOC2).
|
||||
|
||||
All endpoints require admin privileges.
|
||||
|
||||
Available routes:
|
||||
GET /api/compliance/templates – list all compliance templates
|
||||
GET /api/compliance/templates/{name} – get a single template with checks
|
||||
POST /api/compliance/templates/{name}/apply – one-click apply a template
|
||||
GET /api/compliance/templates/{name}/status – evaluate compliance status
|
||||
GET /api/compliance/summary – overall compliance dashboard data
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Annotated, Any
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from pydantic import BaseModel
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.database import get_db
|
||||
from app.utils.compliance_service import (
|
||||
COMPLIANCE_TEMPLATES,
|
||||
apply_template,
|
||||
evaluate_template_status,
|
||||
get_all_templates,
|
||||
get_compliance_summary,
|
||||
get_template_by_name,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter(prefix="/compliance", tags=["compliance"])
|
||||
|
||||
DbSession = Annotated[Session, Depends(get_db)]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Authorisation helper
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _require_admin(request: Request) -> dict:
|
||||
"""Ensure the caller is an admin; raises HTTP 403 otherwise."""
|
||||
user = request.session.get("user")
|
||||
if not user or not user.get("is_admin"):
|
||||
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required")
|
||||
return user
|
||||
|
||||
|
||||
AdminUser = Annotated[dict, Depends(_require_admin)]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Pydantic response models
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class CheckResult(BaseModel):
|
||||
"""Individual compliance check result."""
|
||||
|
||||
key: str
|
||||
label: str
|
||||
description: str
|
||||
expected: str
|
||||
actual: str
|
||||
passing: bool
|
||||
|
||||
|
||||
class TemplateStatusResponse(BaseModel):
|
||||
"""Status evaluation for a compliance template."""
|
||||
|
||||
status: str
|
||||
total: int
|
||||
passed: int
|
||||
failed: int
|
||||
check_results: list[CheckResult]
|
||||
|
||||
|
||||
class TemplateResponse(BaseModel):
|
||||
"""Full compliance template representation."""
|
||||
|
||||
id: int
|
||||
name: str
|
||||
display_name: str
|
||||
description: str | None
|
||||
enabled: bool
|
||||
status: str
|
||||
applied_at: str | None
|
||||
applied_by: str | None
|
||||
settings: dict[str, str]
|
||||
checks: list[dict[str, Any]]
|
||||
check_count: int
|
||||
|
||||
|
||||
class ApplyResponse(BaseModel):
|
||||
"""Result of applying a compliance template."""
|
||||
|
||||
success: bool
|
||||
template: str | None = None
|
||||
applied_settings: dict[str, str] | None = None
|
||||
errors: list[str] | None = None
|
||||
error: str | None = None
|
||||
status: TemplateStatusResponse | None = None
|
||||
|
||||
|
||||
class SummaryTemplateResponse(BaseModel):
|
||||
"""Per-template summary for the compliance dashboard."""
|
||||
|
||||
name: str
|
||||
display_name: str
|
||||
enabled: bool
|
||||
status: str
|
||||
total: int
|
||||
passed: int
|
||||
failed: int
|
||||
applied_at: str | None
|
||||
applied_by: str | None
|
||||
|
||||
|
||||
class ComplianceSummaryResponse(BaseModel):
|
||||
"""Overall compliance dashboard summary."""
|
||||
|
||||
overall_status: str
|
||||
total_checks: int
|
||||
total_passed: int
|
||||
total_failed: int
|
||||
templates: list[SummaryTemplateResponse]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Endpoints
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@router.get("/templates", response_model=list[TemplateResponse])
|
||||
async def list_templates(db: DbSession, admin: AdminUser) -> list[dict[str, Any]]:
|
||||
"""List all compliance templates with their current status."""
|
||||
return get_all_templates(db)
|
||||
|
||||
|
||||
@router.get("/templates/{name}", response_model=TemplateResponse)
|
||||
async def get_template(name: str, db: DbSession, admin: AdminUser) -> dict[str, Any]:
|
||||
"""Get a single compliance template by name."""
|
||||
templates = get_all_templates(db)
|
||||
for t in templates:
|
||||
if t["name"] == name:
|
||||
return t
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Template '{name}' not found")
|
||||
|
||||
|
||||
@router.post("/templates/{name}/apply", response_model=ApplyResponse)
|
||||
async def apply_compliance_template(name: str, db: DbSession, admin: AdminUser) -> dict[str, Any]:
|
||||
"""Apply a compliance template (one-click).
|
||||
|
||||
Writes all template settings to the database and evaluates the resulting
|
||||
compliance status.
|
||||
"""
|
||||
if name not in COMPLIANCE_TEMPLATES:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Template '{name}' not found")
|
||||
|
||||
template = get_template_by_name(db, name)
|
||||
if template is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Template '{name}' not found")
|
||||
|
||||
admin_email = admin.get("email", "admin")
|
||||
result = apply_template(db, name, applied_by=admin_email)
|
||||
if not result.get("success") and result.get("error"):
|
||||
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=result["error"])
|
||||
return result
|
||||
|
||||
|
||||
@router.get("/templates/{name}/status", response_model=TemplateStatusResponse)
|
||||
async def get_template_status(name: str, db: DbSession, admin: AdminUser) -> dict[str, Any]:
|
||||
"""Evaluate the live compliance status of a template."""
|
||||
template = get_template_by_name(db, name)
|
||||
if template is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Template '{name}' not found")
|
||||
return evaluate_template_status(db, name)
|
||||
|
||||
|
||||
@router.get("/summary", response_model=ComplianceSummaryResponse)
|
||||
async def compliance_summary(db: DbSession, admin: AdminUser) -> dict[str, Any]:
|
||||
"""Overall compliance dashboard summary across all templates."""
|
||||
return get_compliance_summary(db)
|
||||
@@ -0,0 +1,431 @@
|
||||
"""
|
||||
GraphQL API endpoint for DocuElevate.
|
||||
|
||||
Provides a flexible query interface alongside the existing REST API.
|
||||
Schema covers: documents, pipelines, settings, and users.
|
||||
|
||||
Endpoint: /graphql
|
||||
GraphiQL playground: /graphql (via browser)
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from typing import Annotated, Any
|
||||
|
||||
import strawberry
|
||||
from fastapi import Depends, Request
|
||||
from sqlalchemy.orm import Session
|
||||
from strawberry.fastapi import GraphQLRouter
|
||||
|
||||
from app.auth import get_current_user
|
||||
from app.config import settings
|
||||
from app.database import get_db
|
||||
from app.models import ApplicationSettings, FileRecord, Pipeline, PipelineStep, UserProfile
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Strawberry types
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class DocumentType:
|
||||
"""A processed document stored in the system."""
|
||||
|
||||
id: int
|
||||
owner_id: str | None
|
||||
original_filename: str | None
|
||||
local_filename: str
|
||||
file_size: int
|
||||
mime_type: str | None
|
||||
document_title: str | None
|
||||
is_duplicate: bool
|
||||
ocr_quality_score: int | None
|
||||
pipeline_id: int | None
|
||||
created_at: datetime | None
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class PipelineStepType:
|
||||
"""A single step within a processing pipeline."""
|
||||
|
||||
id: int
|
||||
pipeline_id: int
|
||||
position: int
|
||||
step_type: str
|
||||
label: str | None
|
||||
enabled: bool
|
||||
created_at: datetime | None
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class PipelineType:
|
||||
"""A processing pipeline with its ordered steps."""
|
||||
|
||||
id: int
|
||||
owner_id: str | None
|
||||
name: str
|
||||
description: str | None
|
||||
is_default: bool
|
||||
is_active: bool
|
||||
steps: list[PipelineStepType]
|
||||
created_at: datetime | None
|
||||
updated_at: datetime | None
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class SettingType:
|
||||
"""An application configuration setting stored in the database."""
|
||||
|
||||
id: int
|
||||
key: str
|
||||
value: str | None
|
||||
created_at: datetime | None
|
||||
updated_at: datetime | None
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class UserType:
|
||||
"""A user profile in the system."""
|
||||
|
||||
id: int
|
||||
user_id: str
|
||||
display_name: str | None
|
||||
is_blocked: bool
|
||||
subscription_tier: str | None
|
||||
onboarding_completed: bool
|
||||
created_at: datetime | None
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Conversion helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _document_from_record(rec: FileRecord) -> DocumentType:
|
||||
return DocumentType(
|
||||
id=rec.id,
|
||||
owner_id=rec.owner_id,
|
||||
original_filename=rec.original_filename,
|
||||
local_filename=rec.local_filename,
|
||||
file_size=rec.file_size,
|
||||
mime_type=rec.mime_type,
|
||||
document_title=rec.document_title,
|
||||
is_duplicate=rec.is_duplicate,
|
||||
ocr_quality_score=rec.ocr_quality_score,
|
||||
pipeline_id=rec.pipeline_id,
|
||||
created_at=rec.created_at,
|
||||
)
|
||||
|
||||
|
||||
def _pipeline_step_from_record(step: PipelineStep) -> PipelineStepType:
|
||||
return PipelineStepType(
|
||||
id=step.id,
|
||||
pipeline_id=step.pipeline_id,
|
||||
position=step.position,
|
||||
step_type=step.step_type,
|
||||
label=step.label,
|
||||
enabled=step.enabled,
|
||||
created_at=step.created_at,
|
||||
)
|
||||
|
||||
|
||||
def _pipeline_from_record(pipeline: Pipeline, db: Session) -> PipelineType:
|
||||
steps = db.query(PipelineStep).filter(PipelineStep.pipeline_id == pipeline.id).order_by(PipelineStep.position).all()
|
||||
return PipelineType(
|
||||
id=pipeline.id,
|
||||
owner_id=pipeline.owner_id,
|
||||
name=pipeline.name,
|
||||
description=pipeline.description,
|
||||
is_default=pipeline.is_default,
|
||||
is_active=pipeline.is_active,
|
||||
steps=[_pipeline_step_from_record(s) for s in steps],
|
||||
created_at=pipeline.created_at,
|
||||
updated_at=pipeline.updated_at,
|
||||
)
|
||||
|
||||
|
||||
def _setting_from_record(setting: ApplicationSettings) -> SettingType:
|
||||
return SettingType(
|
||||
id=setting.id,
|
||||
key=setting.key,
|
||||
value=setting.value,
|
||||
created_at=setting.created_at,
|
||||
updated_at=setting.updated_at,
|
||||
)
|
||||
|
||||
|
||||
def _user_from_profile(profile: UserProfile) -> UserType:
|
||||
return UserType(
|
||||
id=profile.id,
|
||||
user_id=profile.user_id,
|
||||
display_name=profile.display_name,
|
||||
is_blocked=profile.is_blocked,
|
||||
subscription_tier=profile.subscription_tier,
|
||||
onboarding_completed=profile.onboarding_completed,
|
||||
created_at=profile.created_at,
|
||||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Context helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Keys that contain sensitive data and must never be returned via GraphQL
|
||||
_SENSITIVE_SETTING_KEYS: frozenset[str] = frozenset(
|
||||
{
|
||||
"openai_api_key",
|
||||
"azure_ai_key",
|
||||
"session_secret",
|
||||
"database_url",
|
||||
"redis_url",
|
||||
"dropbox_app_secret",
|
||||
"dropbox_refresh_token",
|
||||
"google_drive_credentials_json",
|
||||
"onedrive_client_secret",
|
||||
"onedrive_refresh_token",
|
||||
"smtp_password",
|
||||
"nextcloud_password",
|
||||
"s3_secret_access_key",
|
||||
"ftp_password",
|
||||
"sftp_password",
|
||||
"webdav_password",
|
||||
"stripe_secret_key",
|
||||
"stripe_webhook_secret",
|
||||
"sentry_dsn",
|
||||
"social_auth_google_client_secret",
|
||||
"social_auth_microsoft_client_secret",
|
||||
"social_auth_apple_private_key",
|
||||
"social_auth_dropbox_app_secret",
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def _get_current_user_id(user: dict[str, Any] | None) -> str | None:
|
||||
"""Extract the stable user identifier from the user dict."""
|
||||
if not user:
|
||||
return None
|
||||
return user.get("preferred_username") or user.get("email") or user.get("id") or None
|
||||
|
||||
|
||||
def _get_db_and_user(info: strawberry.types.Info) -> tuple[Session, dict[str, Any] | None]:
|
||||
"""Extract the database session and current user from the Strawberry context."""
|
||||
db: Session = info.context["db"]
|
||||
user: dict[str, Any] | None = info.context.get("user")
|
||||
return db, user
|
||||
|
||||
|
||||
def _require_auth(user: dict[str, Any] | None) -> None:
|
||||
"""Raise an error when authentication is enabled and no valid user is present."""
|
||||
if settings.auth_enabled and not user:
|
||||
raise strawberry.exceptions.StrawberryGraphQLError("Authentication required")
|
||||
|
||||
|
||||
def _require_admin(user: dict[str, Any] | None) -> None:
|
||||
"""Raise an error when the current user is not an admin.
|
||||
|
||||
When ``auth_enabled`` is *False* (single-user / development mode) all
|
||||
callers are implicitly treated as administrators.
|
||||
"""
|
||||
if not settings.auth_enabled:
|
||||
# Single-user mode: no auth, treat caller as admin
|
||||
return
|
||||
_require_auth(user)
|
||||
if not (user and user.get("is_admin")):
|
||||
raise strawberry.exceptions.StrawberryGraphQLError("Admin access required")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Query resolvers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class Query:
|
||||
"""Root query type for the DocuElevate GraphQL API."""
|
||||
|
||||
@strawberry.field(description="List documents, optionally filtered by owner.")
|
||||
def documents(
|
||||
self,
|
||||
info: strawberry.types.Info,
|
||||
owner_id: str | None = None,
|
||||
limit: int = 20,
|
||||
offset: int = 0,
|
||||
) -> list[DocumentType]:
|
||||
"""Return a paginated list of documents.
|
||||
|
||||
When *auth_enabled* the caller must be authenticated. Non-admin users
|
||||
receive only their own documents; admins may query any *owner_id*.
|
||||
"""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_auth(user)
|
||||
|
||||
limit = max(1, min(limit, 100))
|
||||
offset = max(0, offset)
|
||||
|
||||
query = db.query(FileRecord)
|
||||
|
||||
if settings.auth_enabled and user:
|
||||
is_admin = user.get("is_admin", False)
|
||||
current_user_id = _get_current_user_id(user)
|
||||
if not is_admin:
|
||||
# Non-admins can only see their own documents
|
||||
query = query.filter(FileRecord.owner_id == current_user_id)
|
||||
elif owner_id:
|
||||
query = query.filter(FileRecord.owner_id == owner_id)
|
||||
elif owner_id:
|
||||
query = query.filter(FileRecord.owner_id == owner_id)
|
||||
|
||||
records = query.order_by(FileRecord.created_at.desc()).offset(offset).limit(limit).all()
|
||||
return [_document_from_record(r) for r in records]
|
||||
|
||||
@strawberry.field(description="Fetch a single document by ID.")
|
||||
def document(self, info: strawberry.types.Info, id: int) -> DocumentType | None:
|
||||
"""Return one document by its primary key, or *null* if not found."""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_auth(user)
|
||||
|
||||
rec = db.query(FileRecord).filter(FileRecord.id == id).first()
|
||||
if rec is None:
|
||||
return None
|
||||
|
||||
if settings.auth_enabled and user:
|
||||
is_admin = user.get("is_admin", False)
|
||||
current_user_id = _get_current_user_id(user)
|
||||
if not is_admin and rec.owner_id != current_user_id:
|
||||
return None
|
||||
|
||||
return _document_from_record(rec)
|
||||
|
||||
@strawberry.field(description="List processing pipelines.")
|
||||
def pipelines(
|
||||
self,
|
||||
info: strawberry.types.Info,
|
||||
owner_id: str | None = None,
|
||||
limit: int = 20,
|
||||
offset: int = 0,
|
||||
) -> list[PipelineType]:
|
||||
"""Return a paginated list of pipelines."""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_auth(user)
|
||||
|
||||
limit = max(1, min(limit, 100))
|
||||
offset = max(0, offset)
|
||||
|
||||
query = db.query(Pipeline)
|
||||
|
||||
if settings.auth_enabled and user:
|
||||
is_admin = user.get("is_admin", False)
|
||||
current_user_id = _get_current_user_id(user)
|
||||
if not is_admin:
|
||||
query = query.filter((Pipeline.owner_id == current_user_id) | (Pipeline.owner_id.is_(None)))
|
||||
elif owner_id:
|
||||
query = query.filter(Pipeline.owner_id == owner_id)
|
||||
elif owner_id:
|
||||
query = query.filter(Pipeline.owner_id == owner_id)
|
||||
|
||||
rows = query.order_by(Pipeline.id).offset(offset).limit(limit).all()
|
||||
return [_pipeline_from_record(p, db) for p in rows]
|
||||
|
||||
@strawberry.field(description="Fetch a single pipeline by ID.")
|
||||
def pipeline(self, info: strawberry.types.Info, id: int) -> PipelineType | None:
|
||||
"""Return one pipeline by its primary key, or *null* if not found."""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_auth(user)
|
||||
|
||||
row = db.query(Pipeline).filter(Pipeline.id == id).first()
|
||||
if row is None:
|
||||
return None
|
||||
|
||||
if settings.auth_enabled and user:
|
||||
is_admin = user.get("is_admin", False)
|
||||
current_user_id = _get_current_user_id(user)
|
||||
if not is_admin and row.owner_id is not None and row.owner_id != current_user_id:
|
||||
return None
|
||||
|
||||
return _pipeline_from_record(row, db)
|
||||
|
||||
@strawberry.field(description="List non-sensitive application settings (admin only).")
|
||||
def settings(
|
||||
self,
|
||||
info: strawberry.types.Info,
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
) -> list[SettingType]:
|
||||
"""Return application settings stored in the database.
|
||||
|
||||
Sensitive keys (API secrets, passwords, etc.) are automatically
|
||||
excluded. Requires admin privileges when auth is enabled.
|
||||
"""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_admin(user)
|
||||
|
||||
limit = max(1, min(limit, 200))
|
||||
offset = max(0, offset)
|
||||
|
||||
rows = (
|
||||
db.query(ApplicationSettings)
|
||||
.filter(ApplicationSettings.key.notin_(_SENSITIVE_SETTING_KEYS))
|
||||
.order_by(ApplicationSettings.key)
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.all()
|
||||
)
|
||||
return [_setting_from_record(r) for r in rows]
|
||||
|
||||
@strawberry.field(description="List user profiles (admin only).")
|
||||
def users(
|
||||
self,
|
||||
info: strawberry.types.Info,
|
||||
limit: int = 20,
|
||||
offset: int = 0,
|
||||
) -> list[UserType]:
|
||||
"""Return a paginated list of user profiles. Requires admin privileges."""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_admin(user)
|
||||
|
||||
limit = max(1, min(limit, 100))
|
||||
offset = max(0, offset)
|
||||
|
||||
rows = db.query(UserProfile).order_by(UserProfile.user_id).offset(offset).limit(limit).all()
|
||||
return [_user_from_profile(r) for r in rows]
|
||||
|
||||
@strawberry.field(description="Fetch a user profile by user_id (admin only).")
|
||||
def user(self, info: strawberry.types.Info, user_id: str) -> UserType | None:
|
||||
"""Return one user profile by *user_id*, or *null* if not found."""
|
||||
db, user = _get_db_and_user(info)
|
||||
_require_admin(user)
|
||||
|
||||
row = db.query(UserProfile).filter(UserProfile.user_id == user_id).first()
|
||||
return _user_from_profile(row) if row else None
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Schema and router
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
schema = strawberry.Schema(query=Query)
|
||||
|
||||
|
||||
async def get_graphql_context(
|
||||
request: Request,
|
||||
db: Annotated[Session, Depends(get_db)],
|
||||
) -> dict[str, Any]:
|
||||
"""Build the per-request context injected into every resolver."""
|
||||
try:
|
||||
user = get_current_user(request)
|
||||
except Exception:
|
||||
logger.debug("Could not resolve current user for GraphQL context", exc_info=True)
|
||||
user = None
|
||||
return {"request": request, "db": db, "user": user}
|
||||
|
||||
|
||||
graphql_router = GraphQLRouter(
|
||||
schema,
|
||||
context_getter=get_graphql_context,
|
||||
graphql_ide="graphiql",
|
||||
)
|
||||
@@ -110,6 +110,13 @@ class ImapAccountCreate(BaseModel):
|
||||
use_ssl: bool = Field(default=True, description="Use SSL/TLS connection")
|
||||
delete_after_process: bool = Field(default=False, description="Delete emails from mailbox after processing")
|
||||
is_active: bool = Field(default=True, description="Whether to poll this mailbox")
|
||||
profile_id: int | None = Field(
|
||||
default=None,
|
||||
description=(
|
||||
"ID of the ImapIngestionProfile that controls which attachment types to ingest. "
|
||||
"Null inherits the global imap_attachment_filter setting."
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ImapAccountUpdate(BaseModel):
|
||||
@@ -123,6 +130,13 @@ class ImapAccountUpdate(BaseModel):
|
||||
use_ssl: bool | None = None
|
||||
delete_after_process: bool | None = None
|
||||
is_active: bool | None = None
|
||||
profile_id: int | None = Field(
|
||||
default=None,
|
||||
description=(
|
||||
"ID of the ImapIngestionProfile to use. "
|
||||
"Explicitly sending null clears the override (falls back to global setting)."
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ImapTestRequest(BaseModel):
|
||||
@@ -155,6 +169,7 @@ def _to_response(acct: UserImapAccount) -> dict[str, Any]:
|
||||
"use_ssl": acct.use_ssl,
|
||||
"delete_after_process": acct.delete_after_process,
|
||||
"is_active": acct.is_active,
|
||||
"profile_id": acct.profile_id,
|
||||
"last_checked_at": acct.last_checked_at.isoformat() if acct.last_checked_at else None,
|
||||
"last_error": acct.last_error,
|
||||
"created_at": acct.created_at.isoformat() if acct.created_at else None,
|
||||
@@ -222,6 +237,7 @@ def create_imap_account(
|
||||
use_ssl=body.use_ssl,
|
||||
delete_after_process=body.delete_after_process,
|
||||
is_active=body.is_active,
|
||||
profile_id=body.profile_id,
|
||||
)
|
||||
try:
|
||||
db.add(acct)
|
||||
@@ -277,6 +293,10 @@ def update_imap_account(
|
||||
acct.delete_after_process = body.delete_after_process
|
||||
if body.is_active is not None:
|
||||
acct.is_active = body.is_active
|
||||
# profile_id: update whenever the field is explicitly present in the request payload
|
||||
# (including sending null to clear the override).
|
||||
if "profile_id" in body.model_fields_set:
|
||||
acct.profile_id = body.profile_id
|
||||
|
||||
# Reset last_error so the next poll gives a fresh result
|
||||
acct.last_error = None
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
"""API endpoints for managing IMAP ingestion profiles.
|
||||
|
||||
Ingestion profiles allow fine-grained control over which attachment types are
|
||||
accepted when ingesting emails via IMAP. Each profile carries a list of enabled
|
||||
file-type categories (e.g. ``["pdf", "office", "images"]``) drawn from the
|
||||
canonical set defined in :mod:`app.utils.allowed_types`.
|
||||
|
||||
Built-in system profiles (``is_builtin=True``) are read-only and cannot be
|
||||
deleted or modified. Users may create their own profiles which are private to
|
||||
their ``owner_id``. System-level global profiles (``owner_id=None``) are visible
|
||||
to all users but can only be created by administrators.
|
||||
"""
|
||||
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime, timezone
|
||||
from typing import Annotated, Any
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from pydantic import BaseModel, Field
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.database import get_db
|
||||
from app.models import ImapIngestionProfile
|
||||
from app.utils.allowed_types import FILE_TYPE_CATEGORIES
|
||||
from app.utils.user_scope import get_current_owner_id
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter(prefix="/imap-profiles", tags=["imap-profiles"])
|
||||
|
||||
DbSession = Annotated[Session, Depends(get_db)]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Auth helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _get_owner_id(request: Request) -> str:
|
||||
"""Return the current user's owner ID, raising 401 if unauthenticated."""
|
||||
owner_id = get_current_owner_id(request)
|
||||
if owner_id is None:
|
||||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated")
|
||||
return owner_id
|
||||
|
||||
|
||||
CurrentOwner = Annotated[str, Depends(_get_owner_id)]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Pydantic schemas
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
_VALID_CATEGORIES = set(FILE_TYPE_CATEGORIES.keys())
|
||||
|
||||
|
||||
class ImapProfileCreate(BaseModel):
|
||||
"""Schema for creating a new ingestion profile."""
|
||||
|
||||
name: str = Field(..., min_length=1, max_length=255, description="Human-readable profile name")
|
||||
description: str | None = Field(default=None, description="Optional description")
|
||||
allowed_categories: list[str] = Field(
|
||||
...,
|
||||
min_length=1,
|
||||
description=(f"List of enabled file-type category keys. Valid values: {sorted(_VALID_CATEGORIES)}"),
|
||||
)
|
||||
|
||||
|
||||
class ImapProfileUpdate(BaseModel):
|
||||
"""Schema for updating an existing profile (all fields optional)."""
|
||||
|
||||
name: str | None = Field(default=None, min_length=1, max_length=255)
|
||||
description: str | None = None
|
||||
allowed_categories: list[str] | None = Field(default=None, min_length=1)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Validation helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _validate_categories(categories: list[str]) -> list[str]:
|
||||
"""Raise 422 if any category key is unknown; return the cleaned list."""
|
||||
unknown = [c for c in categories if c not in _VALID_CATEGORIES]
|
||||
if unknown:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
detail=f"Unknown category key(s): {unknown}. Valid keys: {sorted(_VALID_CATEGORIES)}",
|
||||
)
|
||||
# Deduplicate while preserving order
|
||||
seen: set[str] = set()
|
||||
result: list[str] = []
|
||||
for cat in categories:
|
||||
if cat not in seen:
|
||||
seen.add(cat)
|
||||
result.append(cat)
|
||||
return result
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Serialisation
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _to_response(profile: ImapIngestionProfile) -> dict[str, Any]:
|
||||
"""Serialize a profile row to a response dict."""
|
||||
try:
|
||||
categories = json.loads(profile.allowed_categories)
|
||||
except (ValueError, TypeError):
|
||||
categories = []
|
||||
|
||||
# Enrich categories with display metadata
|
||||
categories_detail = [
|
||||
{
|
||||
"key": cat,
|
||||
"label": FILE_TYPE_CATEGORIES[cat]["label"] if cat in FILE_TYPE_CATEGORIES else cat,
|
||||
"description": FILE_TYPE_CATEGORIES[cat]["description"] if cat in FILE_TYPE_CATEGORIES else "",
|
||||
}
|
||||
for cat in categories
|
||||
]
|
||||
|
||||
return {
|
||||
"id": profile.id,
|
||||
"name": profile.name,
|
||||
"description": profile.description,
|
||||
"owner_id": profile.owner_id,
|
||||
"allowed_categories": categories,
|
||||
"categories_detail": categories_detail,
|
||||
"is_builtin": profile.is_builtin,
|
||||
"created_at": profile.created_at.isoformat() if profile.created_at else None,
|
||||
"updated_at": profile.updated_at.isoformat() if profile.updated_at else None,
|
||||
}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Endpoints
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@router.get("/categories", summary="List available file-type categories")
|
||||
def list_categories(request: Request, owner_id: CurrentOwner) -> list[dict[str, Any]]:
|
||||
"""Return the full list of file-type categories that can be used in profiles."""
|
||||
return [
|
||||
{
|
||||
"key": key,
|
||||
"label": info["label"],
|
||||
"description": info["description"],
|
||||
}
|
||||
for key, info in FILE_TYPE_CATEGORIES.items()
|
||||
]
|
||||
|
||||
|
||||
@router.get("/", summary="List ingestion profiles visible to the current user")
|
||||
def list_profiles(request: Request, db: DbSession, owner_id: CurrentOwner) -> list[dict[str, Any]]:
|
||||
"""Return all profiles: system-global (owner_id=NULL) and the user's own profiles."""
|
||||
profiles = (
|
||||
db.query(ImapIngestionProfile)
|
||||
.filter(
|
||||
# SQLAlchemy requires `== None` for IS NULL comparison in ORM filters
|
||||
(ImapIngestionProfile.owner_id == None) | (ImapIngestionProfile.owner_id == owner_id) # noqa: E711
|
||||
)
|
||||
.order_by(ImapIngestionProfile.is_builtin.desc(), ImapIngestionProfile.id)
|
||||
.all()
|
||||
)
|
||||
return [_to_response(p) for p in profiles]
|
||||
|
||||
|
||||
@router.post("/", status_code=status.HTTP_201_CREATED, summary="Create a new ingestion profile")
|
||||
def create_profile(request: Request, body: ImapProfileCreate, db: DbSession, owner_id: CurrentOwner) -> dict[str, Any]:
|
||||
"""Create a new ingestion profile owned by the current user."""
|
||||
categories = _validate_categories(body.allowed_categories)
|
||||
|
||||
profile = ImapIngestionProfile(
|
||||
name=body.name,
|
||||
description=body.description,
|
||||
owner_id=owner_id,
|
||||
allowed_categories=json.dumps(categories),
|
||||
is_builtin=False,
|
||||
)
|
||||
try:
|
||||
db.add(profile)
|
||||
db.commit()
|
||||
db.refresh(profile)
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise
|
||||
|
||||
logger.info("User %s created IMAP ingestion profile %d ('%s')", owner_id, profile.id, body.name)
|
||||
return _to_response(profile)
|
||||
|
||||
|
||||
@router.get("/{profile_id}", summary="Get a single ingestion profile")
|
||||
def get_profile(profile_id: int, request: Request, db: DbSession, owner_id: CurrentOwner) -> dict[str, Any]:
|
||||
"""Return a single profile by ID. Only the owner or system profiles are accessible."""
|
||||
profile = db.query(ImapIngestionProfile).filter(ImapIngestionProfile.id == profile_id).first()
|
||||
if not profile or (profile.owner_id is not None and profile.owner_id != owner_id):
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ingestion profile not found")
|
||||
return _to_response(profile)
|
||||
|
||||
|
||||
@router.put("/{profile_id}", summary="Update an ingestion profile")
|
||||
def update_profile(
|
||||
profile_id: int,
|
||||
request: Request,
|
||||
body: ImapProfileUpdate,
|
||||
db: DbSession,
|
||||
owner_id: CurrentOwner,
|
||||
) -> dict[str, Any]:
|
||||
"""Update an existing ingestion profile. Built-in profiles cannot be modified."""
|
||||
profile = db.query(ImapIngestionProfile).filter(ImapIngestionProfile.id == profile_id).first()
|
||||
if not profile or (profile.owner_id is not None and profile.owner_id != owner_id):
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ingestion profile not found")
|
||||
if profile.is_builtin:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail="Built-in profiles cannot be modified.",
|
||||
)
|
||||
|
||||
if body.name is not None:
|
||||
profile.name = body.name
|
||||
if "description" in body.model_fields_set:
|
||||
profile.description = body.description
|
||||
if body.allowed_categories is not None:
|
||||
categories = _validate_categories(body.allowed_categories)
|
||||
profile.allowed_categories = json.dumps(categories)
|
||||
|
||||
profile.updated_at = datetime.now(timezone.utc)
|
||||
|
||||
try:
|
||||
db.commit()
|
||||
db.refresh(profile)
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise
|
||||
|
||||
logger.info("User %s updated IMAP ingestion profile %d", owner_id, profile_id)
|
||||
return _to_response(profile)
|
||||
|
||||
|
||||
@router.delete("/{profile_id}", status_code=status.HTTP_204_NO_CONTENT, summary="Delete an ingestion profile")
|
||||
def delete_profile(profile_id: int, request: Request, db: DbSession, owner_id: CurrentOwner) -> None:
|
||||
"""Delete an ingestion profile. Built-in profiles cannot be deleted."""
|
||||
profile = db.query(ImapIngestionProfile).filter(ImapIngestionProfile.id == profile_id).first()
|
||||
if not profile or (profile.owner_id is not None and profile.owner_id != owner_id):
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ingestion profile not found")
|
||||
if profile.is_builtin:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail="Built-in profiles cannot be deleted.",
|
||||
)
|
||||
|
||||
try:
|
||||
db.delete(profile)
|
||||
db.commit()
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise
|
||||
|
||||
logger.info("User %s deleted IMAP ingestion profile %d", owner_id, profile_id)
|
||||
@@ -0,0 +1,347 @@
|
||||
"""Mobile app API endpoints.
|
||||
|
||||
Provides endpoints specifically designed for the DocuElevate native mobile
|
||||
app (iOS / Android via React Native / Expo):
|
||||
|
||||
* ``POST /mobile/generate-token`` – exchange an active session for a
|
||||
long-lived API token that the mobile app stores securely. The token is
|
||||
auto-named "Mobile App – <device_name>" and is identical to regular API
|
||||
tokens (Bearer auth works everywhere).
|
||||
|
||||
* ``POST /mobile/register-device`` – register a push-notification device
|
||||
token (Expo push token) so the user receives push notifications when
|
||||
documents finish processing.
|
||||
|
||||
* ``GET /mobile/devices`` – list registered devices for the current user.
|
||||
|
||||
* ``DELETE /mobile/devices/{device_id}`` – deactivate a device.
|
||||
|
||||
* ``GET /mobile/whoami`` – lightweight profile endpoint for the mobile app
|
||||
to verify authentication state.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from datetime import datetime, timezone
|
||||
from typing import Annotated, Any
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from pydantic import BaseModel, Field
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.api.api_tokens import generate_api_token, hash_token
|
||||
from app.auth import require_login
|
||||
from app.database import get_db
|
||||
from app.models import ApiToken, MobileDevice
|
||||
from app.utils.user_scope import get_current_owner_id
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter(prefix="/mobile", tags=["mobile"])
|
||||
|
||||
DbSession = Annotated[Session, Depends(get_db)]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Auth helper
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _get_owner_id(request: Request) -> str:
|
||||
"""Return the current user's owner ID, raising 401 if unauthenticated."""
|
||||
owner_id = get_current_owner_id(request)
|
||||
if not owner_id:
|
||||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated")
|
||||
return owner_id
|
||||
|
||||
|
||||
CurrentOwner = Annotated[str, Depends(_get_owner_id)]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Request / Response schemas
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class GenerateTokenRequest(BaseModel):
|
||||
"""Request body for auto-generating a mobile app token."""
|
||||
|
||||
device_name: str = Field(
|
||||
default="Mobile App",
|
||||
min_length=1,
|
||||
max_length=120,
|
||||
description="Human-readable device name used to label the token.",
|
||||
)
|
||||
|
||||
|
||||
class GenerateTokenResponse(BaseModel):
|
||||
"""Response containing the one-time-visible API token."""
|
||||
|
||||
token: str
|
||||
token_id: int
|
||||
name: str
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class RegisterDeviceRequest(BaseModel):
|
||||
"""Request body for registering a push-notification device token."""
|
||||
|
||||
push_token: str = Field(
|
||||
min_length=1,
|
||||
max_length=512,
|
||||
description="Expo push token (ExponentPushToken[…]) obtained from the mobile app.",
|
||||
)
|
||||
device_name: str | None = Field(
|
||||
default=None,
|
||||
max_length=255,
|
||||
description="Optional human-readable device name (e.g. 'John's iPhone').",
|
||||
)
|
||||
platform: str = Field(
|
||||
default="ios",
|
||||
description="Device platform: 'ios', 'android', or 'web'.",
|
||||
)
|
||||
|
||||
|
||||
class DeviceResponse(BaseModel):
|
||||
"""Serialised MobileDevice record."""
|
||||
|
||||
id: int
|
||||
device_name: str | None
|
||||
platform: str
|
||||
push_token_preview: str
|
||||
is_active: bool
|
||||
created_at: datetime
|
||||
last_seen_at: datetime | None
|
||||
|
||||
|
||||
class WhoAmIResponse(BaseModel):
|
||||
"""Lightweight profile response for the mobile app."""
|
||||
|
||||
owner_id: str
|
||||
display_name: str | None
|
||||
email: str | None
|
||||
avatar_url: str | None
|
||||
is_admin: bool
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _device_to_response(device: MobileDevice) -> dict[str, Any]:
|
||||
"""Convert a MobileDevice ORM object to a serialisable dict."""
|
||||
# Show only first 20 chars of the push token for security.
|
||||
token_preview = device.push_token[:20] + "…" if len(device.push_token) > 20 else device.push_token
|
||||
return {
|
||||
"id": device.id,
|
||||
"device_name": device.device_name,
|
||||
"platform": device.platform,
|
||||
"push_token_preview": token_preview,
|
||||
"is_active": device.is_active,
|
||||
"created_at": device.created_at,
|
||||
"last_seen_at": device.last_seen_at,
|
||||
}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Endpoints
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@router.post("/generate-token", status_code=status.HTTP_201_CREATED, response_model=GenerateTokenResponse)
|
||||
@require_login
|
||||
async def generate_mobile_token(
|
||||
request: Request,
|
||||
body: GenerateTokenRequest,
|
||||
owner_id: CurrentOwner,
|
||||
db: DbSession,
|
||||
) -> dict[str, Any]:
|
||||
"""Generate a long-lived API token for the mobile app.
|
||||
|
||||
The mobile app calls this endpoint immediately after SSO login to obtain
|
||||
a Bearer token it can store in the secure keychain. The returned token
|
||||
is functionally identical to manually-created API tokens and works with
|
||||
every authenticated endpoint.
|
||||
|
||||
The token is shown **exactly once** in the response; subsequent requests
|
||||
show only the prefix for identification.
|
||||
"""
|
||||
token_name = f"Mobile App – {body.device_name}"
|
||||
plaintext = generate_api_token()
|
||||
token_hash_value = hash_token(plaintext)
|
||||
prefix = plaintext[:12]
|
||||
|
||||
db_token = ApiToken(
|
||||
owner_id=owner_id,
|
||||
name=token_name,
|
||||
token_hash=token_hash_value,
|
||||
token_prefix=prefix,
|
||||
)
|
||||
try:
|
||||
db.add(db_token)
|
||||
db.commit()
|
||||
db.refresh(db_token)
|
||||
except Exception:
|
||||
db.rollback()
|
||||
logger.exception("Failed to create mobile API token for owner_id=%s", owner_id)
|
||||
raise
|
||||
|
||||
logger.info("Mobile API token created: id=%s owner=%s device=%r", db_token.id, owner_id, body.device_name)
|
||||
|
||||
return {
|
||||
"token": plaintext,
|
||||
"token_id": db_token.id,
|
||||
"name": token_name,
|
||||
"created_at": db_token.created_at,
|
||||
}
|
||||
|
||||
|
||||
@router.post("/register-device", status_code=status.HTTP_201_CREATED, response_model=DeviceResponse)
|
||||
@require_login
|
||||
async def register_device(
|
||||
request: Request,
|
||||
body: RegisterDeviceRequest,
|
||||
owner_id: CurrentOwner,
|
||||
db: DbSession,
|
||||
) -> dict[str, Any]:
|
||||
"""Register or refresh a push-notification device token.
|
||||
|
||||
If the same ``push_token`` is already registered for this user the
|
||||
record is reactivated and ``last_seen_at`` is updated rather than
|
||||
creating a duplicate.
|
||||
"""
|
||||
platform = body.platform.lower()
|
||||
if platform not in {"ios", "android", "web"}:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
detail="platform must be one of: ios, android, web",
|
||||
)
|
||||
|
||||
now = datetime.now(timezone.utc)
|
||||
|
||||
# Upsert: reuse existing record if the token is already known.
|
||||
existing = (
|
||||
db.query(MobileDevice)
|
||||
.filter(MobileDevice.owner_id == owner_id, MobileDevice.push_token == body.push_token)
|
||||
.first()
|
||||
)
|
||||
if existing:
|
||||
existing.is_active = True
|
||||
existing.last_seen_at = now
|
||||
if body.device_name:
|
||||
existing.device_name = body.device_name
|
||||
try:
|
||||
db.commit()
|
||||
db.refresh(existing)
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise
|
||||
logger.info("Mobile device refreshed: id=%s owner=%s", existing.id, owner_id)
|
||||
return _device_to_response(existing)
|
||||
|
||||
device = MobileDevice(
|
||||
owner_id=owner_id,
|
||||
device_name=body.device_name,
|
||||
platform=platform,
|
||||
push_token=body.push_token,
|
||||
is_active=True,
|
||||
last_seen_at=now,
|
||||
)
|
||||
try:
|
||||
db.add(device)
|
||||
db.commit()
|
||||
db.refresh(device)
|
||||
except Exception:
|
||||
db.rollback()
|
||||
logger.exception("Failed to register mobile device for owner_id=%s", owner_id)
|
||||
raise
|
||||
|
||||
logger.info("Mobile device registered: id=%s owner=%s platform=%s", device.id, owner_id, platform)
|
||||
return _device_to_response(device)
|
||||
|
||||
|
||||
@router.get("/devices", response_model=list[DeviceResponse])
|
||||
@require_login
|
||||
async def list_devices(
|
||||
request: Request,
|
||||
owner_id: CurrentOwner,
|
||||
db: DbSession,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""List all registered push-notification devices for the current user."""
|
||||
devices = (
|
||||
db.query(MobileDevice).filter(MobileDevice.owner_id == owner_id).order_by(MobileDevice.created_at.desc()).all()
|
||||
)
|
||||
return [_device_to_response(d) for d in devices]
|
||||
|
||||
|
||||
@router.delete("/devices/{device_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
@require_login
|
||||
async def deactivate_device(
|
||||
request: Request,
|
||||
device_id: int,
|
||||
owner_id: CurrentOwner,
|
||||
db: DbSession,
|
||||
) -> None:
|
||||
"""Deactivate a push-notification device registration.
|
||||
|
||||
The device record is kept for audit purposes but will no longer receive
|
||||
push notifications.
|
||||
"""
|
||||
device = db.get(MobileDevice, device_id)
|
||||
if not device or device.owner_id != owner_id:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Device not found")
|
||||
|
||||
device.is_active = False
|
||||
try:
|
||||
db.commit()
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise
|
||||
|
||||
logger.info("Mobile device deactivated: id=%s owner=%s", device_id, owner_id)
|
||||
|
||||
|
||||
@router.get("/whoami", response_model=WhoAmIResponse)
|
||||
@require_login
|
||||
async def whoami(
|
||||
request: Request,
|
||||
owner_id: CurrentOwner,
|
||||
db: DbSession,
|
||||
) -> dict[str, Any]:
|
||||
"""Return basic profile information for the authenticated user.
|
||||
|
||||
The mobile app calls this after token exchange to populate the user
|
||||
profile screen and verify that the stored token is still valid.
|
||||
"""
|
||||
from app.auth import get_gravatar_url
|
||||
from app.models import LocalUser, UserProfile
|
||||
|
||||
profile = db.query(UserProfile).filter(UserProfile.user_id == owner_id).first()
|
||||
local_user = db.query(LocalUser).filter(LocalUser.email == owner_id).first()
|
||||
|
||||
display_name: str | None = None
|
||||
email: str | None = None
|
||||
avatar_url: str | None = None
|
||||
is_admin = False
|
||||
|
||||
if profile:
|
||||
display_name = profile.display_name
|
||||
|
||||
if local_user:
|
||||
email = local_user.email
|
||||
is_admin = bool(local_user.is_admin)
|
||||
if not display_name and local_user.display_name:
|
||||
display_name = local_user.display_name
|
||||
elif "@" in owner_id:
|
||||
# SSO users commonly have their email as owner_id
|
||||
email = owner_id
|
||||
|
||||
if email:
|
||||
avatar_url = get_gravatar_url(email)
|
||||
|
||||
return {
|
||||
"owner_id": owner_id,
|
||||
"display_name": display_name,
|
||||
"email": email,
|
||||
"avatar_url": avatar_url,
|
||||
"is_admin": is_admin,
|
||||
}
|
||||
+280
-1
@@ -15,6 +15,7 @@ from starlette.responses import RedirectResponse
|
||||
|
||||
from app.config import settings
|
||||
from app.database import get_db
|
||||
from app.middleware.audit_log import get_client_ip
|
||||
|
||||
# Conditional imports: only used when multi_user_enabled=True. Imported here at
|
||||
# module level (not inside auth()) so they don't incur repeated import overhead.
|
||||
@@ -38,6 +39,9 @@ templates = Jinja2Templates(directory=str(templates_dir))
|
||||
OAUTH_CONFIGURED = False
|
||||
OAUTH_PROVIDER_NAME = "Single Sign-On"
|
||||
|
||||
# Social login providers that are enabled and registered
|
||||
SOCIAL_PROVIDERS: dict[str, dict[str, str]] = {}
|
||||
|
||||
if AUTH_ENABLED and settings.authentik_client_id and settings.authentik_client_secret:
|
||||
oauth.register(
|
||||
name="authentik",
|
||||
@@ -49,6 +53,68 @@ if AUTH_ENABLED and settings.authentik_client_id and settings.authentik_client_s
|
||||
OAUTH_CONFIGURED = True
|
||||
OAUTH_PROVIDER_NAME = settings.oauth_provider_name or "Authentik SSO"
|
||||
|
||||
# --- Social Login Providers ---------------------------------------------------
|
||||
if AUTH_ENABLED and settings.social_auth_google_enabled:
|
||||
if settings.social_auth_google_client_id and settings.social_auth_google_client_secret:
|
||||
oauth.register(
|
||||
name="google",
|
||||
client_id=settings.social_auth_google_client_id,
|
||||
client_secret=settings.social_auth_google_client_secret,
|
||||
server_metadata_url="https://accounts.google.com/.well-known/openid-configuration",
|
||||
client_kwargs={"scope": "openid profile email"},
|
||||
)
|
||||
SOCIAL_PROVIDERS["google"] = {"name": "Google", "icon": "fab fa-google", "color": "red"}
|
||||
logger.info("Social login provider registered: Google")
|
||||
else:
|
||||
logger.warning("SOCIAL_AUTH_GOOGLE_ENABLED=true but client ID/secret not configured")
|
||||
|
||||
if AUTH_ENABLED and settings.social_auth_microsoft_enabled:
|
||||
if settings.social_auth_microsoft_client_id and settings.social_auth_microsoft_client_secret:
|
||||
tenant = settings.social_auth_microsoft_tenant or "common"
|
||||
oauth.register(
|
||||
name="microsoft",
|
||||
client_id=settings.social_auth_microsoft_client_id,
|
||||
client_secret=settings.social_auth_microsoft_client_secret,
|
||||
server_metadata_url=f"https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration",
|
||||
client_kwargs={"scope": "openid profile email"},
|
||||
)
|
||||
SOCIAL_PROVIDERS["microsoft"] = {"name": "Microsoft", "icon": "fab fa-microsoft", "color": "blue"}
|
||||
logger.info("Social login provider registered: Microsoft (tenant=%s)", tenant)
|
||||
else:
|
||||
logger.warning("SOCIAL_AUTH_MICROSOFT_ENABLED=true but client ID/secret not configured")
|
||||
|
||||
if AUTH_ENABLED and settings.social_auth_apple_enabled:
|
||||
if settings.social_auth_apple_client_id and settings.social_auth_apple_team_id:
|
||||
oauth.register(
|
||||
name="apple",
|
||||
client_id=settings.social_auth_apple_client_id,
|
||||
server_metadata_url="https://appleid.apple.com/.well-known/openid-configuration",
|
||||
client_kwargs={
|
||||
"scope": "openid name email",
|
||||
"response_mode": "form_post",
|
||||
},
|
||||
)
|
||||
SOCIAL_PROVIDERS["apple"] = {"name": "Apple", "icon": "fab fa-apple", "color": "gray"}
|
||||
logger.info("Social login provider registered: Apple")
|
||||
else:
|
||||
logger.warning("SOCIAL_AUTH_APPLE_ENABLED=true but client ID/team ID not configured")
|
||||
|
||||
if AUTH_ENABLED and settings.social_auth_dropbox_enabled:
|
||||
if settings.social_auth_dropbox_client_id and settings.social_auth_dropbox_client_secret:
|
||||
oauth.register(
|
||||
name="dropbox",
|
||||
client_id=settings.social_auth_dropbox_client_id,
|
||||
client_secret=settings.social_auth_dropbox_client_secret,
|
||||
authorize_url="https://www.dropbox.com/oauth2/authorize",
|
||||
access_token_url="https://api.dropboxapi.com/oauth2/token",
|
||||
userinfo_endpoint="https://api.dropboxapi.com/2/users/get_current_account",
|
||||
client_kwargs={"token_endpoint_auth_method": "client_secret_post"},
|
||||
)
|
||||
SOCIAL_PROVIDERS["dropbox"] = {"name": "Dropbox", "icon": "fab fa-dropbox", "color": "blue"}
|
||||
logger.info("Social login provider registered: Dropbox")
|
||||
else:
|
||||
logger.warning("SOCIAL_AUTH_DROPBOX_ENABLED=true but client ID/secret not configured")
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@@ -194,6 +260,7 @@ async def login(request: Request):
|
||||
"message": request.query_params.get("message"),
|
||||
"show_oauth": OAUTH_CONFIGURED,
|
||||
"oauth_provider_name": OAUTH_PROVIDER_NAME,
|
||||
"social_providers": SOCIAL_PROVIDERS,
|
||||
"app_version": settings.version,
|
||||
"csrf_token": getattr(request.state, "csrf_token", ""),
|
||||
# "Create account" link is only shown when multi-user mode AND local signup are both enabled
|
||||
@@ -211,6 +278,149 @@ async def oauth_login(request: Request):
|
||||
return await oauth.authentik.authorize_redirect(request, redirect_uri)
|
||||
|
||||
|
||||
async def social_login(request: Request, provider: str):
|
||||
"""Initiate a social login flow for the given provider.
|
||||
|
||||
Args:
|
||||
request: The current FastAPI request.
|
||||
provider: One of the registered social provider keys (google, microsoft, apple, dropbox).
|
||||
|
||||
Returns:
|
||||
A redirect to the provider's authorization page, or back to /login on error.
|
||||
"""
|
||||
if provider not in SOCIAL_PROVIDERS:
|
||||
return RedirectResponse(url="/login?error=Unknown+social+provider", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
redirect_uri = request.url_for("social_callback", provider=provider)
|
||||
oauth_client = getattr(oauth, provider, None)
|
||||
if oauth_client is None:
|
||||
return RedirectResponse(url="/login?error=Provider+not+configured", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
return await oauth_client.authorize_redirect(request, redirect_uri)
|
||||
|
||||
|
||||
def _normalize_social_userinfo(provider: str, token: dict, raw_userinfo: dict | None) -> dict:
|
||||
"""Normalize the userinfo payload from different social providers into a common format.
|
||||
|
||||
Returns a dict with keys: sub, email, name, preferred_username, picture.
|
||||
|
||||
Args:
|
||||
provider: The social provider key (google, microsoft, apple, dropbox).
|
||||
token: The OAuth token response from the provider. Included for future
|
||||
provider-specific claim extraction (e.g. ``id_token`` claims).
|
||||
raw_userinfo: The raw userinfo dict (may be None for providers without standard OIDC userinfo).
|
||||
|
||||
Returns:
|
||||
A normalized user-data dict compatible with the session user format.
|
||||
"""
|
||||
userinfo: dict = raw_userinfo or {}
|
||||
|
||||
if provider == "dropbox":
|
||||
# Dropbox returns a non-standard userinfo response
|
||||
email = userinfo.get("email", "")
|
||||
name_info = userinfo.get("name", {})
|
||||
display_name = name_info.get("display_name", "") if isinstance(name_info, dict) else str(name_info)
|
||||
return {
|
||||
"sub": userinfo.get("account_id", email),
|
||||
"email": email,
|
||||
"name": display_name,
|
||||
"preferred_username": email,
|
||||
"picture": userinfo.get("profile_photo_url", ""),
|
||||
}
|
||||
|
||||
# Standard OIDC providers (Google, Microsoft, Apple)
|
||||
return {
|
||||
"sub": userinfo.get("sub", ""),
|
||||
"email": userinfo.get("email", ""),
|
||||
"name": userinfo.get("name", ""),
|
||||
"preferred_username": userinfo.get("email", ""),
|
||||
"picture": userinfo.get("picture", ""),
|
||||
}
|
||||
|
||||
|
||||
async def social_callback(request: Request, provider: str, db: Session = Depends(get_db)):
|
||||
"""Handle the OAuth callback from a social login provider.
|
||||
|
||||
After the user authorizes with the social provider, this endpoint exchanges
|
||||
the authorization code for tokens, extracts user information, creates or
|
||||
updates the user profile, and establishes a session.
|
||||
|
||||
Args:
|
||||
request: The current FastAPI request.
|
||||
provider: One of the registered social provider keys.
|
||||
db: Database session (injected).
|
||||
|
||||
Returns:
|
||||
A redirect to the user's original destination or the upload page.
|
||||
"""
|
||||
if provider not in SOCIAL_PROVIDERS:
|
||||
return RedirectResponse(url="/login?error=Unknown+social+provider", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
oauth_client = getattr(oauth, provider, None)
|
||||
if oauth_client is None:
|
||||
return RedirectResponse(url="/login?error=Provider+not+configured", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
try:
|
||||
token = await oauth_client.authorize_access_token(request)
|
||||
|
||||
# Try standard OIDC userinfo first, fall back to token-embedded userinfo
|
||||
raw_userinfo = token.get("userinfo")
|
||||
if not raw_userinfo:
|
||||
try:
|
||||
resp = await oauth_client.userinfo(token=token)
|
||||
raw_userinfo = resp if isinstance(resp, dict) else resp.json() if hasattr(resp, "json") else {}
|
||||
except Exception:
|
||||
raw_userinfo = {}
|
||||
|
||||
user_data = _normalize_social_userinfo(provider, token, raw_userinfo)
|
||||
|
||||
if not user_data.get("email"):
|
||||
return RedirectResponse(
|
||||
url="/login?error=Could+not+retrieve+email+from+provider",
|
||||
status_code=status.HTTP_302_FOUND,
|
||||
)
|
||||
|
||||
# Add Gravatar if no picture provided
|
||||
if not user_data.get("picture") and user_data.get("email"):
|
||||
user_data["picture"] = get_gravatar_url(user_data["email"])
|
||||
|
||||
# Tag the login source for audit/debugging
|
||||
user_data["auth_provider"] = provider
|
||||
|
||||
# Social login users are never admin by default (admin must be granted
|
||||
# via the Authentik/OIDC admin group or manually in the admin panel)
|
||||
user_data["is_admin"] = False
|
||||
|
||||
request.session["user"] = user_data
|
||||
|
||||
# Auto-create or update UserProfile
|
||||
_ensure_user_profile(db, user_data, is_admin=False)
|
||||
|
||||
provider_name = SOCIAL_PROVIDERS[provider]["name"]
|
||||
logger.info(
|
||||
"[SECURITY] SOCIAL_LOGIN_SUCCESS provider=%s user=%s", provider_name, user_data.get("email", "unknown")
|
||||
)
|
||||
|
||||
# Redirect first-time users to onboarding
|
||||
user_id = (
|
||||
user_data.get("sub") or user_data.get("preferred_username") or user_data.get("email") or user_data.get("id")
|
||||
)
|
||||
if user_id:
|
||||
profile = db.query(_UserProfile).filter(_UserProfile.user_id == user_id).first()
|
||||
if profile and not profile.onboarding_completed:
|
||||
post_onboarding = request.session.pop("redirect_after_login", "/upload")
|
||||
request.session["post_onboarding_redirect"] = post_onboarding
|
||||
return RedirectResponse(url="/onboarding", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
redirect_url = request.session.pop("redirect_after_login", "/upload")
|
||||
return RedirectResponse(url=redirect_url, status_code=status.HTTP_302_FOUND)
|
||||
except Exception as e:
|
||||
logger.warning("[SECURITY] SOCIAL_LOGIN_FAILURE provider=%s error=%s", provider, type(e).__name__)
|
||||
return RedirectResponse(
|
||||
url="/login?error=Social+login+failed.+Please+try+again.", status_code=status.HTTP_302_FOUND
|
||||
)
|
||||
|
||||
|
||||
def _ensure_user_profile(db: Session, user_data: dict, is_admin: bool = False) -> None:
|
||||
"""Create or update a UserProfile row for *user_data*.
|
||||
|
||||
@@ -344,6 +554,13 @@ async def oauth_callback(request: Request, db: Session = Depends(get_db)):
|
||||
|
||||
# Log the successful authentication
|
||||
logger.info("[SECURITY] OAUTH_LOGIN_SUCCESS user=%s admin=%s", user_data.get("email", "unknown"), is_admin)
|
||||
_record_login_event(
|
||||
db,
|
||||
request,
|
||||
user_data.get("email") or user_data.get("preferred_username") or "unknown",
|
||||
success=True,
|
||||
method="oauth",
|
||||
)
|
||||
|
||||
# Redirect first-time users to onboarding
|
||||
user_id = (
|
||||
@@ -364,6 +581,48 @@ async def oauth_callback(request: Request, db: Session = Depends(get_db)):
|
||||
return RedirectResponse(url=f"/login?error=Authentication+failed:+{str(e)}", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
def _record_login_event(
|
||||
db: Session,
|
||||
request: Request,
|
||||
username: str,
|
||||
*,
|
||||
success: bool,
|
||||
method: str = "local",
|
||||
detail: str | None = None,
|
||||
) -> None:
|
||||
"""Write a login or login-failure audit event to the database.
|
||||
|
||||
Failures are silently swallowed so that an audit-service error never
|
||||
prevents a legitimate login or surfaces an unrelated 500 error to the user.
|
||||
|
||||
Args:
|
||||
db: Active database session.
|
||||
request: The current HTTP request (used to extract the client IP).
|
||||
username: The username that attempted authentication.
|
||||
success: ``True`` for a successful login, ``False`` for a failure.
|
||||
method: Authentication method, e.g. ``"local"`` or ``"oauth"``.
|
||||
detail: Optional extra context for failures (e.g. ``"wrong_password"``).
|
||||
"""
|
||||
try:
|
||||
from app.utils.audit_service import record_event
|
||||
|
||||
action = "login" if success else "login.failure"
|
||||
details: dict = {"method": method}
|
||||
if detail:
|
||||
details["reason"] = detail
|
||||
record_event(
|
||||
db,
|
||||
action=action,
|
||||
user=username,
|
||||
resource_type="session",
|
||||
ip_address=get_client_ip(request),
|
||||
details=details,
|
||||
severity="info" if success else "warning",
|
||||
)
|
||||
except Exception:
|
||||
logger.debug("Failed to write login audit event for user=%s", username, exc_info=True)
|
||||
|
||||
|
||||
async def auth(request: Request, db: Session = Depends(get_db)):
|
||||
"""Handle local username/password authentication.
|
||||
|
||||
@@ -413,6 +672,7 @@ async def auth(request: Request, db: Session = Depends(get_db)):
|
||||
username,
|
||||
local_user.is_active,
|
||||
)
|
||||
_record_login_event(db, request, username, success=False, detail="account_not_verified")
|
||||
return RedirectResponse(
|
||||
url="/login?error=Please+verify+your+email+address+before+logging+in",
|
||||
status_code=302,
|
||||
@@ -425,10 +685,12 @@ async def auth(request: Request, db: Session = Depends(get_db)):
|
||||
)
|
||||
if not pw_ok:
|
||||
logger.warning("[SECURITY] LOCAL_LOGIN_FAILURE reason=wrong_password user=%s", username)
|
||||
_record_login_event(db, request, username, success=False, detail="wrong_password")
|
||||
return RedirectResponse(url="/login?error=Invalid+username+or+password", status_code=302)
|
||||
user_data = _build_session_user(local_user)
|
||||
request.session["user"] = user_data
|
||||
logger.info("[SECURITY] LOCAL_LOGIN_SUCCESS user=%s", local_user.email)
|
||||
_record_login_event(db, request, local_user.email, success=True)
|
||||
_ensure_user_profile(db, user_data, is_admin=bool(local_user.is_admin))
|
||||
profile = db.query(_UserProfile).filter(_UserProfile.user_id == local_user.email).first()
|
||||
if profile and not profile.onboarding_completed:
|
||||
@@ -473,6 +735,7 @@ async def auth(request: Request, db: Session = Depends(get_db)):
|
||||
}
|
||||
request.session["user"] = admin_user_data
|
||||
logger.info("[SECURITY] LOCAL_LOGIN_SUCCESS user=%s", username)
|
||||
_record_login_event(db, request, username, success=True)
|
||||
_ensure_user_profile(db, admin_user_data, is_admin=True)
|
||||
redirect_url = request.session.pop("redirect_after_login", "/upload")
|
||||
return RedirectResponse(url=redirect_url, status_code=302)
|
||||
@@ -485,16 +748,30 @@ async def auth(request: Request, db: Session = Depends(get_db)):
|
||||
admin_configured,
|
||||
not username and not password,
|
||||
)
|
||||
_record_login_event(db, request, username or "anonymous", success=False, detail="invalid_credentials")
|
||||
return RedirectResponse(url="/login?error=Invalid+username+or+password", status_code=302)
|
||||
|
||||
|
||||
async def logout(request: Request):
|
||||
async def logout(request: Request, db: Session = Depends(get_db)):
|
||||
"""Handle user logout"""
|
||||
user = request.session.get("user")
|
||||
username = "unknown"
|
||||
if isinstance(user, dict):
|
||||
username = user.get("preferred_username") or user.get("email") or "unknown"
|
||||
logger.info(f"[SECURITY] LOGOUT user={username}")
|
||||
try:
|
||||
from app.utils.audit_service import record_event
|
||||
|
||||
record_event(
|
||||
db,
|
||||
action="logout",
|
||||
user=username,
|
||||
resource_type="session",
|
||||
ip_address=get_client_ip(request),
|
||||
severity="info",
|
||||
)
|
||||
except Exception:
|
||||
logger.debug("Failed to write logout audit event for user=%s", username, exc_info=True)
|
||||
request.session.pop("user", None)
|
||||
return RedirectResponse(url="/login?message=You+have+been+logged+out+successfully", status_code=302)
|
||||
|
||||
@@ -503,6 +780,8 @@ if AUTH_ENABLED:
|
||||
router.add_api_route("/login", login, methods=["GET"])
|
||||
router.add_api_route("/oauth-login", oauth_login, methods=["GET"])
|
||||
router.add_api_route("/oauth-callback", oauth_callback, methods=["GET"])
|
||||
router.add_api_route("/social-login/{provider}", social_login, methods=["GET"])
|
||||
router.add_api_route("/social-callback/{provider}", social_callback, methods=["GET"])
|
||||
router.add_api_route("/auth", auth, methods=["POST"])
|
||||
router.add_api_route("/logout", logout, methods=["GET"])
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ from app.tasks.upload_to_dropbox import upload_to_dropbox # noqa: F401
|
||||
from app.tasks.upload_to_email import upload_to_email # noqa: F401
|
||||
from app.tasks.upload_to_ftp import upload_to_ftp # noqa: F401
|
||||
from app.tasks.upload_to_google_drive import upload_to_google_drive # noqa: F401
|
||||
from app.tasks.upload_to_icloud import upload_to_icloud # noqa: F401
|
||||
from app.tasks.upload_to_nextcloud import upload_to_nextcloud # noqa: F401
|
||||
from app.tasks.upload_to_onedrive import upload_to_onedrive # noqa: F401
|
||||
from app.tasks.upload_to_paperless import upload_to_paperless # noqa: F401
|
||||
|
||||
+102
-1
@@ -49,18 +49,30 @@ class Settings(BaseSettings):
|
||||
debug: bool = False # Default to False
|
||||
|
||||
# Making Dropbox optional
|
||||
dropbox_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Dropbox as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
dropbox_app_key: Optional[str] = None
|
||||
dropbox_app_secret: Optional[str] = None
|
||||
dropbox_folder: Optional[str] = None
|
||||
dropbox_refresh_token: Optional[str] = None
|
||||
|
||||
# Making Nextcloud optional
|
||||
nextcloud_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Nextcloud as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
nextcloud_upload_url: Optional[str] = None
|
||||
nextcloud_username: Optional[str] = None
|
||||
nextcloud_password: Optional[str] = None
|
||||
nextcloud_folder: Optional[str] = None
|
||||
|
||||
# Making Paperless optional
|
||||
paperless_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Paperless-ngx as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
paperless_ngx_api_token: Optional[str] = None
|
||||
paperless_host: Optional[str] = None
|
||||
paperless_custom_field_absender: Optional[str] = None # Name of the "absender" custom field in Paperless
|
||||
@@ -166,12 +178,44 @@ class Settings(BaseSettings):
|
||||
),
|
||||
)
|
||||
|
||||
# Authentik
|
||||
# Authentik / Generic OIDC
|
||||
authentik_client_id: Optional[str] = None
|
||||
authentik_client_secret: Optional[str] = None
|
||||
authentik_config_url: Optional[str] = None
|
||||
oauth_provider_name: Optional[str] = None # Name to display for the OAuth provider
|
||||
|
||||
# Social Login Providers
|
||||
# Google OAuth2
|
||||
social_auth_google_enabled: bool = False
|
||||
social_auth_google_client_id: Optional[str] = None
|
||||
social_auth_google_client_secret: Optional[str] = None
|
||||
|
||||
# Microsoft OAuth2 (Azure AD / Microsoft Entra ID)
|
||||
social_auth_microsoft_enabled: bool = False
|
||||
social_auth_microsoft_client_id: Optional[str] = None
|
||||
social_auth_microsoft_client_secret: Optional[str] = None
|
||||
social_auth_microsoft_tenant: str = Field(
|
||||
default="common",
|
||||
description=(
|
||||
"Azure AD tenant ID or one of 'common', 'organizations', 'consumers'. "
|
||||
"Use 'common' to allow any Microsoft account and any Azure AD org. "
|
||||
"Use a specific tenant ID (GUID) to restrict to a single organization. "
|
||||
"Default: common."
|
||||
),
|
||||
)
|
||||
|
||||
# Apple Sign-In
|
||||
social_auth_apple_enabled: bool = False
|
||||
social_auth_apple_client_id: Optional[str] = None
|
||||
social_auth_apple_team_id: Optional[str] = None
|
||||
social_auth_apple_key_id: Optional[str] = None
|
||||
social_auth_apple_private_key: Optional[str] = None
|
||||
|
||||
# Dropbox OAuth2
|
||||
social_auth_dropbox_enabled: bool = False
|
||||
social_auth_dropbox_client_id: Optional[str] = None
|
||||
social_auth_dropbox_client_secret: Optional[str] = None
|
||||
|
||||
# Local user signup
|
||||
allow_local_signup: bool = Field(
|
||||
default=False,
|
||||
@@ -394,6 +438,10 @@ class Settings(BaseSettings):
|
||||
imap2_delete_after_process: bool = False
|
||||
|
||||
# Google Drive settings
|
||||
google_drive_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Google Drive as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
google_drive_credentials_json: Optional[str] = ""
|
||||
google_drive_folder_id: Optional[str] = ""
|
||||
google_drive_delegate_to: Optional[str] = "" # Optional delegated user email
|
||||
@@ -405,6 +453,10 @@ class Settings(BaseSettings):
|
||||
google_drive_refresh_token: Optional[str] = ""
|
||||
|
||||
# WebDAV settings
|
||||
webdav_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable WebDAV as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
webdav_url: Optional[str] = None
|
||||
webdav_username: Optional[str] = None
|
||||
webdav_password: Optional[str] = None
|
||||
@@ -412,6 +464,10 @@ class Settings(BaseSettings):
|
||||
webdav_verify_ssl: bool = True
|
||||
|
||||
# FTP settings
|
||||
ftp_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable FTP as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
ftp_host: Optional[str] = None
|
||||
ftp_port: Optional[int] = 21
|
||||
ftp_username: Optional[str] = None
|
||||
@@ -421,6 +477,10 @@ class Settings(BaseSettings):
|
||||
ftp_allow_plaintext: bool = True # Default to allowing plaintext fallback
|
||||
|
||||
# SFTP settings
|
||||
sftp_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable SFTP as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
sftp_host: Optional[str] = None
|
||||
sftp_port: Optional[int] = 22
|
||||
sftp_username: Optional[str] = None
|
||||
@@ -442,6 +502,10 @@ class Settings(BaseSettings):
|
||||
email_default_recipient: Optional[str] = None
|
||||
|
||||
# Email destination settings (dedicated SMTP for document delivery – decoupled from shared email above)
|
||||
dest_email_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Email as an upload destination. Set to False to disable document delivery via email even when credentials are configured.",
|
||||
)
|
||||
dest_email_host: Optional[str] = None
|
||||
dest_email_port: Optional[int] = 587
|
||||
dest_email_username: Optional[str] = None
|
||||
@@ -451,6 +515,10 @@ class Settings(BaseSettings):
|
||||
dest_email_default_recipient: Optional[str] = None # Fallback recipient for document delivery
|
||||
|
||||
# OneDrive settings
|
||||
onedrive_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable OneDrive as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
onedrive_client_id: Optional[str] = None
|
||||
onedrive_client_secret: Optional[str] = None
|
||||
onedrive_tenant_id: Optional[str] = "common" # Default to "common" for personal accounts
|
||||
@@ -458,6 +526,10 @@ class Settings(BaseSettings):
|
||||
onedrive_folder_path: Optional[str] = None
|
||||
|
||||
# AWS S3 settings
|
||||
s3_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable Amazon S3 as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
aws_access_key_id: Optional[str] = None
|
||||
aws_secret_access_key: Optional[str] = None
|
||||
aws_region: Optional[str] = "us-east-1" # Default region
|
||||
@@ -466,6 +538,16 @@ class Settings(BaseSettings):
|
||||
s3_storage_class: Optional[str] = "STANDARD" # Default storage class
|
||||
s3_acl: Optional[str] = "private" # Default ACL
|
||||
|
||||
# iCloud Drive settings
|
||||
icloud_enabled: bool = Field(
|
||||
default=True,
|
||||
description="Enable iCloud Drive as an upload destination. Set to False to disable uploads even when credentials are configured.",
|
||||
)
|
||||
icloud_username: Optional[str] = None # Apple ID email address
|
||||
icloud_password: Optional[str] = None # App-specific password (required for 2FA accounts)
|
||||
icloud_folder: Optional[str] = None # Target folder path in iCloud Drive (e.g. "Documents/Uploads")
|
||||
icloud_cookie_directory: Optional[str] = None # Directory for session cookies (default: ~/.pyicloud)
|
||||
|
||||
# Uptime Kuma settings
|
||||
uptime_kuma_url: Optional[str] = None
|
||||
uptime_kuma_ping_interval: int = 5 # Default ping interval in minutes
|
||||
@@ -484,6 +566,14 @@ class Settings(BaseSettings):
|
||||
|
||||
# Feature flags
|
||||
allow_file_delete: bool = True # Default to allowing file deletion from database
|
||||
compliance_enabled: bool = Field(
|
||||
default=True,
|
||||
description=(
|
||||
"Enable the compliance templates dashboard (GDPR, HIPAA, SOC 2). "
|
||||
"When enabled, admins can view compliance status and apply "
|
||||
"pre-built regulatory configurations. Default: True."
|
||||
),
|
||||
)
|
||||
|
||||
# PDF/A archival conversion settings
|
||||
enable_pdfa_conversion: bool = Field(
|
||||
@@ -557,6 +647,17 @@ class Settings(BaseSettings):
|
||||
),
|
||||
)
|
||||
|
||||
imap_attachment_filter: str = Field(
|
||||
default="documents_only",
|
||||
description=(
|
||||
"Controls which attachment types are ingested from IMAP emails. "
|
||||
"Accepted values: "
|
||||
"'documents_only' – ingest only PDFs and office files (Word, Excel, PowerPoint, ODT, etc.); "
|
||||
"'all' – ingest all supported file types including images. "
|
||||
"This is the global default; individual user IMAP accounts can override it."
|
||||
),
|
||||
)
|
||||
|
||||
# Batch processing settings
|
||||
processall_throttle_threshold: int = Field(
|
||||
default=20,
|
||||
|
||||
+36
-6
@@ -16,6 +16,7 @@ from starlette.middleware.trustedhost import TrustedHostMiddleware
|
||||
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
|
||||
|
||||
from app.api import router as api_router
|
||||
from app.api.graphql_api import graphql_router
|
||||
from app.api.local_auth import router as local_auth_router
|
||||
from app.auth import router as auth_router
|
||||
from app.config import settings
|
||||
@@ -146,6 +147,20 @@ async def lifespan(app: FastAPI):
|
||||
except Exception:
|
||||
logging.debug("Scheduled jobs seeding skipped — DB may not be ready yet") # noqa: S110
|
||||
|
||||
# Seed the built-in compliance templates (GDPR, HIPAA, SOC2) so they
|
||||
# are available in the admin compliance dashboard on first startup.
|
||||
try:
|
||||
from app.database import SessionLocal as _SessionLocal # noqa: F811
|
||||
from app.utils.compliance_service import seed_compliance_templates as _seed_compliance
|
||||
|
||||
_db_compliance = _SessionLocal()
|
||||
try:
|
||||
_seed_compliance(_db_compliance)
|
||||
finally:
|
||||
_db_compliance.close()
|
||||
except Exception:
|
||||
logging.debug("Compliance template seeding skipped — DB may not be ready yet") # noqa: S110
|
||||
|
||||
# Application is now running
|
||||
yield
|
||||
|
||||
@@ -239,6 +254,21 @@ else:
|
||||
|
||||
|
||||
# Custom exception handlers that return JSON for API routes and HTML for frontend routes
|
||||
# These use their own separate templates instance so that patches in tests on individual
|
||||
# view modules do not affect the error handler rendering.
|
||||
_error_templates_dir = pathlib.Path(__file__).parents[1] / "frontend" / "templates"
|
||||
_error_templates = Jinja2Templates(directory=str(_error_templates_dir))
|
||||
# Register the i18n translate helper as a global so error templates can use {{ _("key") }}.
|
||||
# Error pages use the default language (English); request-specific locale is not needed here.
|
||||
from app.utils.i18n import SUPPORTED_LANGUAGES as _SUPPORTED_LANGUAGES # noqa: E402
|
||||
from app.utils.i18n import translate as _translate_fn # noqa: E402
|
||||
|
||||
_error_templates.env.globals["_"] = lambda key, **kwargs: _translate_fn(key, "en", **kwargs)
|
||||
_error_templates.env.globals["min"] = min
|
||||
_error_templates.env.globals["max"] = max
|
||||
_error_templates.env.globals["supported_languages"] = _SUPPORTED_LANGUAGES
|
||||
|
||||
|
||||
@app.exception_handler(HTTPException)
|
||||
async def http_exception_handler(request: Request, exc: HTTPException):
|
||||
"""
|
||||
@@ -250,15 +280,15 @@ async def http_exception_handler(request: Request, exc: HTTPException):
|
||||
return JSONResponse(status_code=exc.status_code, content={"detail": exc.detail})
|
||||
|
||||
# For frontend routes, return appropriate HTML templates
|
||||
templates = Jinja2Templates(directory=str(static_dir.parent / "templates"))
|
||||
|
||||
# Handle 404 errors with a custom template
|
||||
if exc.status_code == 404:
|
||||
return templates.TemplateResponse("404.html", {"request": request}, status_code=status.HTTP_404_NOT_FOUND)
|
||||
return _error_templates.TemplateResponse(
|
||||
"404.html", {"request": request}, status_code=status.HTTP_404_NOT_FOUND
|
||||
)
|
||||
|
||||
# For other HTTP errors, we could create specific templates or use a generic one
|
||||
# For now, return a simple error page
|
||||
return templates.TemplateResponse(
|
||||
return _error_templates.TemplateResponse(
|
||||
"404.html", # Reuse 404 template for other errors, or create a generic error template
|
||||
{"request": request},
|
||||
status_code=exc.status_code,
|
||||
@@ -279,8 +309,7 @@ async def custom_500_handler(request: Request, exc: Exception):
|
||||
)
|
||||
|
||||
# Serve the 500 template for non-API routes
|
||||
templates = Jinja2Templates(directory=str(static_dir.parent / "templates"))
|
||||
return templates.TemplateResponse(
|
||||
return _error_templates.TemplateResponse(
|
||||
"500.html",
|
||||
{"request": request, "exc": exc},
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
@@ -298,3 +327,4 @@ app.include_router(files_router) # Explicitly include the files router
|
||||
app.include_router(auth_router)
|
||||
app.include_router(local_auth_router)
|
||||
app.include_router(api_router, prefix="/api")
|
||||
app.include_router(graphql_router, prefix="/graphql")
|
||||
|
||||
+105
@@ -401,6 +401,48 @@ class PipelineStep(Base):
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class ImapIngestionProfile(Base):
|
||||
"""Named ingestion profile controlling which attachment types are accepted from IMAP emails.
|
||||
|
||||
Profiles group file-type categories (e.g. "pdf", "office", "images") so users
|
||||
can precisely control what gets ingested from each mailbox.
|
||||
|
||||
System-provided built-in profiles (``is_builtin=True``) are seeded by the
|
||||
migration and cannot be deleted or renamed. Users may create their own profiles
|
||||
(``owner_id`` set to their identifier) or rely on the global system profiles
|
||||
(``owner_id=None``).
|
||||
|
||||
``allowed_categories`` stores a JSON list of category strings, e.g.::
|
||||
|
||||
'["pdf", "office", "opendocument", "text", "web"]'
|
||||
|
||||
Valid category names are defined in ``app.utils.allowed_types.FILE_TYPE_CATEGORIES``.
|
||||
"""
|
||||
|
||||
__tablename__ = "imap_ingestion_profiles"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
|
||||
# Human-readable profile name (e.g. "Documents Only", "Documents + Images")
|
||||
name = Column(String(255), nullable=False)
|
||||
|
||||
# Optional description shown in the UI
|
||||
description = Column(Text, nullable=True)
|
||||
|
||||
# Owner of this profile. NULL = global/system profile available to all users.
|
||||
owner_id = Column(String, nullable=True, index=True)
|
||||
|
||||
# JSON-encoded list of enabled category keys. Example: '["pdf","office","text"]'
|
||||
# See FILE_TYPE_CATEGORIES in app/utils/allowed_types.py for valid values.
|
||||
allowed_categories = Column(Text, nullable=False, default='["pdf","office","opendocument","text","web"]')
|
||||
|
||||
# Built-in system profiles that cannot be deleted or modified via the API.
|
||||
is_builtin = Column(Boolean, nullable=False, default=False)
|
||||
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class UserImapAccount(Base):
|
||||
"""Per-user IMAP ingestion account.
|
||||
|
||||
@@ -439,6 +481,10 @@ class UserImapAccount(Base):
|
||||
# When True, emails are deleted from the mailbox after their attachments are processed
|
||||
delete_after_process = Column(Boolean, nullable=False, default=False)
|
||||
|
||||
# Optional reference to an ImapIngestionProfile.
|
||||
# NULL means "use the global imap_attachment_filter setting" (system default).
|
||||
profile_id = Column(Integer, ForeignKey("imap_ingestion_profiles.id"), nullable=True)
|
||||
|
||||
# When False the account is not polled by the periodic task (but not deleted)
|
||||
is_active = Column(Boolean, nullable=False, default=True)
|
||||
|
||||
@@ -530,6 +576,7 @@ class IntegrationType:
|
||||
EMAIL = "EMAIL"
|
||||
PAPERLESS = "PAPERLESS"
|
||||
RCLONE = "RCLONE"
|
||||
ICLOUD = "ICLOUD"
|
||||
|
||||
ALL = {
|
||||
IMAP,
|
||||
@@ -546,6 +593,7 @@ class IntegrationType:
|
||||
EMAIL,
|
||||
PAPERLESS,
|
||||
RCLONE,
|
||||
ICLOUD,
|
||||
}
|
||||
|
||||
|
||||
@@ -858,3 +906,60 @@ class ScheduledJob(Base):
|
||||
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class MobileDevice(Base):
|
||||
"""Registered mobile device for push notifications.
|
||||
|
||||
Stores the push token (Expo push token, FCM token, or APNs token) for a
|
||||
specific user device so that document-processing events can be forwarded
|
||||
as push notifications to the native mobile app.
|
||||
"""
|
||||
|
||||
__tablename__ = "mobile_devices"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
|
||||
# User that owns this device registration.
|
||||
owner_id = Column(String, nullable=False, index=True)
|
||||
|
||||
# Human-readable name the user gave this device (e.g. "John's iPhone").
|
||||
device_name = Column(String(255), nullable=True)
|
||||
|
||||
# Platform: "ios", "android", or "web".
|
||||
platform = Column(String(20), nullable=False, default="ios")
|
||||
|
||||
# Expo push token (ExponentPushToken[…]) or raw FCM/APNs token.
|
||||
push_token = Column(String(512), nullable=False)
|
||||
|
||||
# Whether push notifications are enabled for this device.
|
||||
is_active = Column(Boolean, nullable=False, default=True)
|
||||
|
||||
# Timestamps.
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
last_seen_at = Column(DateTime(timezone=True), nullable=True)
|
||||
|
||||
__table_args__ = (UniqueConstraint("owner_id", "push_token", name="uq_mobile_device_owner_token"),)
|
||||
|
||||
|
||||
class ComplianceTemplate(Base):
|
||||
"""Pre-built compliance configuration templates (GDPR, HIPAA, SOC2).
|
||||
|
||||
Each row represents an applied compliance template. The ``settings_json``
|
||||
column stores the concrete setting key/value pairs that were written when
|
||||
the template was applied. ``status`` tracks the current compliance posture.
|
||||
"""
|
||||
|
||||
__tablename__ = "compliance_templates"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
name = Column(String(50), unique=True, nullable=False, index=True) # GDPR, HIPAA, SOC2
|
||||
display_name = Column(String(100), nullable=False)
|
||||
description = Column(Text, nullable=True)
|
||||
settings_json = Column(Text, nullable=False, default="{}") # JSON of applied settings
|
||||
enabled = Column(Boolean, nullable=False, default=False)
|
||||
status = Column(String(20), nullable=False, default="not_applied") # not_applied, compliant, partial, non_compliant
|
||||
applied_at = Column(DateTime(timezone=True), nullable=True)
|
||||
applied_by = Column(String(255), nullable=True)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
+92
-25
@@ -13,7 +13,11 @@ from celery import shared_task
|
||||
from app.config import settings
|
||||
from app.tasks.convert_to_pdf import convert_to_pdf # new conversion task
|
||||
from app.tasks.process_document import process_document # Updated import
|
||||
from app.utils.allowed_types import ALLOWED_EXTENSIONS, ALLOWED_MIME_TYPES
|
||||
from app.utils.allowed_types import (
|
||||
ALL_CATEGORIES,
|
||||
DEFAULT_CATEGORIES,
|
||||
get_allowed_types_for_categories,
|
||||
)
|
||||
|
||||
# Database session for per-user IMAP accounts (imported lazily to avoid circular imports)
|
||||
_db_session_factory = None
|
||||
@@ -50,6 +54,38 @@ def _decrypt_imap_password(password: str | None) -> str | None:
|
||||
return decrypt_value(password)
|
||||
|
||||
|
||||
def _resolve_categories_for_profile(profile_id: int | None) -> list[str]:
|
||||
"""Return the list of allowed categories for a profile ID.
|
||||
|
||||
Loads the profile from the database. If ``profile_id`` is ``None`` or the
|
||||
profile is not found, falls back to the global ``settings.imap_attachment_filter``
|
||||
string (``'documents_only'`` → default categories; ``'all'`` → all categories).
|
||||
"""
|
||||
if profile_id is not None:
|
||||
try:
|
||||
from app.models import ImapIngestionProfile
|
||||
|
||||
db = _get_db_session()
|
||||
try:
|
||||
profile = db.query(ImapIngestionProfile).filter(ImapIngestionProfile.id == profile_id).first()
|
||||
if profile:
|
||||
return json.loads(profile.allowed_categories)
|
||||
finally:
|
||||
db.close()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.warning(
|
||||
"Could not load IMAP ingestion profile %d (%s: %s) — using global default",
|
||||
profile_id,
|
||||
type(exc).__name__,
|
||||
exc,
|
||||
)
|
||||
|
||||
# Fall back to global setting
|
||||
if settings.imap_attachment_filter == "all":
|
||||
return ALL_CATEGORIES
|
||||
return DEFAULT_CATEGORIES
|
||||
|
||||
|
||||
LOCK_KEY = "imap_lock" # Unique key for locking
|
||||
LOCK_EXPIRE = 300 # Lock expires in 5 minutes
|
||||
|
||||
@@ -180,6 +216,7 @@ def _pull_user_imap_accounts() -> None:
|
||||
use_ssl=acct.use_ssl,
|
||||
delete_after_process=acct.delete_after_process,
|
||||
owner_id=acct.owner_id,
|
||||
allowed_categories=_resolve_categories_for_profile(acct.profile_id),
|
||||
)
|
||||
# Record successful poll
|
||||
acct.last_checked_at = datetime.now(timezone.utc)
|
||||
@@ -250,6 +287,9 @@ def _pull_user_integration_imap() -> None:
|
||||
use_ssl = cfg.get("use_ssl", True)
|
||||
delete_after = cfg.get("delete_after_process", False)
|
||||
gmail_labels = cfg.get("gmail_apply_labels", True)
|
||||
# Integrations can store a profile_id in config; fall back to global default
|
||||
profile_id = cfg.get("profile_id")
|
||||
allowed_categories = _resolve_categories_for_profile(profile_id)
|
||||
|
||||
if not (host and username and password):
|
||||
logger.warning(
|
||||
@@ -269,6 +309,7 @@ def _pull_user_integration_imap() -> None:
|
||||
delete_after_process=delete_after,
|
||||
owner_id=integ.owner_id,
|
||||
gmail_apply_labels=gmail_labels,
|
||||
allowed_categories=allowed_categories,
|
||||
)
|
||||
integ.last_used_at = datetime.now(timezone.utc)
|
||||
integ.last_error = None
|
||||
@@ -329,6 +370,7 @@ def pull_inbox(
|
||||
delete_after_process,
|
||||
owner_id=None,
|
||||
gmail_apply_labels=True,
|
||||
allowed_categories=None,
|
||||
):
|
||||
"""
|
||||
Connects to the IMAP inbox, fetches new unread emails from the last 3 days,
|
||||
@@ -345,8 +387,22 @@ def pull_inbox(
|
||||
attributed to this user via ``process_document`` / ``convert_to_pdf``.
|
||||
gmail_apply_labels: Whether to apply Gmail-specific labels and stars to
|
||||
processed emails. Only relevant for Gmail hosts. Defaults to True.
|
||||
allowed_categories: List of file-type category keys to ingest (e.g.
|
||||
``["pdf", "office", "images"]``). ``None`` falls back to the
|
||||
global ``settings.imap_attachment_filter`` mapping.
|
||||
"""
|
||||
logger.info("Connecting to %s at %s:%s (SSL=%s)", mailbox_key, host, port, use_ssl)
|
||||
if allowed_categories is None:
|
||||
allowed_categories = _resolve_categories_for_profile(None)
|
||||
|
||||
effective_mime_types, effective_extensions = get_allowed_types_for_categories(allowed_categories)
|
||||
logger.info(
|
||||
"Connecting to %s at %s:%s (SSL=%s) — categories: %s",
|
||||
mailbox_key,
|
||||
host,
|
||||
port,
|
||||
use_ssl,
|
||||
allowed_categories,
|
||||
)
|
||||
processed_emails = load_processed_emails()
|
||||
|
||||
try:
|
||||
@@ -405,9 +461,13 @@ def pull_inbox(
|
||||
logger.info("Skipping email %s in %s, already labeled 'Ingested'.", msg_id, mailbox_key)
|
||||
continue
|
||||
|
||||
# Process attachments (and convert non-PDF files).
|
||||
# We call the function without assigning its return value since it is not used.
|
||||
fetch_attachments_and_enqueue(email_message, owner_id=owner_id)
|
||||
# Process attachments using the resolved mime types / extensions.
|
||||
fetch_attachments_and_enqueue(
|
||||
email_message,
|
||||
owner_id=owner_id,
|
||||
effective_mime_types=effective_mime_types,
|
||||
effective_extensions=effective_extensions,
|
||||
)
|
||||
|
||||
if settings.imap_readonly_mode:
|
||||
logger.info("Readonly mode: skipping mailbox modifications for %s in %s", msg_id, mailbox_key)
|
||||
@@ -436,27 +496,23 @@ def pull_inbox(
|
||||
logger.exception("Error pulling mailbox %s: %s", mailbox_key, e)
|
||||
|
||||
|
||||
def fetch_attachments_and_enqueue(email_message, owner_id: str | None = None):
|
||||
def fetch_attachments_and_enqueue(
|
||||
email_message,
|
||||
owner_id: str | None = None,
|
||||
effective_mime_types: frozenset[str] | None = None,
|
||||
effective_extensions: frozenset[str] | None = None,
|
||||
):
|
||||
"""
|
||||
Extracts attachments from the email and processes only allowed file types.
|
||||
|
||||
Files are accepted if either:
|
||||
1. They have a MIME type from the ALLOWED_MIME_TYPES set, OR
|
||||
2. They have a '.pdf' file extension (regardless of MIME type)
|
||||
The caller is responsible for computing ``effective_mime_types`` and
|
||||
``effective_extensions`` from the relevant :class:`ImapIngestionProfile` (or
|
||||
the global default) via :func:`app.utils.allowed_types.get_allowed_types_for_categories`
|
||||
before calling this function. ``pull_inbox`` does this automatically.
|
||||
|
||||
Allowed file types include:
|
||||
- PDF: application/pdf or *.pdf extension
|
||||
- Microsoft Office files:
|
||||
- Word: application/msword,
|
||||
application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||
- Excel: application/vnd.ms-excel,
|
||||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||
- PowerPoint: application/vnd.ms-powerpoint,
|
||||
application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||
- Other meaningful attachments:
|
||||
- Plain text: text/plain
|
||||
- CSV: text/csv
|
||||
- Rich Text Format: application/rtf, text/rtf
|
||||
If either set is ``None`` the function falls back to the default category list
|
||||
so the function still works correctly when called directly in tests or from
|
||||
other contexts.
|
||||
|
||||
If the attachment is a PDF (by extension or MIME type), it is enqueued for upload;
|
||||
any other allowed file is enqueued for conversion to PDF.
|
||||
@@ -465,9 +521,14 @@ def fetch_attachments_and_enqueue(email_message, owner_id: str | None = None):
|
||||
email_message: The parsed email message to extract attachments from.
|
||||
owner_id: Optional user identifier forwarded to ``process_document`` /
|
||||
``convert_to_pdf`` for multi-tenant attribution.
|
||||
effective_mime_types: Pre-computed frozenset of allowed MIME type strings.
|
||||
effective_extensions: Pre-computed frozenset of allowed file extension strings.
|
||||
|
||||
Returns True if at least one allowed attachment was processed.
|
||||
"""
|
||||
if effective_mime_types is None or effective_extensions is None:
|
||||
effective_mime_types, effective_extensions = get_allowed_types_for_categories(DEFAULT_CATEGORIES)
|
||||
|
||||
has_attachment = False
|
||||
for part in email_message.walk():
|
||||
if part.get_content_maintype() == "multipart":
|
||||
@@ -482,9 +543,15 @@ def fetch_attachments_and_enqueue(email_message, owner_id: str | None = None):
|
||||
|
||||
mime_type = part.get_content_type()
|
||||
file_ext = os.path.splitext(filename)[1].lower()
|
||||
|
||||
# Accept file if it has an allowed MIME type, an allowed extension, OR is a PDF by extension
|
||||
if mime_type not in ALLOWED_MIME_TYPES and file_ext not in ALLOWED_EXTENSIONS and not is_pdf_by_extension:
|
||||
logger.info("Skipping attachment %s with MIME type %s", filename, mime_type)
|
||||
if mime_type not in effective_mime_types and file_ext not in effective_extensions and not is_pdf_by_extension:
|
||||
logger.info(
|
||||
"Skipping attachment %s (MIME: %s, ext: %s) — not in effective allowed set",
|
||||
filename,
|
||||
mime_type,
|
||||
file_ext,
|
||||
)
|
||||
continue
|
||||
|
||||
file_path = os.path.join(settings.workdir, filename)
|
||||
@@ -495,7 +562,7 @@ def fetch_attachments_and_enqueue(email_message, owner_id: str | None = None):
|
||||
if mime_type == "application/pdf" or is_pdf_by_extension:
|
||||
process_document.delay(file_path, owner_id=owner_id)
|
||||
logger.info("Enqueued PDF for upload: %s (MIME: %s)", filename, mime_type)
|
||||
elif mime_type in ALLOWED_MIME_TYPES:
|
||||
elif mime_type in effective_mime_types:
|
||||
# Other allowed files are sent for conversion
|
||||
convert_to_pdf.delay(file_path, owner_id=owner_id)
|
||||
logger.info("Enqueued file for conversion to PDF: %s", filename)
|
||||
|
||||
+61
-12
@@ -12,6 +12,7 @@ from app.tasks.upload_to_dropbox import upload_to_dropbox
|
||||
from app.tasks.upload_to_email import upload_to_email
|
||||
from app.tasks.upload_to_ftp import upload_to_ftp
|
||||
from app.tasks.upload_to_google_drive import upload_to_google_drive
|
||||
from app.tasks.upload_to_icloud import upload_to_icloud
|
||||
from app.tasks.upload_to_nextcloud import upload_to_nextcloud
|
||||
from app.tasks.upload_to_onedrive import upload_to_onedrive
|
||||
from app.tasks.upload_to_paperless import upload_to_paperless
|
||||
@@ -25,18 +26,32 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _should_upload_to_dropbox():
|
||||
return bool(settings.dropbox_app_key and settings.dropbox_app_secret and settings.dropbox_refresh_token)
|
||||
return bool(
|
||||
getattr(settings, "dropbox_enabled", True)
|
||||
and settings.dropbox_app_key
|
||||
and settings.dropbox_app_secret
|
||||
and settings.dropbox_refresh_token
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_nextcloud():
|
||||
return bool(settings.nextcloud_upload_url and settings.nextcloud_username and settings.nextcloud_password)
|
||||
return bool(
|
||||
getattr(settings, "nextcloud_enabled", True)
|
||||
and settings.nextcloud_upload_url
|
||||
and settings.nextcloud_username
|
||||
and settings.nextcloud_password
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_paperless():
|
||||
return bool(settings.paperless_ngx_api_token and settings.paperless_host)
|
||||
return bool(
|
||||
getattr(settings, "paperless_enabled", True) and settings.paperless_ngx_api_token and settings.paperless_host
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_google_drive():
|
||||
if not getattr(settings, "google_drive_enabled", True):
|
||||
return False
|
||||
# Check for OAuth configuration
|
||||
if getattr(settings, "google_drive_use_oauth", False):
|
||||
return bool(
|
||||
@@ -51,20 +66,33 @@ def _should_upload_to_google_drive():
|
||||
|
||||
|
||||
def _should_upload_to_webdav():
|
||||
return bool(settings.webdav_url and settings.webdav_username and settings.webdav_password)
|
||||
return bool(
|
||||
getattr(settings, "webdav_enabled", True)
|
||||
and settings.webdav_url
|
||||
and settings.webdav_username
|
||||
and settings.webdav_password
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_ftp():
|
||||
return bool(settings.ftp_host and settings.ftp_username and settings.ftp_password)
|
||||
return bool(
|
||||
getattr(settings, "ftp_enabled", True) and settings.ftp_host and settings.ftp_username and settings.ftp_password
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_sftp():
|
||||
return bool(settings.sftp_host and settings.sftp_username and (settings.sftp_password or settings.sftp_private_key))
|
||||
return bool(
|
||||
getattr(settings, "sftp_enabled", True)
|
||||
and settings.sftp_host
|
||||
and settings.sftp_username
|
||||
and (settings.sftp_password or settings.sftp_private_key)
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_email():
|
||||
return bool(
|
||||
settings.dest_email_host
|
||||
getattr(settings, "dest_email_enabled", True)
|
||||
and settings.dest_email_host
|
||||
and settings.dest_email_username
|
||||
and settings.dest_email_password
|
||||
and settings.dest_email_default_recipient
|
||||
@@ -72,18 +100,32 @@ def _should_upload_to_email():
|
||||
|
||||
|
||||
def _should_upload_to_onedrive():
|
||||
return bool(settings.onedrive_client_id and settings.onedrive_client_secret and settings.onedrive_refresh_token)
|
||||
return bool(
|
||||
getattr(settings, "onedrive_enabled", True)
|
||||
and settings.onedrive_client_id
|
||||
and settings.onedrive_client_secret
|
||||
and settings.onedrive_refresh_token
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_s3():
|
||||
return bool(settings.s3_bucket_name and settings.aws_access_key_id and settings.aws_secret_access_key)
|
||||
return bool(
|
||||
getattr(settings, "s3_enabled", True)
|
||||
and settings.s3_bucket_name
|
||||
and settings.aws_access_key_id
|
||||
and settings.aws_secret_access_key
|
||||
)
|
||||
|
||||
|
||||
def _should_upload_to_icloud():
|
||||
return bool(getattr(settings, "icloud_enabled", True) and settings.icloud_username and settings.icloud_password)
|
||||
|
||||
|
||||
def get_configured_services_from_validator():
|
||||
"""
|
||||
Use the config validator to determine which services are configured properly.
|
||||
Use the config validator to determine which services are configured and enabled.
|
||||
Returns a dictionary with service names as keys and boolean values indicating
|
||||
whether they're properly configured.
|
||||
whether they're properly configured AND explicitly enabled.
|
||||
"""
|
||||
providers = get_provider_status()
|
||||
|
||||
@@ -98,12 +140,14 @@ def get_configured_services_from_validator():
|
||||
"Email": "email",
|
||||
"OneDrive": "onedrive",
|
||||
"S3 Storage": "s3",
|
||||
"iCloud Drive": "icloud",
|
||||
}
|
||||
|
||||
result = {}
|
||||
for provider_name, internal_name in service_map.items():
|
||||
if provider_name in providers:
|
||||
result[internal_name] = providers[provider_name].get("configured", False)
|
||||
provider = providers[provider_name]
|
||||
result[internal_name] = provider.get("configured", False) and provider.get("enabled", True)
|
||||
|
||||
return result
|
||||
|
||||
@@ -206,6 +250,11 @@ def send_to_all_destinations(self, file_path: str, use_validator=True, file_id:
|
||||
"should_upload": _should_upload_to_s3,
|
||||
"upload_func": upload_to_s3,
|
||||
},
|
||||
{
|
||||
"name": "icloud",
|
||||
"should_upload": _should_upload_to_icloud,
|
||||
"upload_func": upload_to_icloud,
|
||||
},
|
||||
]
|
||||
|
||||
# Optionally get configuration status from validator
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""Upload files to Apple iCloud Drive via the pyicloud library.
|
||||
|
||||
This module uses the ``pyicloud`` library to authenticate with Apple's iCloud
|
||||
service and upload files to iCloud Drive. Because Apple does not offer a public
|
||||
REST API for iCloud Drive, this integration relies on the *unofficial*
|
||||
reverse-engineered protocol implemented by ``pyicloud``.
|
||||
|
||||
Requirements
|
||||
~~~~~~~~~~~~
|
||||
* An Apple ID with iCloud Drive enabled.
|
||||
* An **app-specific password** generated at https://appleid.apple.com (required
|
||||
when two-factor authentication is active – which is the default for all modern
|
||||
Apple IDs).
|
||||
* The ``pyicloud`` Python package (``pip install pyicloud``).
|
||||
|
||||
Configuration
|
||||
~~~~~~~~~~~~~
|
||||
Set the following environment variables (or ``app/config.py`` fields):
|
||||
|
||||
* ``ICLOUD_USERNAME`` – Apple ID email address.
|
||||
* ``ICLOUD_PASSWORD`` – App-specific password.
|
||||
* ``ICLOUD_FOLDER`` – Target folder path inside iCloud Drive, using ``/`` as
|
||||
the separator (e.g. ``Documents/Uploads``). The folder is created
|
||||
automatically if it does not exist.
|
||||
* ``ICLOUD_COOKIE_DIRECTORY`` – (Optional) Directory for persisting session
|
||||
cookies so that re-authentication is avoided between task runs. Defaults to
|
||||
``~/.pyicloud``.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
from app.celery_app import celery
|
||||
from app.config import settings
|
||||
from app.tasks.retry_config import UploadTaskWithRetry
|
||||
from app.utils import log_task_progress
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _get_icloud_api(
|
||||
username: str,
|
||||
password: str,
|
||||
cookie_directory: str | None = None,
|
||||
):
|
||||
"""Return an authenticated ``PyiCloudService`` instance.
|
||||
|
||||
Args:
|
||||
username: Apple ID email address.
|
||||
password: App-specific password.
|
||||
cookie_directory: Optional directory for session cookies.
|
||||
|
||||
Returns:
|
||||
An authenticated ``PyiCloudService`` instance.
|
||||
|
||||
Raises:
|
||||
ImportError: If ``pyicloud`` is not installed.
|
||||
ValueError: If authentication fails or 2FA is required interactively.
|
||||
"""
|
||||
from pyicloud import PyiCloudService # noqa: S404 – unofficial third-party iCloud client
|
||||
|
||||
kwargs: dict = {}
|
||||
if cookie_directory:
|
||||
kwargs["cookie_directory"] = cookie_directory
|
||||
|
||||
api = PyiCloudService(username, password, **kwargs)
|
||||
|
||||
# If 2SA/2FA is required the user must use an app-specific password instead.
|
||||
if api.requires_2sa or api.requires_2fa:
|
||||
raise ValueError(
|
||||
"iCloud account requires two-factor authentication. "
|
||||
"Please generate an app-specific password at https://appleid.apple.com "
|
||||
"and use it as ICLOUD_PASSWORD."
|
||||
)
|
||||
|
||||
return api
|
||||
|
||||
|
||||
def _navigate_to_folder(drive_root, folder_path: str):
|
||||
"""Navigate into (or create) the folder hierarchy described by *folder_path*.
|
||||
|
||||
Args:
|
||||
drive_root: The iCloud Drive root node (``api.drive``).
|
||||
folder_path: ``/``-separated path such as ``Documents/Uploads``.
|
||||
|
||||
Returns:
|
||||
The drive node representing the target folder.
|
||||
"""
|
||||
node = drive_root
|
||||
if not folder_path:
|
||||
return node
|
||||
|
||||
parts = [p for p in folder_path.strip("/").split("/") if p]
|
||||
for part in parts:
|
||||
children = {child.name: child for child in node.dir()}
|
||||
if part in children:
|
||||
node = children[part]
|
||||
else:
|
||||
# Create the missing folder
|
||||
node = node.mkdir(part)
|
||||
return node
|
||||
|
||||
|
||||
@celery.task(base=UploadTaskWithRetry, bind=True)
|
||||
def upload_to_icloud(self, file_path: str, file_id: int = None, folder_override: str = None):
|
||||
"""Upload a file to Apple iCloud Drive.
|
||||
|
||||
Args:
|
||||
file_path: Local path to the file to upload.
|
||||
file_id: Optional ``FileRecord.id`` for progress logging.
|
||||
folder_override: If provided, overrides the default ``ICLOUD_FOLDER``
|
||||
setting for this upload.
|
||||
"""
|
||||
task_id = self.request.id
|
||||
logger.info(f"[{task_id}] Starting iCloud Drive upload: {file_path}")
|
||||
log_task_progress(
|
||||
task_id,
|
||||
"upload_to_icloud",
|
||||
"in_progress",
|
||||
f"Uploading to iCloud Drive: {os.path.basename(file_path)}",
|
||||
file_id=file_id,
|
||||
)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Validate inputs
|
||||
# ------------------------------------------------------------------
|
||||
if not os.path.exists(file_path):
|
||||
error_msg = f"File not found: {file_path}"
|
||||
logger.error(f"[{task_id}] {error_msg}")
|
||||
log_task_progress(task_id, "upload_to_icloud", "failure", error_msg, file_id=file_id)
|
||||
raise FileNotFoundError(error_msg)
|
||||
|
||||
if not settings.icloud_username or not settings.icloud_password:
|
||||
error_msg = "iCloud credentials are not configured (ICLOUD_USERNAME / ICLOUD_PASSWORD)"
|
||||
logger.error(f"[{task_id}] {error_msg}")
|
||||
log_task_progress(task_id, "upload_to_icloud", "failure", error_msg, file_id=file_id)
|
||||
raise ValueError(error_msg)
|
||||
|
||||
filename = os.path.basename(file_path)
|
||||
target_folder = folder_override if folder_override is not None else (settings.icloud_folder or "")
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Authenticate & upload
|
||||
# ------------------------------------------------------------------
|
||||
try:
|
||||
api = _get_icloud_api(
|
||||
settings.icloud_username,
|
||||
settings.icloud_password,
|
||||
settings.icloud_cookie_directory,
|
||||
)
|
||||
|
||||
folder_node = _navigate_to_folder(api.drive, target_folder)
|
||||
|
||||
with open(file_path, "rb") as fh:
|
||||
folder_node.upload(fh)
|
||||
|
||||
logger.info(f"[{task_id}] Successfully uploaded {filename} to iCloud Drive folder '{target_folder}'")
|
||||
log_task_progress(
|
||||
task_id,
|
||||
"upload_to_icloud",
|
||||
"success",
|
||||
f"Uploaded to iCloud Drive: {filename}",
|
||||
file_id=file_id,
|
||||
)
|
||||
return {
|
||||
"status": "Completed",
|
||||
"file": file_path,
|
||||
"icloud_folder": target_folder or "/",
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Error uploading {filename} to iCloud Drive: {e}"
|
||||
logger.error(f"[{task_id}] {error_msg}")
|
||||
log_task_progress(task_id, "upload_to_icloud", "failure", error_msg, file_id=file_id)
|
||||
raise RuntimeError(error_msg) from e
|
||||
@@ -571,6 +571,37 @@ def _upload_rclone(file_path: str, cfg: dict[str, Any], creds: dict[str, Any], t
|
||||
return {"status": "Completed", "rclone_dest": dest}
|
||||
|
||||
|
||||
def _upload_icloud(file_path: str, cfg: dict[str, Any], creds: dict[str, Any], task_id: str) -> dict[str, Any]:
|
||||
"""Upload *file_path* to iCloud Drive using per-user credentials.
|
||||
|
||||
Expected *cfg* keys:
|
||||
* ``folder`` – target folder path inside iCloud Drive (e.g. ``Documents/Uploads``).
|
||||
* ``cookie_directory`` – (optional) path for session cookie persistence.
|
||||
|
||||
Expected *creds* keys:
|
||||
* ``username`` – Apple ID email address.
|
||||
* ``password`` – app-specific password.
|
||||
"""
|
||||
from app.tasks.upload_to_icloud import _get_icloud_api, _navigate_to_folder
|
||||
|
||||
username = creds.get("username") or ""
|
||||
password = creds.get("password") or ""
|
||||
folder = cfg.get("folder") or ""
|
||||
cookie_directory = cfg.get("cookie_directory") or None
|
||||
|
||||
if not username or not password:
|
||||
raise ValueError("iCloud integration is missing username or password in credentials")
|
||||
|
||||
api = _get_icloud_api(username, password, cookie_directory)
|
||||
folder_node = _navigate_to_folder(api.drive, folder)
|
||||
|
||||
with open(file_path, "rb") as fh:
|
||||
folder_node.upload(fh)
|
||||
|
||||
logger.info("[%s] iCloud Drive upload complete: folder=%s", task_id, folder or "/")
|
||||
return {"status": "Completed", "icloud_folder": folder or "/"}
|
||||
|
||||
|
||||
# Map IntegrationType → upload helper
|
||||
_UPLOAD_HANDLERS = {
|
||||
IntegrationType.DROPBOX: _upload_dropbox,
|
||||
@@ -584,6 +615,7 @@ _UPLOAD_HANDLERS = {
|
||||
IntegrationType.PAPERLESS: _upload_paperless,
|
||||
IntegrationType.EMAIL: _upload_email,
|
||||
IntegrationType.RCLONE: _upload_rclone,
|
||||
IntegrationType.ICLOUD: _upload_icloud,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -131,3 +131,157 @@ ALLOWED_EXTENSIONS: set[str] = {
|
||||
".md",
|
||||
".markdown",
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Fine-grained file-type categories used by IMAP ingestion profiles.
|
||||
# Each category groups related MIME types and extensions so that users can
|
||||
# enable/disable a logical collection of formats (e.g. "images") rather than
|
||||
# having to manage individual MIME strings.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
FILE_TYPE_CATEGORIES: dict[str, dict] = {
|
||||
"pdf": {
|
||||
"label": "PDF",
|
||||
"description": "PDF documents (.pdf)",
|
||||
"mime_types": frozenset({"application/pdf"}),
|
||||
"extensions": frozenset({".pdf"}),
|
||||
},
|
||||
"office": {
|
||||
"label": "Microsoft Office",
|
||||
"description": "Word, Excel and PowerPoint files (.doc, .docx, .xls, .xlsx, .ppt, .pptx, …)",
|
||||
"mime_types": frozenset(
|
||||
{
|
||||
"application/msword",
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
|
||||
"application/vnd.ms-word.document.macroEnabled.12",
|
||||
"application/vnd.ms-word.template.macroEnabled.12",
|
||||
"application/vnd.ms-excel",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
|
||||
"application/vnd.ms-excel.sheet.macroEnabled.12",
|
||||
"application/vnd.ms-excel.sheet.binary.macroEnabled.12",
|
||||
"application/vnd.ms-powerpoint",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.template",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
|
||||
"application/vnd.ms-powerpoint.presentation.macroEnabled.12",
|
||||
}
|
||||
),
|
||||
"extensions": frozenset(
|
||||
{
|
||||
".doc",
|
||||
".docx",
|
||||
".docm",
|
||||
".dot",
|
||||
".dotx",
|
||||
".dotm",
|
||||
".xls",
|
||||
".xlsx",
|
||||
".xlsm",
|
||||
".xlsb",
|
||||
".xlt",
|
||||
".xltx",
|
||||
".xlw",
|
||||
".ppt",
|
||||
".pptx",
|
||||
".pptm",
|
||||
".pps",
|
||||
".ppsx",
|
||||
".pot",
|
||||
".potx",
|
||||
}
|
||||
),
|
||||
},
|
||||
"opendocument": {
|
||||
"label": "OpenDocument (LibreOffice)",
|
||||
"description": "LibreOffice / OpenOffice files (.odt, .ods, .odp, …)",
|
||||
"mime_types": frozenset(
|
||||
{
|
||||
"application/vnd.oasis.opendocument.text",
|
||||
"application/vnd.oasis.opendocument.spreadsheet",
|
||||
"application/vnd.oasis.opendocument.presentation",
|
||||
"application/vnd.oasis.opendocument.graphics",
|
||||
"application/vnd.oasis.opendocument.formula",
|
||||
}
|
||||
),
|
||||
"extensions": frozenset({".odt", ".ods", ".odp", ".odg", ".odf"}),
|
||||
},
|
||||
"text": {
|
||||
"label": "Text & Data",
|
||||
"description": "Plain text, CSV and RTF files (.txt, .csv, .rtf)",
|
||||
"mime_types": frozenset(
|
||||
{
|
||||
"text/plain",
|
||||
"text/csv",
|
||||
"application/rtf",
|
||||
"text/rtf",
|
||||
}
|
||||
),
|
||||
"extensions": frozenset({".txt", ".csv", ".rtf"}),
|
||||
},
|
||||
"web": {
|
||||
"label": "Web & Markup",
|
||||
"description": "HTML and Markdown files (.html, .htm, .md, .markdown)",
|
||||
"mime_types": frozenset(
|
||||
{
|
||||
"text/html",
|
||||
"text/markdown",
|
||||
"text/x-markdown",
|
||||
}
|
||||
),
|
||||
"extensions": frozenset({".html", ".htm", ".md", ".markdown"}),
|
||||
},
|
||||
"images": {
|
||||
"label": "Images",
|
||||
"description": "Image files (.jpg, .png, .gif, .bmp, .tiff, .webp, .svg)",
|
||||
"mime_types": frozenset(
|
||||
{
|
||||
"image/jpeg",
|
||||
"image/jpg",
|
||||
"image/png",
|
||||
"image/gif",
|
||||
"image/bmp",
|
||||
"image/tiff",
|
||||
"image/webp",
|
||||
"image/svg+xml",
|
||||
}
|
||||
),
|
||||
"extensions": frozenset(
|
||||
{
|
||||
".jpg",
|
||||
".jpeg",
|
||||
".png",
|
||||
".gif",
|
||||
".bmp",
|
||||
".tiff",
|
||||
".tif",
|
||||
".webp",
|
||||
".svg",
|
||||
}
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
# Default categories for the "documents only" built-in profile (no images)
|
||||
DEFAULT_CATEGORIES: list[str] = ["pdf", "office", "opendocument", "text", "web"]
|
||||
# All categories including images
|
||||
ALL_CATEGORIES: list[str] = ["pdf", "office", "opendocument", "text", "web", "images"]
|
||||
|
||||
|
||||
def get_allowed_types_for_categories(
|
||||
categories: list[str],
|
||||
) -> tuple[frozenset[str], frozenset[str]]:
|
||||
"""Return ``(mime_types, extensions)`` for the given category list.
|
||||
|
||||
Unknown category names are silently ignored so that future categories
|
||||
don't break existing profiles.
|
||||
"""
|
||||
mime_types: set[str] = set()
|
||||
extensions: set[str] = set()
|
||||
for cat in categories:
|
||||
info = FILE_TYPE_CATEGORIES.get(cat)
|
||||
if info:
|
||||
mime_types |= info["mime_types"]
|
||||
extensions |= info["extensions"]
|
||||
return frozenset(mime_types), frozenset(extensions)
|
||||
|
||||
@@ -0,0 +1,433 @@
|
||||
"""Compliance service for managing GDPR, HIPAA, and SOC2 compliance templates.
|
||||
|
||||
Provides pre-built compliance configurations that can be applied with one click
|
||||
to ensure the DocuElevate instance meets regulatory requirements.
|
||||
"""
|
||||
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime, timezone
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models import ComplianceTemplate
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Pre-built compliance template definitions
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
COMPLIANCE_TEMPLATES: dict[str, dict[str, Any]] = {
|
||||
"gdpr": {
|
||||
"display_name": "GDPR (General Data Protection Regulation)",
|
||||
"description": (
|
||||
"European Union regulation for data protection and privacy. "
|
||||
"Enforces data minimisation, encryption at rest, audit logging, "
|
||||
"and limits PII exposure in telemetry."
|
||||
),
|
||||
"settings": {
|
||||
"auth_enabled": "True",
|
||||
"sentry_send_default_pii": "False",
|
||||
"security_headers_enabled": "True",
|
||||
"security_header_hsts_enabled": "True",
|
||||
"security_header_csp_enabled": "True",
|
||||
"security_header_x_frame_options_enabled": "True",
|
||||
"enable_deduplication": "True",
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"key": "auth_enabled",
|
||||
"expected": "True",
|
||||
"label": "Authentication enabled",
|
||||
"description": "User authentication must be enabled to control access to personal data.",
|
||||
},
|
||||
{
|
||||
"key": "sentry_send_default_pii",
|
||||
"expected": "False",
|
||||
"label": "PII excluded from telemetry",
|
||||
"description": "Personally identifiable information must not be sent to external monitoring services.",
|
||||
},
|
||||
{
|
||||
"key": "security_headers_enabled",
|
||||
"expected": "True",
|
||||
"label": "Security headers enabled",
|
||||
"description": "HTTP security headers protect against common web vulnerabilities.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_hsts_enabled",
|
||||
"expected": "True",
|
||||
"label": "HSTS enabled",
|
||||
"description": "HTTP Strict Transport Security ensures encrypted connections.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_csp_enabled",
|
||||
"expected": "True",
|
||||
"label": "Content Security Policy enabled",
|
||||
"description": "CSP headers prevent cross-site scripting and data injection attacks.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_x_frame_options_enabled",
|
||||
"expected": "True",
|
||||
"label": "Clickjacking protection enabled",
|
||||
"description": "X-Frame-Options header prevents clickjacking attacks.",
|
||||
},
|
||||
{
|
||||
"key": "enable_deduplication",
|
||||
"expected": "True",
|
||||
"label": "Deduplication enabled",
|
||||
"description": "Data minimisation: avoid storing duplicate documents.",
|
||||
},
|
||||
],
|
||||
},
|
||||
"hipaa": {
|
||||
"display_name": "HIPAA (Health Insurance Portability and Accountability Act)",
|
||||
"description": (
|
||||
"United States regulation for protecting health information. "
|
||||
"Requires strong access controls, audit trails, encryption, "
|
||||
"and strict session management."
|
||||
),
|
||||
"settings": {
|
||||
"auth_enabled": "True",
|
||||
"multi_user_enabled": "True",
|
||||
"sentry_send_default_pii": "False",
|
||||
"security_headers_enabled": "True",
|
||||
"security_header_hsts_enabled": "True",
|
||||
"security_header_csp_enabled": "True",
|
||||
"security_header_x_frame_options_enabled": "True",
|
||||
"enable_deduplication": "True",
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"key": "auth_enabled",
|
||||
"expected": "True",
|
||||
"label": "Authentication enabled",
|
||||
"description": "Access controls are required to protect electronic Protected Health Information (ePHI).",
|
||||
},
|
||||
{
|
||||
"key": "multi_user_enabled",
|
||||
"expected": "True",
|
||||
"label": "Multi-user mode enabled",
|
||||
"description": "Individual user accounts required for access accountability.",
|
||||
},
|
||||
{
|
||||
"key": "sentry_send_default_pii",
|
||||
"expected": "False",
|
||||
"label": "PII excluded from telemetry",
|
||||
"description": "Protected Health Information must not be sent to external services.",
|
||||
},
|
||||
{
|
||||
"key": "security_headers_enabled",
|
||||
"expected": "True",
|
||||
"label": "Security headers enabled",
|
||||
"description": "Security headers protect ePHI during transmission.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_hsts_enabled",
|
||||
"expected": "True",
|
||||
"label": "HSTS enabled",
|
||||
"description": "Encrypted transport required for all ePHI transmissions.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_csp_enabled",
|
||||
"expected": "True",
|
||||
"label": "Content Security Policy enabled",
|
||||
"description": "CSP prevents injection attacks that could expose ePHI.",
|
||||
},
|
||||
{
|
||||
"key": "security_header_x_frame_options_enabled",
|
||||
"expected": "True",
|
||||
"label": "Clickjacking protection enabled",
|
||||
"description": "Prevents embedding the application in unauthorized frames.",
|
||||
},
|
||||
{
|
||||
"key": "enable_deduplication",
|
||||
"expected": "True",
|
||||
"label": "Deduplication enabled",
|
||||
"description": "Minimise data footprint for ePHI.",
|
||||
},
|
||||
],
|
||||
},
|
||||
"soc2": {
|
||||
"display_name": "SOC 2 (Service Organization Control 2)",
|
||||
"description": (
|
||||
"Trust Service Criteria framework for service organisations. "
|
||||
"Focuses on security, availability, processing integrity, "
|
||||
"confidentiality, and privacy."
|
||||
),
|
||||
"settings": {
|
||||
"auth_enabled": "True",
|
||||
"multi_user_enabled": "True",
|
||||
"sentry_send_default_pii": "False",
|
||||
"security_headers_enabled": "True",
|
||||
"security_header_hsts_enabled": "True",
|
||||
"security_header_csp_enabled": "True",
|
||||
"security_header_x_frame_options_enabled": "True",
|
||||
"enable_deduplication": "True",
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"key": "auth_enabled",
|
||||
"expected": "True",
|
||||
"label": "Authentication enabled",
|
||||
"description": "Logical access controls required (CC6.1).",
|
||||
},
|
||||
{
|
||||
"key": "multi_user_enabled",
|
||||
"expected": "True",
|
||||
"label": "Multi-user mode enabled",
|
||||
"description": "Individual user accounts for access management (CC6.2).",
|
||||
},
|
||||
{
|
||||
"key": "sentry_send_default_pii",
|
||||
"expected": "False",
|
||||
"label": "PII excluded from telemetry",
|
||||
"description": "Confidential information must not leak to external services (CC6.7).",
|
||||
},
|
||||
{
|
||||
"key": "security_headers_enabled",
|
||||
"expected": "True",
|
||||
"label": "Security headers enabled",
|
||||
"description": "Protection against common web threats (CC6.6).",
|
||||
},
|
||||
{
|
||||
"key": "security_header_hsts_enabled",
|
||||
"expected": "True",
|
||||
"label": "HSTS enabled",
|
||||
"description": "Encrypted transport in transit (CC6.7).",
|
||||
},
|
||||
{
|
||||
"key": "security_header_csp_enabled",
|
||||
"expected": "True",
|
||||
"label": "Content Security Policy enabled",
|
||||
"description": "Application-level security controls (CC6.6).",
|
||||
},
|
||||
{
|
||||
"key": "security_header_x_frame_options_enabled",
|
||||
"expected": "True",
|
||||
"label": "Clickjacking protection enabled",
|
||||
"description": "UI redress attack prevention (CC6.6).",
|
||||
},
|
||||
{
|
||||
"key": "enable_deduplication",
|
||||
"expected": "True",
|
||||
"label": "Deduplication enabled",
|
||||
"description": "Data integrity through deduplication (PI1.1).",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def seed_compliance_templates(db: Session) -> None:
|
||||
"""Create or update the built-in compliance template rows.
|
||||
|
||||
Called once at application startup to ensure the ``compliance_templates``
|
||||
table always contains the latest definitions.
|
||||
"""
|
||||
for name, defn in COMPLIANCE_TEMPLATES.items():
|
||||
existing = db.query(ComplianceTemplate).filter(ComplianceTemplate.name == name).first()
|
||||
if existing is None:
|
||||
template = ComplianceTemplate(
|
||||
name=name,
|
||||
display_name=defn["display_name"],
|
||||
description=defn["description"],
|
||||
settings_json=json.dumps(defn["settings"]),
|
||||
enabled=False,
|
||||
status="not_applied",
|
||||
)
|
||||
db.add(template)
|
||||
logger.info(f"Seeded compliance template: {name}")
|
||||
else:
|
||||
# Update display_name and description if changed, but preserve user state
|
||||
existing.display_name = defn["display_name"]
|
||||
existing.description = defn["description"]
|
||||
try:
|
||||
db.commit()
|
||||
except Exception:
|
||||
db.rollback()
|
||||
logger.exception("Failed to seed compliance templates")
|
||||
|
||||
|
||||
def get_all_templates(db: Session) -> list[dict[str, Any]]:
|
||||
"""Return all compliance templates with their current status."""
|
||||
templates = db.query(ComplianceTemplate).order_by(ComplianceTemplate.name).all()
|
||||
result = []
|
||||
for t in templates:
|
||||
defn = COMPLIANCE_TEMPLATES.get(t.name, {})
|
||||
checks = defn.get("checks", [])
|
||||
result.append(
|
||||
{
|
||||
"id": t.id,
|
||||
"name": t.name,
|
||||
"display_name": t.display_name,
|
||||
"description": t.description,
|
||||
"enabled": t.enabled,
|
||||
"status": t.status,
|
||||
"applied_at": t.applied_at.isoformat() if t.applied_at else None,
|
||||
"applied_by": t.applied_by,
|
||||
"settings": json.loads(t.settings_json) if t.settings_json else {},
|
||||
"checks": checks,
|
||||
"check_count": len(checks),
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
def get_template_by_name(db: Session, name: str) -> ComplianceTemplate | None:
|
||||
"""Retrieve a single compliance template by name."""
|
||||
return db.query(ComplianceTemplate).filter(ComplianceTemplate.name == name).first()
|
||||
|
||||
|
||||
def evaluate_template_status(db: Session, name: str) -> dict[str, Any]:
|
||||
"""Evaluate the compliance status of a template against live settings.
|
||||
|
||||
Returns a dict with ``status``, ``total``, ``passed``, ``failed``, and
|
||||
a list of individual ``check_results``.
|
||||
"""
|
||||
from app.config import settings as app_settings
|
||||
from app.utils.settings_service import get_all_settings_from_db
|
||||
|
||||
defn = COMPLIANCE_TEMPLATES.get(name)
|
||||
if defn is None:
|
||||
return {"status": "unknown", "total": 0, "passed": 0, "failed": 0, "check_results": []}
|
||||
|
||||
db_settings = get_all_settings_from_db(db)
|
||||
checks = defn.get("checks", [])
|
||||
results: list[dict[str, Any]] = []
|
||||
passed = 0
|
||||
|
||||
for check in checks:
|
||||
key = check["key"]
|
||||
expected = check["expected"]
|
||||
|
||||
# Resolve effective value: DB > config object
|
||||
if key in db_settings and db_settings[key] is not None:
|
||||
actual = str(db_settings[key])
|
||||
else:
|
||||
actual = str(getattr(app_settings, key, ""))
|
||||
|
||||
is_passing = actual.lower() == expected.lower()
|
||||
if is_passing:
|
||||
passed += 1
|
||||
|
||||
results.append(
|
||||
{
|
||||
"key": key,
|
||||
"label": check["label"],
|
||||
"description": check["description"],
|
||||
"expected": expected,
|
||||
"actual": actual,
|
||||
"passing": is_passing,
|
||||
}
|
||||
)
|
||||
|
||||
total = len(checks)
|
||||
if passed == total:
|
||||
status = "compliant"
|
||||
elif passed > 0:
|
||||
status = "partial"
|
||||
else:
|
||||
status = "non_compliant"
|
||||
|
||||
return {
|
||||
"status": status,
|
||||
"total": total,
|
||||
"passed": passed,
|
||||
"failed": total - passed,
|
||||
"check_results": results,
|
||||
}
|
||||
|
||||
|
||||
def apply_template(db: Session, name: str, applied_by: str = "admin") -> dict[str, Any]:
|
||||
"""Apply a compliance template by writing its settings to the database.
|
||||
|
||||
Returns a summary of what was applied.
|
||||
"""
|
||||
from app.utils.settings_service import save_setting_to_db
|
||||
|
||||
defn = COMPLIANCE_TEMPLATES.get(name)
|
||||
if defn is None:
|
||||
return {"success": False, "error": f"Unknown template: {name}"}
|
||||
|
||||
template = get_template_by_name(db, name)
|
||||
if template is None:
|
||||
return {"success": False, "error": f"Template not found in database: {name}"}
|
||||
|
||||
applied_settings: dict[str, str] = {}
|
||||
errors: list[str] = []
|
||||
|
||||
for key, value in defn["settings"].items():
|
||||
try:
|
||||
save_setting_to_db(db, key, value, changed_by=f"compliance:{name}")
|
||||
applied_settings[key] = value
|
||||
except Exception as e:
|
||||
errors.append(f"{key}: {e}")
|
||||
logger.error(f"Failed to apply compliance setting {key}={value}: {e}")
|
||||
|
||||
# Update the template record
|
||||
now = datetime.now(timezone.utc)
|
||||
template.enabled = True
|
||||
template.settings_json = json.dumps(applied_settings)
|
||||
template.applied_at = now
|
||||
template.applied_by = applied_by
|
||||
|
||||
# Evaluate and store status
|
||||
eval_result = evaluate_template_status(db, name)
|
||||
template.status = eval_result["status"]
|
||||
|
||||
try:
|
||||
db.commit()
|
||||
except Exception:
|
||||
db.rollback()
|
||||
logger.exception(f"Failed to update compliance template record: {name}")
|
||||
return {"success": False, "error": "Database commit failed"}
|
||||
|
||||
logger.info(f"Applied compliance template '{name}' by {applied_by}: {len(applied_settings)} settings written")
|
||||
|
||||
return {
|
||||
"success": len(errors) == 0,
|
||||
"template": name,
|
||||
"applied_settings": applied_settings,
|
||||
"errors": errors,
|
||||
"status": eval_result,
|
||||
}
|
||||
|
||||
|
||||
def get_compliance_summary(db: Session) -> dict[str, Any]:
|
||||
"""Return a high-level compliance dashboard summary across all templates."""
|
||||
templates = db.query(ComplianceTemplate).order_by(ComplianceTemplate.name).all()
|
||||
summary: list[dict[str, Any]] = []
|
||||
total_checks = 0
|
||||
total_passed = 0
|
||||
|
||||
for t in templates:
|
||||
eval_result = evaluate_template_status(db, t.name)
|
||||
total_checks += eval_result["total"]
|
||||
total_passed += eval_result["passed"]
|
||||
summary.append(
|
||||
{
|
||||
"name": t.name,
|
||||
"display_name": t.display_name,
|
||||
"enabled": t.enabled,
|
||||
"status": eval_result["status"],
|
||||
"total": eval_result["total"],
|
||||
"passed": eval_result["passed"],
|
||||
"failed": eval_result["failed"],
|
||||
"applied_at": t.applied_at.isoformat() if t.applied_at else None,
|
||||
"applied_by": t.applied_by,
|
||||
}
|
||||
)
|
||||
|
||||
overall = "compliant" if total_checks > 0 and total_passed == total_checks else "non_compliant"
|
||||
if 0 < total_passed < total_checks:
|
||||
overall = "partial"
|
||||
|
||||
return {
|
||||
"overall_status": overall,
|
||||
"total_checks": total_checks,
|
||||
"total_passed": total_passed,
|
||||
"total_failed": total_checks - total_passed,
|
||||
"templates": summary,
|
||||
}
|
||||
@@ -144,7 +144,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "dropbox_app_secret", None)
|
||||
and getattr(settings, "dropbox_refresh_token", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "dropbox_enabled", True),
|
||||
"description": "Upload files to Dropbox cloud storage",
|
||||
"details": {
|
||||
"folder": getattr(settings, "dropbox_folder", "Not set"),
|
||||
@@ -161,7 +161,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
"configured": bool(
|
||||
getattr(settings, "dest_email_host", None) and getattr(settings, "dest_email_default_recipient", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "dest_email_enabled", True),
|
||||
"description": "Send documents via email",
|
||||
"details": {
|
||||
"host": getattr(settings, "dest_email_host", "Not set"),
|
||||
@@ -183,7 +183,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "ftp_username", None)
|
||||
and getattr(settings, "ftp_password", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "ftp_enabled", True),
|
||||
"description": "Upload files to FTP server",
|
||||
"details": {
|
||||
"host": getattr(settings, "ftp_host", "Not set"),
|
||||
@@ -214,7 +214,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
"name": "Google Drive",
|
||||
"icon": "fa-brands fa-google-drive",
|
||||
"configured": is_configured and bool(getattr(settings, "google_drive_folder_id", None)),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "google_drive_enabled", True),
|
||||
"description": "Store documents in Google Drive",
|
||||
"details": {
|
||||
"auth_type": "OAuth" if use_oauth else "Service Account",
|
||||
@@ -250,7 +250,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "nextcloud_username", None)
|
||||
and getattr(settings, "nextcloud_password", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "nextcloud_enabled", True),
|
||||
"description": "Store documents in NextCloud",
|
||||
"details": {
|
||||
"url": getattr(settings, "nextcloud_upload_url", "Not set"),
|
||||
@@ -270,7 +270,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "onedrive_client_secret", None)
|
||||
and getattr(settings, "onedrive_refresh_token", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "onedrive_enabled", True),
|
||||
"description": "Store documents in Microsoft OneDrive",
|
||||
"details": {
|
||||
"client_id": getattr(settings, "onedrive_client_id", "Not set"),
|
||||
@@ -288,7 +288,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
"configured": bool(
|
||||
getattr(settings, "paperless_host", None) and getattr(settings, "paperless_ngx_api_token", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "paperless_enabled", True),
|
||||
"description": "Document management system for digital archives",
|
||||
"details": {
|
||||
"host": getattr(settings, "paperless_host", "Not set"),
|
||||
@@ -305,7 +305,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "aws_access_key_id", None)
|
||||
and getattr(settings, "aws_secret_access_key", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "s3_enabled", True),
|
||||
"description": "Store documents in S3-compatible object storage",
|
||||
"details": {
|
||||
"bucket": getattr(settings, "s3_bucket_name", "Not set"),
|
||||
@@ -327,7 +327,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "sftp_username", None)
|
||||
and (getattr(settings, "sftp_password", None) or getattr(settings, "sftp_private_key", None))
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "sftp_enabled", True),
|
||||
"description": "Upload files to SFTP server",
|
||||
"details": {
|
||||
"host": getattr(settings, "sftp_host", "Not set"),
|
||||
@@ -362,7 +362,7 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
and getattr(settings, "webdav_username", None)
|
||||
and getattr(settings, "webdav_password", None)
|
||||
),
|
||||
"enabled": True,
|
||||
"enabled": getattr(settings, "webdav_enabled", True),
|
||||
"description": "Store documents on WebDAV servers",
|
||||
"details": {
|
||||
"url": getattr(settings, "webdav_url", "Not set"),
|
||||
@@ -373,4 +373,19 @@ def get_provider_status() -> dict[str, dict[str, object]]:
|
||||
},
|
||||
}
|
||||
|
||||
# Check iCloud Drive configuration
|
||||
providers["iCloud Drive"] = {
|
||||
"name": "iCloud Drive",
|
||||
"icon": "fa-brands fa-apple",
|
||||
"configured": bool(getattr(settings, "icloud_username", None) and getattr(settings, "icloud_password", None)),
|
||||
"enabled": getattr(settings, "icloud_enabled", True),
|
||||
"description": "Store documents in Apple iCloud Drive",
|
||||
"details": {
|
||||
"username": getattr(settings, "icloud_username", "Not set"),
|
||||
"password": mask_sensitive_value(getattr(settings, "icloud_password", None)),
|
||||
"folder": getattr(settings, "icloud_folder", "Not set"),
|
||||
"cookie_directory": getattr(settings, "icloud_cookie_directory", "Not set"),
|
||||
},
|
||||
}
|
||||
|
||||
return providers
|
||||
|
||||
@@ -59,13 +59,43 @@ def validate_auth_config() -> list[str]:
|
||||
and getattr(settings, "authentik_config_url", None)
|
||||
)
|
||||
|
||||
if not using_simple_auth and not using_oidc:
|
||||
issues.append("Neither simple authentication nor OIDC are properly configured")
|
||||
# Check if any social login provider is enabled
|
||||
using_social_login = any(
|
||||
getattr(settings, f"social_auth_{p}_enabled", False) for p in ("google", "microsoft", "apple", "dropbox")
|
||||
)
|
||||
|
||||
if not using_simple_auth and not using_oidc and not using_social_login:
|
||||
issues.append("Neither simple authentication, OIDC, nor social login are properly configured")
|
||||
|
||||
# If using OIDC, check for provider name
|
||||
if using_oidc and not getattr(settings, "oauth_provider_name", None):
|
||||
issues.append("OAUTH_PROVIDER_NAME is not configured but OIDC is enabled")
|
||||
|
||||
# Validate individual social login provider configs
|
||||
if getattr(settings, "social_auth_google_enabled", False):
|
||||
if not getattr(settings, "social_auth_google_client_id", None):
|
||||
issues.append("SOCIAL_AUTH_GOOGLE_CLIENT_ID is required when Google login is enabled")
|
||||
if not getattr(settings, "social_auth_google_client_secret", None):
|
||||
issues.append("SOCIAL_AUTH_GOOGLE_CLIENT_SECRET is required when Google login is enabled")
|
||||
|
||||
if getattr(settings, "social_auth_microsoft_enabled", False):
|
||||
if not getattr(settings, "social_auth_microsoft_client_id", None):
|
||||
issues.append("SOCIAL_AUTH_MICROSOFT_CLIENT_ID is required when Microsoft login is enabled")
|
||||
if not getattr(settings, "social_auth_microsoft_client_secret", None):
|
||||
issues.append("SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET is required when Microsoft login is enabled")
|
||||
|
||||
if getattr(settings, "social_auth_apple_enabled", False):
|
||||
if not getattr(settings, "social_auth_apple_client_id", None):
|
||||
issues.append("SOCIAL_AUTH_APPLE_CLIENT_ID is required when Apple login is enabled")
|
||||
if not getattr(settings, "social_auth_apple_team_id", None):
|
||||
issues.append("SOCIAL_AUTH_APPLE_TEAM_ID is required when Apple login is enabled")
|
||||
|
||||
if getattr(settings, "social_auth_dropbox_enabled", False):
|
||||
if not getattr(settings, "social_auth_dropbox_client_id", None):
|
||||
issues.append("SOCIAL_AUTH_DROPBOX_CLIENT_ID is required when Dropbox login is enabled")
|
||||
if not getattr(settings, "social_auth_dropbox_client_secret", None):
|
||||
issues.append("SOCIAL_AUTH_DROPBOX_CLIENT_SECRET is required when Dropbox login is enabled")
|
||||
|
||||
return issues
|
||||
|
||||
|
||||
|
||||
+8
-5
@@ -223,16 +223,19 @@ def detect_language(request: Request) -> str:
|
||||
# 1. User session preference
|
||||
if hasattr(request, "session"):
|
||||
session_lang = request.session.get("preferred_language")
|
||||
if session_lang and session_lang in SUPPORTED_LANGUAGE_CODES:
|
||||
if isinstance(session_lang, str) and session_lang in SUPPORTED_LANGUAGE_CODES:
|
||||
return session_lang
|
||||
|
||||
# 2. Cookie
|
||||
cookie_lang = request.cookies.get("docuelevate_lang")
|
||||
if cookie_lang and cookie_lang in SUPPORTED_LANGUAGE_CODES:
|
||||
return cookie_lang
|
||||
if hasattr(request, "cookies"):
|
||||
cookie_lang = request.cookies.get("docuelevate_lang")
|
||||
if isinstance(cookie_lang, str) and cookie_lang in SUPPORTED_LANGUAGE_CODES:
|
||||
return cookie_lang
|
||||
|
||||
# 3. Accept-Language header
|
||||
accept = request.headers.get("accept-language", "")
|
||||
accept = ""
|
||||
if hasattr(request, "headers"):
|
||||
accept = request.headers.get("accept-language", "")
|
||||
lang = _parse_accept_language(accept)
|
||||
if lang:
|
||||
return lang
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
"""Push notification sender for the DocuElevate mobile app.
|
||||
|
||||
Uses the **Expo Push Notification** service to deliver notifications to both
|
||||
iOS (via APNs) and Android (via FCM) without requiring server-side APNs keys
|
||||
or FCM credentials. The mobile app obtains an ``ExponentPushToken[…]`` at
|
||||
startup and registers it with the backend via the mobile API.
|
||||
|
||||
Reference: https://docs.expo.dev/push-notifications/sending-notifications/
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
import httpx
|
||||
|
||||
from app.database import SessionLocal
|
||||
from app.models import MobileDevice
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
EXPO_PUSH_URL = "https://exp.host/--/api/v2/push/send"
|
||||
|
||||
# Maximum tokens per batch request (Expo limit).
|
||||
_EXPO_BATCH_LIMIT = 100
|
||||
|
||||
|
||||
def send_expo_push_notification(
|
||||
tokens: list[str],
|
||||
title: str,
|
||||
body: str,
|
||||
data: dict[str, Any] | None = None,
|
||||
sound: str = "default",
|
||||
badge: int | None = None,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""Send a push notification to one or more Expo push tokens.
|
||||
|
||||
Args:
|
||||
tokens: List of Expo push tokens (``ExponentPushToken[…]``).
|
||||
title: Notification title shown in the system tray.
|
||||
body: Notification body text.
|
||||
data: Optional JSON-serialisable dict attached to the notification
|
||||
(available in the app via ``notification.request.content.data``).
|
||||
sound: Notification sound. Use ``"default"`` or ``None`` for silent.
|
||||
badge: iOS badge count. Pass ``0`` to clear.
|
||||
|
||||
Returns:
|
||||
List of Expo push receipt dicts (one per token).
|
||||
"""
|
||||
if not tokens:
|
||||
return []
|
||||
|
||||
results: list[dict[str, Any]] = []
|
||||
|
||||
# Send in batches to stay within Expo's per-request limit.
|
||||
for i in range(0, len(tokens), _EXPO_BATCH_LIMIT):
|
||||
batch = tokens[i : i + _EXPO_BATCH_LIMIT]
|
||||
messages = []
|
||||
for token in batch:
|
||||
msg: dict[str, Any] = {
|
||||
"to": token,
|
||||
"title": title,
|
||||
"body": body,
|
||||
"sound": sound,
|
||||
}
|
||||
if data:
|
||||
msg["data"] = data
|
||||
if badge is not None:
|
||||
msg["badge"] = badge
|
||||
messages.append(msg)
|
||||
|
||||
try:
|
||||
resp = httpx.post(
|
||||
EXPO_PUSH_URL,
|
||||
json=messages,
|
||||
headers={
|
||||
"Accept": "application/json",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
timeout=15,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
payload = resp.json()
|
||||
batch_results = payload.get("data", [])
|
||||
results.extend(batch_results)
|
||||
logger.debug("Expo push batch sent: %d tokens, %d results", len(batch), len(batch_results))
|
||||
except httpx.HTTPStatusError as exc:
|
||||
logger.error("Expo push HTTP error: %s – %s", exc.response.status_code, exc.response.text)
|
||||
except Exception:
|
||||
logger.exception("Expo push notification failed for batch starting at index %d", i)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def send_push_to_owner(
|
||||
owner_id: str,
|
||||
title: str,
|
||||
body: str,
|
||||
data: dict[str, Any] | None = None,
|
||||
) -> None:
|
||||
"""Look up all active push tokens for *owner_id* and send them a notification.
|
||||
|
||||
This function is safe to call from Celery task workers. Database errors
|
||||
and push failures are logged but never raised so that the caller task is
|
||||
not retried due to a notification failure.
|
||||
"""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
devices = (
|
||||
db.query(MobileDevice)
|
||||
.filter(
|
||||
MobileDevice.owner_id == owner_id,
|
||||
MobileDevice.is_active.is_(True),
|
||||
MobileDevice.push_token.isnot(None),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
tokens = [d.push_token for d in devices if d.push_token]
|
||||
except Exception:
|
||||
logger.exception("Failed to query mobile devices for owner_id=%s", owner_id)
|
||||
return
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
if not tokens:
|
||||
logger.debug("No active push tokens for owner_id=%s", owner_id)
|
||||
return
|
||||
|
||||
logger.info("Sending push notification to %d device(s) for owner_id=%s", len(tokens), owner_id)
|
||||
send_expo_push_notification(tokens=tokens, title=title, body=body, data=data)
|
||||
@@ -182,6 +182,153 @@ SETTING_METADATA = {
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
# Social Login Providers
|
||||
"social_auth_google_enabled": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Enable Google Sign-In. Requires SOCIAL_AUTH_GOOGLE_CLIENT_ID and "
|
||||
"SOCIAL_AUTH_GOOGLE_CLIENT_SECRET from the Google Cloud Console."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
"help_link": "https://console.cloud.google.com/apis/credentials",
|
||||
"help_link_label": "Google Cloud Console",
|
||||
},
|
||||
"social_auth_google_client_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Google OAuth2 client ID from the Google Cloud Console.",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_google_client_secret": {
|
||||
"category": "Social Login",
|
||||
"description": "Google OAuth2 client secret from the Google Cloud Console.",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_microsoft_enabled": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Enable Microsoft Sign-In (Azure AD / Microsoft Entra ID). Requires "
|
||||
"SOCIAL_AUTH_MICROSOFT_CLIENT_ID and SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET "
|
||||
"from Azure App Registrations."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
"help_link": "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
|
||||
"help_link_label": "Azure Portal",
|
||||
},
|
||||
"social_auth_microsoft_client_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Microsoft OAuth2 application (client) ID from Azure App Registrations.",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_microsoft_client_secret": {
|
||||
"category": "Social Login",
|
||||
"description": "Microsoft OAuth2 client secret from Azure App Registrations.",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_microsoft_tenant": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Azure AD tenant ID or one of 'common', 'organizations', 'consumers'. "
|
||||
"Use 'common' to allow any Microsoft account. Use a specific GUID to "
|
||||
"restrict to a single organization."
|
||||
),
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_apple_enabled": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Enable Sign in with Apple. Requires an Apple Developer account with "
|
||||
"a Services ID configured for Sign in with Apple."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
"help_link": "https://developer.apple.com/account/resources/identifiers/list/serviceId",
|
||||
"help_link_label": "Apple Developer Portal",
|
||||
},
|
||||
"social_auth_apple_client_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Apple Services ID (e.g. com.example.docuelevate).",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_apple_team_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Apple Developer Team ID (10-character alphanumeric string).",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_apple_key_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Apple Sign-In private key ID from the Apple Developer Portal.",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_apple_private_key": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Apple Sign-In private key (PEM format). Generate this in the Apple Developer Portal. "
|
||||
"Paste the entire key content including BEGIN/END headers."
|
||||
),
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_dropbox_enabled": {
|
||||
"category": "Social Login",
|
||||
"description": (
|
||||
"Enable Dropbox Sign-In. Uses the same Dropbox App you may already have "
|
||||
"configured for storage, or a separate one."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_dropbox_client_id": {
|
||||
"category": "Social Login",
|
||||
"description": "Dropbox OAuth2 App Key from the Dropbox App Console.",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
"social_auth_dropbox_client_secret": {
|
||||
"category": "Social Login",
|
||||
"description": "Dropbox OAuth2 App Secret from the Dropbox App Console.",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": True,
|
||||
},
|
||||
# AI Services
|
||||
"openai_api_key": {
|
||||
"category": "AI Services",
|
||||
@@ -495,6 +642,14 @@ SETTING_METADATA = {
|
||||
"options": ["us", "eu"],
|
||||
},
|
||||
# Storage Providers - Dropbox
|
||||
"dropbox_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable Dropbox as an upload destination. When disabled, no documents will be sent to Dropbox even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"dropbox_app_key": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Dropbox app key for OAuth authentication",
|
||||
@@ -528,6 +683,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - Nextcloud
|
||||
"nextcloud_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable Nextcloud as an upload destination. When disabled, no documents will be sent to Nextcloud even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"nextcloud_upload_url": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Nextcloud WebDAV upload URL",
|
||||
@@ -561,6 +724,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - Paperless-ngx
|
||||
"paperless_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable Paperless-ngx as an upload destination. When disabled, no documents will be sent to Paperless-ngx even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"paperless_ngx_api_token": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Paperless-ngx API authentication token",
|
||||
@@ -578,6 +749,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - Google Drive
|
||||
"google_drive_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable Google Drive as an upload destination. When disabled, no documents will be sent to Google Drive even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"google_drive_credentials_json": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Google Drive service account credentials JSON",
|
||||
@@ -635,6 +814,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - OneDrive
|
||||
"onedrive_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable OneDrive as an upload destination. When disabled, no documents will be sent to OneDrive even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"onedrive_client_id": {
|
||||
"category": "Storage Providers",
|
||||
"description": "OneDrive OAuth client ID",
|
||||
@@ -676,6 +863,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - WebDAV
|
||||
"webdav_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable WebDAV as an upload destination. When disabled, no documents will be sent to WebDAV even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"webdav_url": {
|
||||
"category": "Storage Providers",
|
||||
"description": "WebDAV server URL",
|
||||
@@ -717,6 +912,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - FTP
|
||||
"ftp_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable FTP as an upload destination. When disabled, no documents will be sent to FTP even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"ftp_host": {
|
||||
"category": "Storage Providers",
|
||||
"description": "FTP server hostname or IP address",
|
||||
@@ -774,6 +977,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - SFTP
|
||||
"sftp_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable SFTP as an upload destination. When disabled, no documents will be sent to SFTP even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"sftp_host": {
|
||||
"category": "Storage Providers",
|
||||
"description": "SFTP server hostname or IP address",
|
||||
@@ -838,7 +1049,56 @@ SETTING_METADATA = {
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - iCloud Drive
|
||||
"icloud_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable iCloud Drive as an upload destination. When disabled, no documents will be sent to iCloud Drive even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"icloud_username": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Apple ID email address for iCloud Drive authentication",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"icloud_password": {
|
||||
"category": "Storage Providers",
|
||||
"description": "App-specific password for iCloud Drive (generate at https://appleid.apple.com)",
|
||||
"type": "string",
|
||||
"sensitive": True,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"icloud_folder": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Target folder path in iCloud Drive (e.g. Documents/Uploads)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"icloud_cookie_directory": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Directory for persisting iCloud session cookies (default: ~/.pyicloud)",
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Storage Providers - AWS S3
|
||||
"s3_enabled": {
|
||||
"category": "Storage Providers",
|
||||
"description": "Enable Amazon S3 as an upload destination. When disabled, no documents will be sent to S3 even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"aws_access_key_id": {
|
||||
"category": "Storage Providers",
|
||||
"description": "AWS access key ID for S3",
|
||||
@@ -972,6 +1232,14 @@ SETTING_METADATA = {
|
||||
"restart_required": False,
|
||||
},
|
||||
# Email Destination Settings (dedicated SMTP for document delivery)
|
||||
"dest_email_enabled": {
|
||||
"category": "Email Destination",
|
||||
"description": "Enable Email as an upload destination. When disabled, no documents will be delivered via email even if credentials are configured.",
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"dest_email_host": {
|
||||
"category": "Email Destination",
|
||||
"description": "SMTP server hostname for document delivery (separate from shared email settings)",
|
||||
@@ -1392,6 +1660,18 @@ SETTING_METADATA = {
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"imap_attachment_filter": {
|
||||
"category": "IMAP",
|
||||
"description": (
|
||||
"Controls which attachment types are ingested from IMAP emails. "
|
||||
"Accepted values: 'documents_only' (PDFs and office files only, default) or 'all' (including images). "
|
||||
"Per-user IMAP accounts can override this global default."
|
||||
),
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Monitoring - Uptime Kuma
|
||||
"uptime_kuma_url": {
|
||||
"category": "Monitoring",
|
||||
@@ -1595,6 +1875,18 @@ SETTING_METADATA = {
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"compliance_enabled": {
|
||||
"category": "Feature Flags",
|
||||
"description": (
|
||||
"Enable the compliance templates dashboard (GDPR, HIPAA, SOC 2). "
|
||||
"When enabled, admins can view compliance status and apply "
|
||||
"pre-built regulatory configurations. Default: True."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
# Backup / Restore
|
||||
"backup_enabled": {
|
||||
"category": "Backup",
|
||||
|
||||
@@ -210,6 +210,19 @@ def dispatch_user_notification(
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
# 3. Send push notifications to registered mobile devices
|
||||
try:
|
||||
from app.utils.push_notification import send_push_to_owner
|
||||
|
||||
send_push_to_owner(
|
||||
owner_id=owner_id,
|
||||
title=title,
|
||||
body=message,
|
||||
data={"event_type": event_type, "file_id": file_id},
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Error sending push notification for owner_id=%s event=%s", owner_id, event_type)
|
||||
|
||||
|
||||
def notify_user_document_processed(owner_id: str, filename: str, file_id: int | None = None) -> None:
|
||||
"""Notify a user that their document was successfully processed."""
|
||||
|
||||
@@ -8,6 +8,7 @@ from app.views.admin_users import router as admin_users_router
|
||||
from app.views.api_tokens import router as api_tokens_router
|
||||
from app.views.audit_logs import router as audit_logs_router
|
||||
from app.views.backup import router as backup_router
|
||||
from app.views.compliance import router as compliance_router
|
||||
from app.views.db_wizard import router as db_wizard_router
|
||||
from app.views.dropbox import router as dropbox_router
|
||||
from app.views.filemanager import router as filemanager_router
|
||||
@@ -63,3 +64,4 @@ router.include_router(notifications_router) # User notification dashboard
|
||||
router.include_router(scheduled_jobs_router) # Admin scheduled batch jobs
|
||||
router.include_router(audit_logs_router) # Comprehensive audit log viewer
|
||||
router.include_router(help_router) # Built-in help / How-To docs
|
||||
router.include_router(compliance_router) # Compliance templates dashboard
|
||||
|
||||
@@ -35,9 +35,12 @@ templates.env.globals["max"] = max
|
||||
# The _() function is available in every template to translate UI strings.
|
||||
# Usage: {{ _("nav.dashboard") }} or {{ _("upload.max_size", size="10 MB") }}
|
||||
# The locale is automatically resolved from the request context.
|
||||
# A default English implementation is registered as a global so error handlers
|
||||
# that don't go through _inject_global_context still have the function available.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
templates.env.globals["supported_languages"] = SUPPORTED_LANGUAGES
|
||||
templates.env.globals["_"] = lambda key, **kwargs: translate(key, "en", **kwargs)
|
||||
|
||||
# Customize Jinja2Templates to include app_version in all templates
|
||||
original_template_response = templates.TemplateResponse
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
"""Admin view: compliance templates dashboard page."""
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import HTTPException, Request, status
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from app.views.base import APIRouter, require_login, settings, templates
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
def _require_admin(request: Request):
|
||||
"""Return the session user if they are an admin, else None."""
|
||||
user = request.session.get("user")
|
||||
if not user or not user.get("is_admin"):
|
||||
logger.warning("Non-admin user attempted to access /admin/compliance")
|
||||
return None
|
||||
return user
|
||||
|
||||
|
||||
@router.get("/admin/compliance")
|
||||
@require_login
|
||||
async def compliance_page(request: Request):
|
||||
"""Admin compliance templates dashboard page.
|
||||
|
||||
Displays GDPR, HIPAA, and SOC2 compliance templates with their current
|
||||
status and one-click apply functionality.
|
||||
"""
|
||||
user = _require_admin(request)
|
||||
if user is None:
|
||||
return RedirectResponse(url="/", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
try:
|
||||
return templates.TemplateResponse(
|
||||
"compliance.html",
|
||||
{
|
||||
"request": request,
|
||||
"app_version": settings.version,
|
||||
},
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"Error loading compliance page: {e}")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail="Failed to load compliance page",
|
||||
)
|
||||
@@ -1,11 +1,13 @@
|
||||
"""User-facing view for the per-user IMAP ingestion dashboard."""
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
from fastapi import Request
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models import UserImapAccount
|
||||
from app.models import ImapIngestionProfile, UserImapAccount
|
||||
from app.utils.allowed_types import DEFAULT_CATEGORIES, FILE_TYPE_CATEGORIES
|
||||
from app.utils.subscription import get_tier, get_user_tier_id
|
||||
from app.utils.user_scope import get_current_owner_id
|
||||
from app.views.base import APIRouter, Depends, get_db, require_login, templates
|
||||
@@ -25,6 +27,22 @@ def _get_max_mailboxes(tier: dict) -> int | None:
|
||||
return max_mb
|
||||
|
||||
|
||||
def _serialize_profile(profile: ImapIngestionProfile) -> dict:
|
||||
"""Serialize a profile for JSON embedding in the template."""
|
||||
try:
|
||||
categories = json.loads(profile.allowed_categories)
|
||||
except (ValueError, TypeError):
|
||||
categories = []
|
||||
return {
|
||||
"id": profile.id,
|
||||
"name": profile.name,
|
||||
"description": profile.description,
|
||||
"owner_id": profile.owner_id,
|
||||
"allowed_categories": categories,
|
||||
"is_builtin": profile.is_builtin,
|
||||
}
|
||||
|
||||
|
||||
@router.get("/imap-accounts")
|
||||
@require_login
|
||||
async def imap_accounts_page(request: Request, db: Session = Depends(get_db)):
|
||||
@@ -49,11 +67,35 @@ async def imap_accounts_page(request: Request, db: Session = Depends(get_db)):
|
||||
max_mailboxes = _get_max_mailboxes(tier)
|
||||
can_add = max_mailboxes is None or (max_mailboxes > 0 and current_count < max_mailboxes)
|
||||
|
||||
# Load ingestion profiles: system-global + user's own
|
||||
profiles = (
|
||||
db.query(ImapIngestionProfile)
|
||||
.filter(
|
||||
# SQLAlchemy requires `== None` for IS NULL comparison in ORM filters
|
||||
(ImapIngestionProfile.owner_id == None) | (ImapIngestionProfile.owner_id == owner_id) # noqa: E711
|
||||
)
|
||||
.order_by(ImapIngestionProfile.is_builtin.desc(), ImapIngestionProfile.id)
|
||||
.all()
|
||||
)
|
||||
|
||||
# Category definitions for the UI checkbox builder
|
||||
categories = [
|
||||
{
|
||||
"key": key,
|
||||
"label": info["label"],
|
||||
"description": info["description"],
|
||||
}
|
||||
for key, info in FILE_TYPE_CATEGORIES.items()
|
||||
]
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"imap_accounts.html",
|
||||
{
|
||||
"request": request,
|
||||
"accounts": accounts,
|
||||
"profiles": [_serialize_profile(p) for p in profiles],
|
||||
"categories": categories,
|
||||
"default_categories": DEFAULT_CATEGORIES,
|
||||
"current_count": current_count,
|
||||
"max_mailboxes": max_mailboxes,
|
||||
"can_add": can_add,
|
||||
|
||||
@@ -27,6 +27,7 @@ _DESTINATION_META: list[dict] = [
|
||||
{"id": "webdav", "name": "WebDAV", "icon": "fas fa-server"},
|
||||
{"id": "sftp", "name": "SFTP", "icon": "fas fa-terminal"},
|
||||
{"id": "ftp", "name": "FTP", "icon": "fas fa-server"},
|
||||
{"id": "icloud", "name": "iCloud Drive", "icon": "fab fa-apple"},
|
||||
]
|
||||
|
||||
|
||||
@@ -51,6 +52,7 @@ def _get_configured_destinations(cfg: Settings) -> list[dict]:
|
||||
"webdav": bool(cfg.webdav_url and cfg.webdav_username),
|
||||
"sftp": bool(cfg.sftp_host and cfg.sftp_username),
|
||||
"ftp": bool(cfg.ftp_host and cfg.ftp_username),
|
||||
"icloud": bool(cfg.icloud_username and cfg.icloud_password),
|
||||
}
|
||||
return [meta for meta in _DESTINATION_META if checks.get(meta["id"], False)]
|
||||
|
||||
|
||||
+1
-2
@@ -3,12 +3,11 @@
|
||||
from fastapi import Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi.routing import APIRouter
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from app.auth import require_login
|
||||
from app.views.base import templates
|
||||
|
||||
router = APIRouter()
|
||||
templates = Jinja2Templates(directory="frontend/templates")
|
||||
|
||||
|
||||
@router.get("/admin/plans", response_class=HTMLResponse)
|
||||
|
||||
+188
@@ -2063,3 +2063,191 @@ print(response.json())
|
||||
## Further Assistance
|
||||
|
||||
For additional help with the API, please contact our support team or refer to the [Development Guide](../CONTRIBUTING.md).
|
||||
|
||||
## Mobile App API
|
||||
|
||||
The mobile API provides endpoints used by the native iOS and Android app. All endpoints require authentication (Bearer token or active session cookie).
|
||||
|
||||
For full mobile app documentation see [MobileApp.md](./MobileApp.md).
|
||||
|
||||
### POST /api/mobile/generate-token
|
||||
|
||||
Exchange an active web session for a long-lived API token scoped to the mobile app.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{ "device_name": "John's iPhone" }
|
||||
```
|
||||
|
||||
**Response (201 Created):**
|
||||
```json
|
||||
{
|
||||
"token": "de_AbCdEfGhIjKl...",
|
||||
"token_id": 42,
|
||||
"name": "Mobile App – John's iPhone",
|
||||
"created_at": "2026-03-10T09:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
> The `token` is shown **once only**.
|
||||
|
||||
### POST /api/mobile/register-device
|
||||
|
||||
Register an Expo push token to receive push notifications.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{
|
||||
"push_token": "ExponentPushToken[xxxxxx]",
|
||||
"device_name": "John's iPhone",
|
||||
"platform": "ios"
|
||||
}
|
||||
```
|
||||
|
||||
**Response (201 Created):** Device record with `id`, `platform`, `is_active`, `created_at`.
|
||||
|
||||
### GET /api/mobile/devices
|
||||
|
||||
List all registered push-notification devices for the current user.
|
||||
|
||||
**Response (200 OK):** Array of device records.
|
||||
|
||||
### DELETE /api/mobile/devices/{device_id}
|
||||
|
||||
Deactivate a push-notification device. The device will no longer receive push notifications.
|
||||
|
||||
**Response (204 No Content)**
|
||||
|
||||
### GET /api/mobile/whoami
|
||||
|
||||
Return basic profile information for the authenticated user.
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"owner_id": "john@example.com",
|
||||
"display_name": "John Doe",
|
||||
"email": "john@example.com",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/...",
|
||||
"is_admin": false
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## GraphQL API
|
||||
|
||||
DocuElevate exposes a GraphQL API at `/graphql` alongside the REST API. It
|
||||
supports flexible queries with field selection, making it ideal for dashboards
|
||||
and integrations that only need a subset of the available data.
|
||||
|
||||
### Endpoint
|
||||
|
||||
| Method | URL | Description |
|
||||
|--------|-----|-------------|
|
||||
| `POST` | `/graphql` | Execute a GraphQL query or mutation |
|
||||
| `GET` | `/graphql` | Open the GraphiQL interactive playground |
|
||||
|
||||
### Authentication
|
||||
|
||||
The GraphQL endpoint honours the same authentication rules as the REST API:
|
||||
|
||||
- **`AUTH_ENABLED=False`** (default, single-user mode): all queries are
|
||||
allowed without credentials.
|
||||
- **`AUTH_ENABLED=True`** (multi-user mode): a valid session cookie **or**
|
||||
an `Authorization: Bearer <token>` API token is required. Admin-only
|
||||
queries (settings, users) additionally require the `is_admin` flag.
|
||||
|
||||
### Available Queries
|
||||
|
||||
| Field | Returns | Notes |
|
||||
|-------|---------|-------|
|
||||
| `documents(ownerId, limit, offset)` | `[DocumentType]` | Paginated list of documents |
|
||||
| `document(id)` | `DocumentType` | Single document by primary key |
|
||||
| `pipelines(ownerId, limit, offset)` | `[PipelineType]` | Paginated list of pipelines with steps |
|
||||
| `pipeline(id)` | `PipelineType` | Single pipeline by primary key |
|
||||
| `settings(limit, offset)` | `[SettingType]` | Non-sensitive app settings (**admin only**) |
|
||||
| `users(limit, offset)` | `[UserType]` | User profiles (**admin only**) |
|
||||
| `user(userId)` | `UserType` | Single user profile (**admin only**) |
|
||||
|
||||
> **Note:** Sensitive configuration keys (API secrets, passwords, tokens) are
|
||||
> automatically excluded from the `settings` query regardless of the caller's
|
||||
> privilege level.
|
||||
|
||||
### GraphiQL Playground
|
||||
|
||||
Navigate to `http://<your-instance>/graphql` in a browser to open the
|
||||
interactive GraphiQL IDE, which provides schema documentation, auto-complete,
|
||||
and the ability to run queries directly.
|
||||
|
||||
### Example Queries
|
||||
|
||||
**List recent documents:**
|
||||
```graphql
|
||||
{
|
||||
documents(limit: 5) {
|
||||
id
|
||||
originalFilename
|
||||
mimeType
|
||||
fileSize
|
||||
documentTitle
|
||||
createdAt
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Fetch a pipeline with its steps:**
|
||||
```graphql
|
||||
{
|
||||
pipeline(id: 1) {
|
||||
id
|
||||
name
|
||||
description
|
||||
isDefault
|
||||
isActive
|
||||
steps {
|
||||
position
|
||||
stepType
|
||||
label
|
||||
enabled
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**List application settings (admin only):**
|
||||
```graphql
|
||||
{
|
||||
settings {
|
||||
key
|
||||
value
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**List user profiles (admin only):**
|
||||
```graphql
|
||||
{
|
||||
users(limit: 10) {
|
||||
userId
|
||||
displayName
|
||||
subscriptionTier
|
||||
isBlocked
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Using variables:**
|
||||
```graphql
|
||||
query GetDocument($id: Int!) {
|
||||
document(id: $id) {
|
||||
id
|
||||
originalFilename
|
||||
documentTitle
|
||||
isDuplicate
|
||||
ocrQualityScore
|
||||
}
|
||||
}
|
||||
```
|
||||
Variables: `{ "id": 42 }`
|
||||
|
||||
@@ -20,10 +20,11 @@ For a complete list of configuration options, see the [Configuration Guide](Conf
|
||||
|
||||
## Authentication Methods
|
||||
|
||||
DocuElevate supports two primary authentication methods:
|
||||
DocuElevate supports multiple authentication methods that can be used independently or together:
|
||||
|
||||
1. **Simple Authentication** - Basic username/password authentication managed by DocuElevate
|
||||
2. **OpenID Connect** - Integration with identity providers like Authentik, Keycloak, or Auth0
|
||||
3. **Social Login** - Sign in with Google, Microsoft, Apple, or Dropbox accounts (see [Social Login Setup Guide](SocialLoginSetup.md))
|
||||
|
||||
## Session Security
|
||||
|
||||
@@ -189,3 +190,11 @@ If you encounter issues with authentication:
|
||||
- For most providers, you can visit the `/.well-known/openid-configuration` endpoint to verify their settings
|
||||
|
||||
For more general configuration issues, see the [Configuration Troubleshooting Guide](ConfigurationTroubleshooting.md).
|
||||
|
||||
## Social Login
|
||||
|
||||
DocuElevate supports social login with Google, Microsoft, Apple, and Dropbox. Social login allows users to authenticate using their existing accounts with these providers, without needing a separate DocuElevate password.
|
||||
|
||||
Social login can be used alongside any other authentication method (simple auth, OIDC, local signup). Each social provider is independently configured.
|
||||
|
||||
For detailed setup instructions, prerequisites, and provider-specific configuration, see the **[Social Login Setup Guide](SocialLoginSetup.md)**.
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
# Compliance Templates Guide
|
||||
|
||||
DocuElevate includes pre-built compliance templates for **GDPR**, **HIPAA**, and **SOC 2** that help you configure your instance to meet regulatory requirements. This guide covers how to use the compliance dashboard, apply templates, and monitor your compliance status.
|
||||
|
||||
## Overview
|
||||
|
||||
The compliance templates feature provides:
|
||||
|
||||
- **Pre-built configurations** for GDPR, HIPAA, and SOC 2
|
||||
- **One-click apply** to configure all required settings at once
|
||||
- **Compliance status dashboard** to monitor your regulatory posture
|
||||
- **Individual check results** showing which settings are compliant and which need attention
|
||||
|
||||
## Accessing the Dashboard
|
||||
|
||||
The compliance dashboard is available to **admin users only**.
|
||||
|
||||
1. Log in as an administrator
|
||||
2. Click **Admin** in the navigation bar
|
||||
3. Select **Compliance** from the dropdown menu
|
||||
|
||||
Or navigate directly to: `/admin/compliance`
|
||||
|
||||
## Available Templates
|
||||
|
||||
### GDPR (General Data Protection Regulation)
|
||||
|
||||
The European Union regulation for data protection and privacy. The GDPR template enforces:
|
||||
|
||||
| Setting | Value | Purpose |
|
||||
|---------|-------|---------|
|
||||
| `AUTH_ENABLED` | `True` | Controls access to personal data |
|
||||
| `SENTRY_SEND_DEFAULT_PII` | `False` | Prevents PII leaking to external services |
|
||||
| `SECURITY_HEADERS_ENABLED` | `True` | Protects against common web vulnerabilities |
|
||||
| `SECURITY_HEADER_HSTS_ENABLED` | `True` | Ensures encrypted connections |
|
||||
| `SECURITY_HEADER_CSP_ENABLED` | `True` | Prevents XSS and injection attacks |
|
||||
| `SECURITY_HEADER_X_FRAME_OPTIONS_ENABLED` | `True` | Prevents clickjacking |
|
||||
| `ENABLE_DEDUPLICATION` | `True` | Data minimisation — avoids duplicate storage |
|
||||
|
||||
### HIPAA (Health Insurance Portability and Accountability Act)
|
||||
|
||||
United States regulation for protecting health information. The HIPAA template includes all GDPR settings plus:
|
||||
|
||||
| Setting | Value | Purpose |
|
||||
|---------|-------|---------|
|
||||
| `MULTI_USER_ENABLED` | `True` | Individual accounts for access accountability |
|
||||
|
||||
### SOC 2 (Service Organization Control 2)
|
||||
|
||||
Trust Service Criteria framework for service organisations. The SOC 2 template includes the same settings as HIPAA, mapped to SOC 2 Trust Service Criteria (CC6.x, PI1.x).
|
||||
|
||||
## Applying a Template
|
||||
|
||||
1. Navigate to the **Compliance** dashboard (`/admin/compliance`)
|
||||
2. Find the template you want to apply (GDPR, HIPAA, or SOC 2)
|
||||
3. Click **Apply Template**
|
||||
4. Confirm the action in the dialog
|
||||
5. The template settings are written to the database immediately
|
||||
|
||||
> **Note:** Applying a template writes configuration values to the database. Some settings (e.g., security headers) may require a restart to take effect. Check the Settings page for restart indicators.
|
||||
|
||||
## Understanding Compliance Status
|
||||
|
||||
Each template shows one of four statuses:
|
||||
|
||||
| Status | Badge | Meaning |
|
||||
|--------|-------|---------|
|
||||
| **Compliant** | Green | All checks are passing |
|
||||
| **Partial** | Yellow | Some checks are passing, others are not |
|
||||
| **Non-Compliant** | Red | No checks are passing |
|
||||
| **Not Applied** | Grey | Template has never been applied |
|
||||
|
||||
### Individual Checks
|
||||
|
||||
Click **Show Details** on any template card to see individual check results:
|
||||
|
||||
- ✅ **Passing** — The setting matches the expected compliance value
|
||||
- ❌ **Failing** — The setting does not match; the current and expected values are shown
|
||||
|
||||
## API Endpoints
|
||||
|
||||
The compliance feature exposes the following API endpoints under `/api/compliance/`:
|
||||
|
||||
### List Templates
|
||||
|
||||
```bash
|
||||
GET /api/compliance/templates
|
||||
```
|
||||
|
||||
Returns all compliance templates with their current status.
|
||||
|
||||
### Get Single Template
|
||||
|
||||
```bash
|
||||
GET /api/compliance/templates/{name}
|
||||
```
|
||||
|
||||
Returns a single template by name (`gdpr`, `hipaa`, or `soc2`).
|
||||
|
||||
### Apply Template
|
||||
|
||||
```bash
|
||||
POST /api/compliance/templates/{name}/apply
|
||||
```
|
||||
|
||||
Applies a compliance template, writing all its settings to the database.
|
||||
|
||||
### Get Template Status
|
||||
|
||||
```bash
|
||||
GET /api/compliance/templates/{name}/status
|
||||
```
|
||||
|
||||
Evaluates the live compliance status of a template against current settings.
|
||||
|
||||
**Response example:**
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "partial",
|
||||
"total": 7,
|
||||
"passed": 5,
|
||||
"failed": 2,
|
||||
"check_results": [
|
||||
{
|
||||
"key": "auth_enabled",
|
||||
"label": "Authentication enabled",
|
||||
"description": "User authentication must be enabled to control access to personal data.",
|
||||
"expected": "True",
|
||||
"actual": "True",
|
||||
"passing": true
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Compliance Summary
|
||||
|
||||
```bash
|
||||
GET /api/compliance/summary
|
||||
```
|
||||
|
||||
Returns an overall compliance summary across all templates.
|
||||
|
||||
**Response example:**
|
||||
|
||||
```json
|
||||
{
|
||||
"overall_status": "partial",
|
||||
"total_checks": 22,
|
||||
"total_passed": 18,
|
||||
"total_failed": 4,
|
||||
"templates": [
|
||||
{
|
||||
"name": "gdpr",
|
||||
"display_name": "GDPR (General Data Protection Regulation)",
|
||||
"enabled": true,
|
||||
"status": "compliant",
|
||||
"total": 7,
|
||||
"passed": 7,
|
||||
"failed": 0,
|
||||
"applied_at": "2026-03-09T12:00:00+00:00",
|
||||
"applied_by": "admin@example.com"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
> **Note:** All API endpoints require admin authentication.
|
||||
|
||||
## Configuration
|
||||
|
||||
| Variable | Default | Description |
|
||||
|----------|---------|-------------|
|
||||
| `COMPLIANCE_ENABLED` | `True` | Enable the compliance templates dashboard. Set to `False` to hide the feature. |
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Apply templates before going live** — Set up compliance before processing real documents
|
||||
2. **Monitor status regularly** — Check the compliance dashboard after configuration changes
|
||||
3. **Use the refresh button** — After changing settings elsewhere, refresh the compliance page to see updated status
|
||||
4. **Combine templates** — You can apply multiple templates; settings overlap is handled automatically
|
||||
5. **Review after updates** — After upgrading DocuElevate, review your compliance status as new checks may be added
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Configuration Guide](./ConfigurationGuide.md) — Full list of configuration options
|
||||
- [Privacy & Compliance Guide](./PrivacyCompliance.md) — Privacy notice and GDPR compliance details
|
||||
- [Deployment Guide](./DeploymentGuide.md) — Production deployment with security best practices
|
||||
- [Security Audit](../SECURITY_AUDIT.md) — Security findings and mitigations
|
||||
@@ -16,6 +16,7 @@ Configuration is primarily done through environment variables specified in a `.e
|
||||
| `GOTENBERG_URL` | Gotenberg PDF processing URL. | `http://gotenberg:3000` |
|
||||
| `EXTERNAL_HOSTNAME` | The external hostname for the application. | `docuelevate.example.com` |
|
||||
| `ALLOW_FILE_DELETE` | Enable file deletion in the web interface (`true`/`false`). | `true` |
|
||||
| `COMPLIANCE_ENABLED` | Enable the compliance templates dashboard (GDPR, HIPAA, SOC 2). | `true` |
|
||||
|
||||
### Batch Processing Settings
|
||||
|
||||
@@ -303,6 +304,42 @@ DocuElevate can automatically pull document attachments from IMAP mailboxes —
|
||||
| `IMAP1_SSL` | Use SSL (`true`/`false`). | `true` |
|
||||
| `IMAP1_POLL_INTERVAL_MINUTES` | Frequency in minutes to poll for new mail. | `5` |
|
||||
| `IMAP_READONLY_MODE` | When `true`, fetches and processes attachments but does **not** modify the mailbox (no starring, labeling, deleting, or flag changes). Use for pre-production instances sharing a mailbox with production. Default: `false`. | `false` |
|
||||
| `IMAP_ATTACHMENT_FILTER` | System-wide fallback for which attachment types are ingested when no ingestion profile is assigned to a mailbox. `documents_only` (default) ingests PDFs and office files only — images are skipped. `all` ingests every supported file type including images. Individual IMAP accounts can override this using ingestion profiles. | `documents_only` |
|
||||
|
||||
#### IMAP Ingestion Profiles
|
||||
|
||||
For fine-grained control, DocuElevate supports **Ingestion Profiles** — named configurations that let you choose exactly which file-type categories to accept from each mailbox.
|
||||
|
||||
Each profile contains a list of enabled **categories**:
|
||||
|
||||
| Category | Description |
|
||||
|----------|-------------|
|
||||
| `pdf` | PDF documents (`.pdf`) |
|
||||
| `office` | Microsoft Office files (Word, Excel, PowerPoint — `.docx`, `.xlsx`, `.pptx`, …) |
|
||||
| `opendocument` | LibreOffice/OpenOffice files (`.odt`, `.ods`, `.odp`, …) |
|
||||
| `text` | Plain text, CSV and RTF files (`.txt`, `.csv`, `.rtf`) |
|
||||
| `web` | HTML and Markdown files (`.html`, `.htm`, `.md`, `.markdown`) |
|
||||
| `images` | Image files (`.jpg`, `.png`, `.gif`, `.bmp`, `.tiff`, `.webp`, `.svg`) |
|
||||
|
||||
Two built-in system profiles are seeded automatically:
|
||||
|
||||
| Profile | Categories |
|
||||
|---------|------------|
|
||||
| **Documents Only** | pdf, office, opendocument, text, web (no images) |
|
||||
| **All Files** | All categories, including images |
|
||||
|
||||
Users can create their own custom profiles via the **Email Ingestion** dashboard (`/imap-accounts`) by clicking the **Manage profiles** link or the **+** button next to the profile dropdown. Custom profiles are private to the creating user and can be freely edited or deleted.
|
||||
|
||||
**API endpoints for ingestion profiles:**
|
||||
|
||||
| Method | Endpoint | Description |
|
||||
|--------|----------|-------------|
|
||||
| `GET` | `/api/imap-profiles/` | List all visible profiles (system + user's own) |
|
||||
| `POST` | `/api/imap-profiles/` | Create a new profile |
|
||||
| `GET` | `/api/imap-profiles/categories` | List available file-type categories |
|
||||
| `GET` | `/api/imap-profiles/{id}` | Get a single profile |
|
||||
| `PUT` | `/api/imap-profiles/{id}` | Update a profile (not built-in) |
|
||||
| `DELETE` | `/api/imap-profiles/{id}` | Delete a profile (not built-in) |
|
||||
|
||||
#### Per-User IMAP Integrations
|
||||
|
||||
@@ -335,6 +372,28 @@ Credentials are encrypted at rest using Fernet encryption.
|
||||
| `AUTHENTIK_CONFIG_URL` | Configuration URL for Authentik OpenID Connect. |
|
||||
| `OAUTH_PROVIDER_NAME` | Display name for the OAuth provider button. |
|
||||
|
||||
### Social Login Providers
|
||||
|
||||
Social login lets users sign in with their existing Google, Microsoft, Apple, or Dropbox accounts. Each provider is independently enabled and configured. For detailed setup instructions see the [Social Login Setup Guide](SocialLoginSetup.md).
|
||||
|
||||
| **Variable** | **Description** | **Default** |
|
||||
|---|---|---|
|
||||
| `SOCIAL_AUTH_GOOGLE_ENABLED` | Enable Google Sign-In. | `false` |
|
||||
| `SOCIAL_AUTH_GOOGLE_CLIENT_ID` | Google OAuth2 client ID from the Google Cloud Console. | *(empty)* |
|
||||
| `SOCIAL_AUTH_GOOGLE_CLIENT_SECRET` | Google OAuth2 client secret. | *(empty)* |
|
||||
| `SOCIAL_AUTH_MICROSOFT_ENABLED` | Enable Microsoft Sign-In (Azure AD / Microsoft Entra ID). | `false` |
|
||||
| `SOCIAL_AUTH_MICROSOFT_CLIENT_ID` | Microsoft application (client) ID from Azure App Registrations. | *(empty)* |
|
||||
| `SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET` | Microsoft client secret. | *(empty)* |
|
||||
| `SOCIAL_AUTH_MICROSOFT_TENANT` | Azure AD tenant: `common`, `organizations`, `consumers`, or a tenant GUID. | `common` |
|
||||
| `SOCIAL_AUTH_APPLE_ENABLED` | Enable Sign in with Apple. | `false` |
|
||||
| `SOCIAL_AUTH_APPLE_CLIENT_ID` | Apple Services ID (e.g. `com.example.docuelevate`). | *(empty)* |
|
||||
| `SOCIAL_AUTH_APPLE_TEAM_ID` | Apple Developer Team ID. | *(empty)* |
|
||||
| `SOCIAL_AUTH_APPLE_KEY_ID` | Apple Sign-In private key ID. | *(empty)* |
|
||||
| `SOCIAL_AUTH_APPLE_PRIVATE_KEY` | Apple Sign-In private key (PEM format). | *(empty)* |
|
||||
| `SOCIAL_AUTH_DROPBOX_ENABLED` | Enable Dropbox Sign-In. | `false` |
|
||||
| `SOCIAL_AUTH_DROPBOX_CLIENT_ID` | Dropbox OAuth2 App Key. | *(empty)* |
|
||||
| `SOCIAL_AUTH_DROPBOX_CLIENT_SECRET` | Dropbox OAuth2 App Secret. | *(empty)* |
|
||||
|
||||
### Multi-User Mode
|
||||
|
||||
When multi-user mode is enabled, each authenticated user gets their own isolated document space.
|
||||
@@ -942,6 +1001,7 @@ TESSERACT_LANGUAGE=eng+deu
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|-------------------------------------|-----------------------------------------------------------------------------------------------------|
|
||||
| `PAPERLESS_ENABLED` | Set to `false` to disable Paperless-ngx uploads without removing credentials. Default: `true` |
|
||||
| `PAPERLESS_NGX_API_TOKEN` | API token for Paperless NGX. |
|
||||
| `PAPERLESS_HOST` | Root URL for Paperless NGX (e.g. `https://paperless.example.com`). |
|
||||
| `PAPERLESS_CUSTOM_FIELD_ABSENDER` | (Optional, Legacy) Name of the custom field in Paperless-ngx to store the sender ("absender") information. If set, the extracted sender will be automatically set as a custom field after document upload. Example: `Absender` or `Sender` |
|
||||
@@ -984,6 +1044,7 @@ PAPERLESS_CUSTOM_FIELDS_MAPPING='{"absender": "Sender", "empfaenger": "Recipient
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|-------------------------|--------------------------------------------------|
|
||||
| `DROPBOX_ENABLED` | Set to `false` to disable Dropbox uploads without removing credentials. Default: `true` |
|
||||
| `DROPBOX_APP_KEY` | Dropbox API app key. |
|
||||
| `DROPBOX_APP_SECRET` | Dropbox API app secret. |
|
||||
| `DROPBOX_REFRESH_TOKEN` | OAuth2 refresh token for Dropbox. |
|
||||
@@ -995,6 +1056,7 @@ For detailed setup instructions, see the [Dropbox Setup Guide](DropboxSetup.md).
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|-------------------------|---------------------------------------------------------------|
|
||||
| `NEXTCLOUD_ENABLED` | Set to `false` to disable Nextcloud uploads without removing credentials. Default: `true` |
|
||||
| `NEXTCLOUD_UPLOAD_URL` | Nextcloud WebDAV URL (e.g. `https://nc.example.com/remote.php/dav/files/<USERNAME>`). |
|
||||
| `NEXTCLOUD_USERNAME` | Nextcloud login username. |
|
||||
| `NEXTCLOUD_PASSWORD` | Nextcloud login password. |
|
||||
@@ -1004,6 +1066,7 @@ For detailed setup instructions, see the [Dropbox Setup Guide](DropboxSetup.md).
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|---------------------------------|-------------------------------------------------------|
|
||||
| `GOOGLE_DRIVE_ENABLED` | Set to `false` to disable Google Drive uploads without removing credentials. Default: `true` |
|
||||
| `GOOGLE_DRIVE_USE_OAUTH` | Set to `true` to use OAuth flow (recommended) |
|
||||
| `GOOGLE_DRIVE_CLIENT_ID` | OAuth Client ID (required if using OAuth flow) |
|
||||
| `GOOGLE_DRIVE_CLIENT_SECRET` | OAuth Client Secret (required if using OAuth flow) |
|
||||
@@ -1020,6 +1083,7 @@ For detailed setup instructions, see the [Google Drive Setup Guide](GoogleDriveS
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|-------------------------|---------------------------------------------------------------|
|
||||
| `WEBDAV_ENABLED` | Set to `false` to disable WebDAV uploads without removing credentials. Default: `true` |
|
||||
| `WEBDAV_URL` | WebDAV server URL (e.g. `https://webdav.example.com/path`). |
|
||||
| `WEBDAV_USERNAME` | WebDAV authentication username. |
|
||||
| `WEBDAV_PASSWORD` | WebDAV authentication password. |
|
||||
@@ -1030,6 +1094,7 @@ For detailed setup instructions, see the [Google Drive Setup Guide](GoogleDriveS
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|-------------------------|---------------------------------------------------------------|
|
||||
| `FTP_ENABLED` | Set to `false` to disable FTP uploads without removing credentials. Default: `true` |
|
||||
| `FTP_HOST` | FTP server hostname or IP address. |
|
||||
| `FTP_PORT` | FTP port (default: `21`). |
|
||||
| `FTP_USERNAME` | FTP authentication username. |
|
||||
@@ -1042,6 +1107,7 @@ For detailed setup instructions, see the [Google Drive Setup Guide](GoogleDriveS
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|------------------------------|-------------------------------------------------------|
|
||||
| `SFTP_ENABLED` | Set to `false` to disable SFTP uploads without removing credentials. Default: `true` |
|
||||
| `SFTP_HOST` | SFTP server hostname or IP address. |
|
||||
| `SFTP_PORT` | SFTP port (default: `22`). |
|
||||
| `SFTP_USERNAME` | SFTP authentication username. |
|
||||
@@ -1073,6 +1139,7 @@ For detailed setup instructions, see the [Google Drive Setup Guide](GoogleDriveS
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|----------------------------------|---------------------------------------------------------------------|
|
||||
| `DEST_EMAIL_ENABLED` | Set to `false` to disable email delivery without removing credentials. Default: `true` |
|
||||
| `DEST_EMAIL_HOST` | SMTP server hostname for document delivery. |
|
||||
| `DEST_EMAIL_PORT` | SMTP port for document delivery (default: `587`). |
|
||||
| `DEST_EMAIL_USERNAME` | SMTP authentication username for document delivery. |
|
||||
@@ -1085,6 +1152,7 @@ For detailed setup instructions, see the [Google Drive Setup Guide](GoogleDriveS
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|---------------------------------|-------------------------------------------------------|
|
||||
| `ONEDRIVE_ENABLED` | Set to `false` to disable OneDrive uploads without removing credentials. Default: `true` |
|
||||
| `ONEDRIVE_CLIENT_ID` | Azure AD application client ID |
|
||||
| `ONEDRIVE_CLIENT_SECRET` | Azure AD application client secret |
|
||||
| `ONEDRIVE_TENANT_ID` | Azure AD tenant ID: use "common" for personal accounts or your tenant ID for corporate accounts |
|
||||
@@ -1097,6 +1165,7 @@ For detailed setup instructions, see the [OneDrive Setup Guide](OneDriveSetup.md
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|---------------------------------|-------------------------------------------------------|
|
||||
| `S3_ENABLED` | Set to `false` to disable S3 uploads without removing credentials. Default: `true` |
|
||||
| `AWS_ACCESS_KEY_ID` | AWS IAM access key ID |
|
||||
| `AWS_SECRET_ACCESS_KEY` | AWS IAM secret access key |
|
||||
| `AWS_REGION` | AWS region where your S3 bucket is located (default: `us-east-1`) |
|
||||
@@ -1107,6 +1176,23 @@ For detailed setup instructions, see the [OneDrive Setup Guide](OneDriveSetup.md
|
||||
|
||||
For detailed setup instructions, see the [Amazon S3 Setup Guide](AmazonS3Setup.md).
|
||||
|
||||
### iCloud Drive (Apple)
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|---------------------------------|-------------------------------------------------------|
|
||||
| `ICLOUD_ENABLED` | Set to `false` to disable iCloud uploads without removing credentials. Default: `true` |
|
||||
| `ICLOUD_USERNAME` | Apple ID email address |
|
||||
| `ICLOUD_PASSWORD` | App-specific password (generate at [appleid.apple.com](https://appleid.apple.com/account/manage)) |
|
||||
| `ICLOUD_FOLDER` | Target folder path in iCloud Drive (e.g. `Documents/Uploads`) |
|
||||
| `ICLOUD_COOKIE_DIRECTORY` | Optional directory for session cookie persistence (default: `~/.pyicloud`) |
|
||||
|
||||
> **Note:** Apple does not provide a public REST API for iCloud Drive. This
|
||||
> integration uses the [pyicloud](https://github.com/picklepete/pyicloud)
|
||||
> library which relies on an unofficial, reverse-engineered protocol. Because
|
||||
> most Apple IDs have two-factor authentication enabled, you **must** generate
|
||||
> an [app-specific password](https://support.apple.com/en-us/102654) and use
|
||||
> it as `ICLOUD_PASSWORD`.
|
||||
|
||||
### Notification System
|
||||
|
||||
| **Variable** | **Description** |
|
||||
|
||||
@@ -0,0 +1,252 @@
|
||||
# Mobile App
|
||||
|
||||
DocuElevate includes a native mobile application for iOS and Android built with **React Native** and **Expo**. The app allows users to capture documents with the device camera, pick files from the device storage, and receive push notifications when documents finish processing.
|
||||
|
||||
## Features
|
||||
|
||||
| Feature | iOS | Android |
|
||||
|---------|-----|---------|
|
||||
| SSO login (OAuth2) | ✅ | ✅ |
|
||||
| Local / basic auth login | ✅ | ✅ |
|
||||
| Auto-generated API token | ✅ | ✅ |
|
||||
| Camera capture → upload | ✅ | ✅ |
|
||||
| File picker upload | ✅ | ✅ |
|
||||
| Share Sheet / Share Intent | ✅ | ✅ |
|
||||
| Push notifications | ✅ | ✅ |
|
||||
| Document list | ✅ | ✅ |
|
||||
| Dark mode | ✅ | ✅ |
|
||||
|
||||
## Getting Started (Development)
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js 18 or later
|
||||
- [Expo CLI](https://docs.expo.dev/get-started/installation/): `npm install -g @expo/cli`
|
||||
- [Expo Go](https://expo.dev/client) app on your iOS or Android device (for development)
|
||||
- A running DocuElevate server reachable from your device
|
||||
|
||||
### Run in development mode
|
||||
|
||||
```bash
|
||||
cd mobile
|
||||
npm install
|
||||
npx expo start
|
||||
```
|
||||
|
||||
Scan the QR code with **Expo Go** on your device. On iOS you can also use the Camera app.
|
||||
|
||||
## Building for Production
|
||||
|
||||
DocuElevate uses **Expo Application Services (EAS)** to produce App Store / Play Store binaries.
|
||||
|
||||
```bash
|
||||
# Install EAS CLI globally
|
||||
npm install -g eas-cli
|
||||
|
||||
# Authenticate with Expo
|
||||
eas login
|
||||
|
||||
# Build for iOS (requires Apple Developer account)
|
||||
eas build --platform ios
|
||||
|
||||
# Build for Android
|
||||
eas build --platform android
|
||||
```
|
||||
|
||||
See the [EAS Build documentation](https://docs.expo.dev/build/introduction/) for full setup instructions.
|
||||
|
||||
## Authentication
|
||||
|
||||
### SSO Login Flow
|
||||
|
||||
The mobile app uses the server's existing OAuth2/SSO setup:
|
||||
|
||||
1. User enters the DocuElevate server URL on the login screen.
|
||||
2. The app opens `<server>/login?mobile=1&redirect_uri=docuelevate://callback` in the **system browser** (Safari / Chrome).
|
||||
3. The user authenticates via SSO or local credentials.
|
||||
4. The server redirects back to `docuelevate://callback`.
|
||||
5. The app calls `POST /api/mobile/generate-token` to exchange the session for a **long-lived API token**.
|
||||
6. The token is stored securely in the device's keychain (`expo-secure-store`).
|
||||
|
||||
### Auto-generated Mobile Token
|
||||
|
||||
When the mobile app completes login it automatically creates a named API token (`"Mobile App – <device name>"`) via `POST /api/mobile/generate-token`. This token:
|
||||
|
||||
- Works identically to tokens created manually in the web UI.
|
||||
- Is shown in the **API Tokens** page (`/api-tokens`) and can be revoked there.
|
||||
- Is stored in the device's secure keychain, never in plain storage.
|
||||
|
||||
## Push Notifications
|
||||
|
||||
Push notifications are delivered via the **Expo Push Notification** service, which routes through Apple Push Notification service (APNs) for iOS and Firebase Cloud Messaging (FCM) for Android.
|
||||
|
||||
**No server-side APNs/FCM credentials are required** – Expo's servers handle the provider integration.
|
||||
|
||||
### How it works
|
||||
|
||||
1. After login, the app requests notification permission from the operating system.
|
||||
2. If granted, the app obtains an **Expo Push Token** (`ExponentPushToken[…]`).
|
||||
3. The token is registered with the backend via `POST /api/mobile/register-device`.
|
||||
4. When a document finishes processing, the server sends a push notification to all registered devices for that user.
|
||||
|
||||
### Managing registered devices
|
||||
|
||||
Users can see and remove their registered devices from the **Profile** tab in the app, or via the API:
|
||||
|
||||
```bash
|
||||
# List registered devices
|
||||
curl -H "Authorization: Bearer <token>" https://your-server/api/mobile/devices
|
||||
|
||||
# Remove a device
|
||||
curl -X DELETE -H "Authorization: Bearer <token>" https://your-server/api/mobile/devices/<id>
|
||||
```
|
||||
|
||||
## Uploading Documents
|
||||
|
||||
### Camera Capture
|
||||
|
||||
1. Open the **Upload** tab.
|
||||
2. Tap **Camera**.
|
||||
3. Point the camera at the document and take a photo.
|
||||
4. The image is immediately uploaded and queued for processing.
|
||||
|
||||
### File Picker
|
||||
|
||||
1. Open the **Upload** tab.
|
||||
2. Tap **File Picker**.
|
||||
3. Browse to and select one or more files (PDF, DOCX, images, etc.).
|
||||
4. Files are uploaded and queued for processing.
|
||||
|
||||
### Share Sheet (iOS) / Share Intent (Android)
|
||||
|
||||
The app registers itself as a share target so any file can be sent directly to DocuElevate from another app:
|
||||
|
||||
1. Open a file in Files, Mail, Safari, or any other app.
|
||||
2. Tap the **Share** button (iOS) or **Share** (Android).
|
||||
3. Find and tap **DocuElevate** in the share sheet.
|
||||
4. The file is immediately uploaded.
|
||||
|
||||
> **Note:** The app must be installed on the device for it to appear in the share sheet.
|
||||
|
||||
## Mobile API Endpoints
|
||||
|
||||
The backend exposes a dedicated `/api/mobile/` namespace:
|
||||
|
||||
| Method | Endpoint | Auth | Description |
|
||||
|--------|----------|------|-------------|
|
||||
| `POST` | `/api/mobile/generate-token` | Session | Exchange SSO session for API token |
|
||||
| `POST` | `/api/mobile/register-device` | Bearer | Register Expo push token |
|
||||
| `GET` | `/api/mobile/devices` | Bearer | List registered devices |
|
||||
| `DELETE` | `/api/mobile/devices/{id}` | Bearer | Deactivate a device |
|
||||
| `GET` | `/api/mobile/whoami` | Bearer | Get current user profile |
|
||||
|
||||
All other API endpoints (file upload, file listing, etc.) work with Bearer token authentication.
|
||||
|
||||
### POST /api/mobile/generate-token
|
||||
|
||||
Exchanges an active web session (cookie) for a permanent API token suitable for use in the mobile app.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{ "device_name": "John's iPhone" }
|
||||
```
|
||||
|
||||
**Response (201):**
|
||||
```json
|
||||
{
|
||||
"token": "de_AbCdEfGhIjKl...",
|
||||
"token_id": 42,
|
||||
"name": "Mobile App – John's iPhone",
|
||||
"created_at": "2026-03-10T09:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
> ⚠️ The `token` value is returned **once only**. Store it in the device's secure keychain immediately.
|
||||
|
||||
### POST /api/mobile/register-device
|
||||
|
||||
Registers an Expo push token for the authenticated user.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{
|
||||
"push_token": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
|
||||
"device_name": "John's iPhone",
|
||||
"platform": "ios"
|
||||
}
|
||||
```
|
||||
|
||||
Supported platforms: `ios`, `android`, `web`.
|
||||
|
||||
Re-registering the same token is safe (idempotent).
|
||||
|
||||
### GET /api/mobile/whoami
|
||||
|
||||
Returns the current user's profile.
|
||||
|
||||
**Response (200):**
|
||||
```json
|
||||
{
|
||||
"owner_id": "john@example.com",
|
||||
"display_name": "John Doe",
|
||||
"email": "john@example.com",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/...",
|
||||
"is_admin": false
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
No server-side configuration is required to enable the mobile app. The Expo push notification routing does not need FCM or APNs credentials on the server.
|
||||
|
||||
If you wish to use **direct FCM/APNs** without Expo's relay, replace the `send_expo_push_notification` function in `app/utils/push_notification.py` with your own implementation.
|
||||
|
||||
## Project Structure (mobile/)
|
||||
|
||||
```
|
||||
mobile/
|
||||
├── App.tsx # Root component
|
||||
├── app.json # Expo/EAS configuration
|
||||
├── eas.json # EAS Build profiles
|
||||
├── package.json
|
||||
├── tsconfig.json
|
||||
└── src/
|
||||
├── context/
|
||||
│ └── AuthContext.tsx # Auth state + SSO login flow
|
||||
├── hooks/
|
||||
│ └── usePushNotifications.ts # Push token registration
|
||||
├── screens/
|
||||
│ ├── LoginScreen.tsx # Server URL + SSO button
|
||||
│ ├── UploadScreen.tsx # Camera capture + file picker
|
||||
│ ├── FilesScreen.tsx # Processed document list
|
||||
│ └── ProfileScreen.tsx # User profile + sign out
|
||||
└── services/
|
||||
└── api.ts # DocuElevate REST API client
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Authentication was cancelled or failed"
|
||||
|
||||
- Ensure the server URL is correct (including `https://`).
|
||||
- Verify the server is reachable from your device's network.
|
||||
- Confirm that `AUTH_ENABLED=True` on the server.
|
||||
|
||||
### Push notifications not arriving
|
||||
|
||||
1. Check that the app has notification permission (Settings → DocuElevate → Notifications).
|
||||
2. Verify the device is registered: `GET /api/mobile/devices`.
|
||||
3. Ensure the server can reach `https://exp.host` (outbound HTTPS on port 443).
|
||||
4. On Android, add `google-services.json` to the `mobile/` directory if you are building your own binary.
|
||||
|
||||
### "Connection refused" or timeout
|
||||
|
||||
- Verify that the DocuElevate server is running and accessible.
|
||||
- Ensure the server's `EXTERNAL_HOSTNAME` or reverse proxy is configured correctly.
|
||||
- Check that the server accepts CORS requests from `docuelevate://`.
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [API Documentation](./API.md)
|
||||
- [Configuration Guide](./ConfigurationGuide.md)
|
||||
- [Deployment Guide](./DeploymentGuide.md)
|
||||
@@ -0,0 +1,375 @@
|
||||
# Social Login Setup Guide
|
||||
|
||||
This guide explains how to configure social login providers (Google, Microsoft, Apple, Dropbox) for DocuElevate. Social login lets your users sign in with their existing accounts, reducing friction and eliminating the need for separate passwords.
|
||||
|
||||
## Overview
|
||||
|
||||
DocuElevate supports four social login providers:
|
||||
|
||||
| Provider | Protocol | Best For |
|
||||
|----------|----------|----------|
|
||||
| **Google** | OAuth2 / OpenID Connect | Consumers and Google Workspace organizations |
|
||||
| **Microsoft** | OAuth2 / OpenID Connect | Microsoft 365 / Azure AD organizations and personal Microsoft accounts |
|
||||
| **Apple** | OAuth2 / OpenID Connect | iOS/macOS users, privacy-focused users |
|
||||
| **Dropbox** | OAuth2 | Teams already using Dropbox as a storage destination |
|
||||
|
||||
Each provider is **independently enabled** — you can use one, several, or all of them at the same time. Social login works alongside any other DocuElevate authentication method (simple auth, OIDC/Authentik, local signup).
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before configuring any social login provider, ensure:
|
||||
|
||||
1. **Authentication is enabled**: `AUTH_ENABLED=true` in your `.env` file
|
||||
2. **Session secret is set**: `SESSION_SECRET` must be a random string of at least 32 characters
|
||||
3. **HTTPS is configured**: All social login providers require HTTPS redirect URIs in production. Use a reverse proxy (Traefik, Nginx, Caddy) with a valid TLS certificate
|
||||
4. **External hostname is set**: `EXTERNAL_HOSTNAME` must match your public domain (e.g., `docuelevate.example.com`)
|
||||
|
||||
> **Note:** Social login users are regular (non-admin) users by default. To grant admin access, use the Admin Panel (**Settings → User Management**) after the user's first login, or configure admin groups via Authentik/OIDC.
|
||||
|
||||
## Callback URLs
|
||||
|
||||
Each social login provider uses a callback URL to redirect users back to DocuElevate after authentication. The callback URL pattern is:
|
||||
|
||||
```
|
||||
https://<EXTERNAL_HOSTNAME>/social-callback/<provider>
|
||||
```
|
||||
|
||||
For example, if your DocuElevate instance is at `https://docuelevate.example.com`:
|
||||
|
||||
| Provider | Callback URL |
|
||||
|----------|-------------|
|
||||
| Google | `https://docuelevate.example.com/social-callback/google` |
|
||||
| Microsoft | `https://docuelevate.example.com/social-callback/microsoft` |
|
||||
| Apple | `https://docuelevate.example.com/social-callback/apple` |
|
||||
| Dropbox | `https://docuelevate.example.com/social-callback/dropbox` |
|
||||
|
||||
---
|
||||
|
||||
## Google Sign-In
|
||||
|
||||
### 1. Create OAuth Credentials in Google Cloud Console
|
||||
|
||||
1. Go to the [Google Cloud Console](https://console.cloud.google.com/)
|
||||
2. Create a new project (or select an existing one)
|
||||
3. Navigate to **APIs & Services → Credentials**
|
||||
4. Click **Create Credentials → OAuth client ID**
|
||||
5. If prompted, configure the **OAuth consent screen** first:
|
||||
- **User Type**: External (or Internal for Google Workspace)
|
||||
- **App name**: DocuElevate
|
||||
- **User support email**: Your email
|
||||
- **Authorized domains**: Your domain (e.g., `example.com`)
|
||||
- **Scopes**: Add `email`, `profile`, and `openid`
|
||||
6. Back on the Credentials page, create an **OAuth 2.0 Client ID**:
|
||||
- **Application type**: Web application
|
||||
- **Name**: DocuElevate
|
||||
- **Authorized redirect URIs**: `https://docuelevate.example.com/social-callback/google`
|
||||
7. Note the **Client ID** and **Client Secret**
|
||||
|
||||
### 2. Configure DocuElevate
|
||||
|
||||
Add to your `.env` file:
|
||||
|
||||
```bash
|
||||
SOCIAL_AUTH_GOOGLE_ENABLED=true
|
||||
SOCIAL_AUTH_GOOGLE_CLIENT_ID=123456789-abcdefg.apps.googleusercontent.com
|
||||
SOCIAL_AUTH_GOOGLE_CLIENT_SECRET=GOCSPX-your-secret-here
|
||||
```
|
||||
|
||||
### 3. Restart DocuElevate
|
||||
|
||||
```bash
|
||||
docker compose restart api worker
|
||||
```
|
||||
|
||||
### Google-Specific Notes
|
||||
|
||||
- **Google Workspace**: If you want to restrict sign-in to users in your Google Workspace organization, set the OAuth consent screen to "Internal"
|
||||
- **Verification**: Google may require app verification if you're using External user type and requesting sensitive scopes. For small teams (<100 users), you can add test users instead
|
||||
- **Unified Auth**: If you also use Google Drive as a storage destination, users who sign in with Google will already be authenticated with a Google identity — simplifying the Google Drive integration experience
|
||||
|
||||
---
|
||||
|
||||
## Microsoft Sign-In (Azure AD / Microsoft Entra ID)
|
||||
|
||||
### 1. Register an Application in Azure
|
||||
|
||||
1. Go to the [Azure Portal](https://portal.azure.com/)
|
||||
2. Navigate to **Microsoft Entra ID → App registrations**
|
||||
3. Click **New registration**
|
||||
4. Fill in:
|
||||
- **Name**: DocuElevate
|
||||
- **Supported account types**: Choose based on your needs:
|
||||
- *Accounts in this organizational directory only* — single-tenant (your org only)
|
||||
- *Accounts in any organizational directory* — multi-tenant
|
||||
- *Accounts in any organizational directory and personal Microsoft accounts* — broadest reach
|
||||
- **Redirect URI**: Select **Web** and enter `https://docuelevate.example.com/social-callback/microsoft`
|
||||
5. Click **Register**
|
||||
6. Note the **Application (client) ID**
|
||||
7. Navigate to **Certificates & secrets → New client secret**
|
||||
8. Add a description and expiration, then click **Add**
|
||||
9. Note the **Value** (this is your client secret — it's only shown once!)
|
||||
|
||||
### 2. Configure API Permissions
|
||||
|
||||
1. In your app registration, go to **API permissions**
|
||||
2. Ensure these permissions are present (they're usually added by default):
|
||||
- `openid`
|
||||
- `profile`
|
||||
- `email`
|
||||
3. Click **Grant admin consent** if you're a tenant admin
|
||||
|
||||
### 3. Configure DocuElevate
|
||||
|
||||
Add to your `.env` file:
|
||||
|
||||
```bash
|
||||
SOCIAL_AUTH_MICROSOFT_ENABLED=true
|
||||
SOCIAL_AUTH_MICROSOFT_CLIENT_ID=12345678-abcd-efgh-ijkl-123456789012
|
||||
SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET=your~client~secret~value
|
||||
SOCIAL_AUTH_MICROSOFT_TENANT=common
|
||||
```
|
||||
|
||||
**Tenant options:**
|
||||
|
||||
| Value | Who Can Sign In |
|
||||
|-------|----------------|
|
||||
| `common` | Any Microsoft account (personal + any Azure AD organization) |
|
||||
| `organizations` | Any Azure AD organization (work/school accounts only) |
|
||||
| `consumers` | Personal Microsoft accounts only (outlook.com, hotmail.com, etc.) |
|
||||
| `<tenant-id>` | Only users in a specific Azure AD tenant (use the GUID from Azure Portal) |
|
||||
|
||||
### 4. Restart DocuElevate
|
||||
|
||||
```bash
|
||||
docker compose restart api worker
|
||||
```
|
||||
|
||||
### Microsoft-Specific Notes
|
||||
|
||||
- **Client secret expiration**: Azure AD client secrets expire (max 2 years). Set a calendar reminder to rotate them before they expire
|
||||
- **Conditional Access**: If your organization uses Azure AD Conditional Access policies, social login will respect them
|
||||
- **Unified Auth**: If you also use OneDrive as a storage destination, users who sign in with Microsoft will already have a Microsoft identity — potentially simplifying OneDrive integration
|
||||
|
||||
---
|
||||
|
||||
## Apple Sign-In
|
||||
|
||||
Apple Sign-In requires an Apple Developer account ($99/year) and more setup than other providers.
|
||||
|
||||
### 1. Configure in Apple Developer Portal
|
||||
|
||||
1. Go to the [Apple Developer Portal](https://developer.apple.com/account/)
|
||||
2. Navigate to **Certificates, Identifiers & Profiles → Identifiers**
|
||||
3. Click **+** and select **App IDs** → Register an App ID:
|
||||
- **Description**: DocuElevate
|
||||
- **Bundle ID**: e.g., `com.example.docuelevate`
|
||||
- Enable **Sign In with Apple** capability
|
||||
4. Click **+** again and select **Services IDs**:
|
||||
- **Description**: DocuElevate Web
|
||||
- **Identifier**: e.g., `com.example.docuelevate.web` (this is your Client ID)
|
||||
- Enable **Sign In with Apple**
|
||||
- Click **Configure** next to Sign In with Apple:
|
||||
- **Primary App ID**: Select the App ID created above
|
||||
- **Domains**: `docuelevate.example.com`
|
||||
- **Return URLs**: `https://docuelevate.example.com/social-callback/apple`
|
||||
5. Click **Save** and **Continue** → **Register**
|
||||
6. Navigate to **Keys** → Click **+** to create a new key:
|
||||
- **Key Name**: DocuElevate Sign-In
|
||||
- Enable **Sign In with Apple**
|
||||
- Click **Configure** and select the App ID created above
|
||||
- Click **Continue** → **Register**
|
||||
- **Download the private key file** (`.p8`) — you can only download it once!
|
||||
- Note the **Key ID**
|
||||
7. Note your **Team ID** (shown in the top-right corner of the Developer Portal)
|
||||
|
||||
### 2. Configure DocuElevate
|
||||
|
||||
Add to your `.env` file:
|
||||
|
||||
```bash
|
||||
SOCIAL_AUTH_APPLE_ENABLED=true
|
||||
SOCIAL_AUTH_APPLE_CLIENT_ID=com.example.docuelevate.web
|
||||
SOCIAL_AUTH_APPLE_TEAM_ID=ABCDE12345
|
||||
SOCIAL_AUTH_APPLE_KEY_ID=FGHIJ67890
|
||||
SOCIAL_AUTH_APPLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
|
||||
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg...
|
||||
...your key content here...
|
||||
-----END PRIVATE KEY-----"
|
||||
```
|
||||
|
||||
> **Tip:** You can also store the private key as a single line with `\n` for line breaks:
|
||||
> ```bash
|
||||
> SOCIAL_AUTH_APPLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMG...\n-----END PRIVATE KEY-----"
|
||||
> ```
|
||||
|
||||
### 3. Restart DocuElevate
|
||||
|
||||
```bash
|
||||
docker compose restart api worker
|
||||
```
|
||||
|
||||
### Apple-Specific Notes
|
||||
|
||||
- **Email relay**: Apple offers a "Hide My Email" feature that provides a relay email address (e.g., `abc123@privaterelay.appleid.com`). DocuElevate accepts these addresses
|
||||
- **First login only**: Apple sends the user's name only on the very first authorization. If the user revokes and re-authorizes, their name may not be sent again
|
||||
- **Developer account required**: You need an Apple Developer account ($99/year) to use Sign In with Apple
|
||||
- **Key rotation**: Apple private keys don't expire, but if you suspect compromise, revoke the key in the Developer Portal and create a new one
|
||||
|
||||
---
|
||||
|
||||
## Dropbox Sign-In
|
||||
|
||||
### 1. Create a Dropbox App
|
||||
|
||||
1. Go to the [Dropbox App Console](https://www.dropbox.com/developers/apps)
|
||||
2. Click **Create app**
|
||||
3. Choose:
|
||||
- **API**: Scoped access
|
||||
- **Access type**: Full Dropbox (or App folder, depending on your needs)
|
||||
- **Name**: DocuElevate Auth (or reuse your existing Dropbox storage app)
|
||||
4. In the app settings, go to the **OAuth 2** section:
|
||||
- Add **Redirect URI**: `https://docuelevate.example.com/social-callback/dropbox`
|
||||
5. Note the **App key** (this is your Client ID) and **App secret** (this is your Client Secret)
|
||||
|
||||
> **Tip:** If you already have a Dropbox app configured for DocuElevate's storage integration, you can reuse the same app — just add the social login redirect URI. Alternatively, create a separate app for authentication to keep concerns separated.
|
||||
|
||||
### 2. Configure DocuElevate
|
||||
|
||||
Add to your `.env` file:
|
||||
|
||||
```bash
|
||||
SOCIAL_AUTH_DROPBOX_ENABLED=true
|
||||
SOCIAL_AUTH_DROPBOX_CLIENT_ID=your_dropbox_app_key
|
||||
SOCIAL_AUTH_DROPBOX_CLIENT_SECRET=your_dropbox_app_secret
|
||||
```
|
||||
|
||||
### 3. Restart DocuElevate
|
||||
|
||||
```bash
|
||||
docker compose restart api worker
|
||||
```
|
||||
|
||||
### Dropbox-Specific Notes
|
||||
|
||||
- **Unified Auth**: If you also use Dropbox as a storage destination, authenticating via Dropbox establishes the user's Dropbox identity — making it easier to manage Dropbox storage integration
|
||||
- **App review**: Dropbox may require app review for production apps with more than 50 users. See [Dropbox App Review](https://www.dropbox.com/developers/reference/developer-guide#app-review)
|
||||
- **Personal vs. Business**: The same app works for both personal Dropbox and Dropbox Business accounts
|
||||
|
||||
---
|
||||
|
||||
## Unified Authentication and Storage
|
||||
|
||||
One of the key advantages of social login in DocuElevate is the potential for **unified authentication** — using the same identity for both signing in and accessing cloud storage destinations:
|
||||
|
||||
| Social Login Provider | Related Storage Destination | Benefit |
|
||||
|---|---|---|
|
||||
| Google | Google Drive | User already has a Google identity for Drive integration |
|
||||
| Microsoft | OneDrive | User already has a Microsoft identity for OneDrive integration |
|
||||
| Dropbox | Dropbox | User already has a Dropbox identity for Dropbox integration |
|
||||
| Apple | *(none)* | Provides a familiar, privacy-respecting login option |
|
||||
|
||||
When a user signs in with a social provider that matches a configured storage destination, the administrator can leverage the same OAuth credentials or simplify the integration setup. Note that the storage integration credentials are configured separately in the admin settings — social login establishes the user's identity, not their storage permissions.
|
||||
|
||||
## Combining Multiple Auth Methods
|
||||
|
||||
DocuElevate supports running multiple authentication methods simultaneously:
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ Login Page │
|
||||
├──────────────────────────────────────────────────┤
|
||||
│ Username / Password form (always shown) │
|
||||
│ │
|
||||
│ ─── Or continue with ─── │
|
||||
│ │
|
||||
│ [Authentik SSO] (if OIDC configured) │
|
||||
│ [Sign in with Google] (if Google enabled) │
|
||||
│ [Sign in with Microsoft] (if Microsoft enabled) │
|
||||
│ [Sign in with Apple] (if Apple enabled) │
|
||||
│ [Sign in with Dropbox] (if Dropbox enabled) │
|
||||
│ │
|
||||
│ [Create account] (if local signup enabled) │
|
||||
└──────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
All methods create or update the same `UserProfile` record, so a user is consistently identified regardless of how they sign in.
|
||||
|
||||
## Admin Management
|
||||
|
||||
Social login users appear in the **Admin → User Management** panel like any other user. Admins can:
|
||||
|
||||
- View which provider a user authenticated with
|
||||
- Block or unblock social login users
|
||||
- Set upload limits and subscription tiers
|
||||
- Grant admin privileges (social login users are never automatically admin)
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **HTTPS is required**: All social login providers require HTTPS callback URLs in production
|
||||
2. **Credentials are sensitive**: Store client secrets securely — use environment variables, never commit them to source control
|
||||
3. **Least privilege**: Only request the scopes you need (DocuElevate requests `openid`, `profile`, and `email`)
|
||||
4. **Rotate secrets**: Set calendar reminders to rotate OAuth client secrets before they expire (especially Microsoft, which has a max 2-year expiration)
|
||||
5. **Monitor logins**: Check the DocuElevate audit log for unusual login patterns
|
||||
6. **Social login users are not admins**: Admin access must be explicitly granted by an existing admin
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **"Unknown social provider" error**
|
||||
- The provider is not enabled or credentials are missing
|
||||
- Check that `SOCIAL_AUTH_<PROVIDER>_ENABLED=true` is set
|
||||
- Verify client ID and secret are configured
|
||||
|
||||
2. **"Could not retrieve email from provider" error**
|
||||
- The provider didn't return an email address
|
||||
- For Google: Ensure `email` scope is included (it is by default)
|
||||
- For Apple: User may have chosen "Hide My Email" — this is expected and should still work
|
||||
- For Dropbox: Ensure the app has permission to read the user's email
|
||||
|
||||
3. **Redirect URI mismatch**
|
||||
- The callback URL registered with the provider must exactly match what DocuElevate generates
|
||||
- Check your `EXTERNAL_HOSTNAME` setting
|
||||
- Ensure you're using HTTPS in production
|
||||
- The callback URL format is: `https://<EXTERNAL_HOSTNAME>/social-callback/<provider>`
|
||||
|
||||
4. **"Social login failed" error**
|
||||
- Check DocuElevate logs (`docker compose logs api`) for detailed error messages
|
||||
- Verify the provider's OAuth app is not suspended or in development mode
|
||||
- For Google: Check if the OAuth consent screen needs verification
|
||||
- For Microsoft: Ensure admin consent was granted for the required permissions
|
||||
|
||||
5. **User can't log in after changing provider settings**
|
||||
- After changing social login configuration, restart DocuElevate: `docker compose restart api worker`
|
||||
- Social login settings require a restart to take effect (`restart_required: true`)
|
||||
|
||||
### Debug Checklist
|
||||
|
||||
- [ ] `AUTH_ENABLED=true` is set
|
||||
- [ ] `SESSION_SECRET` is at least 32 characters
|
||||
- [ ] `EXTERNAL_HOSTNAME` matches your public domain
|
||||
- [ ] Provider-specific `_ENABLED=true` is set
|
||||
- [ ] Client ID and secret are correctly configured (no extra spaces)
|
||||
- [ ] Callback URL is registered with the provider
|
||||
- [ ] HTTPS is working on your domain
|
||||
- [ ] DocuElevate has been restarted after configuration changes
|
||||
|
||||
## Environment Variable Reference
|
||||
|
||||
| Variable | Required | Description |
|
||||
|---|---|---|
|
||||
| `SOCIAL_AUTH_GOOGLE_ENABLED` | No | Enable Google Sign-In (`true`/`false`). Default: `false` |
|
||||
| `SOCIAL_AUTH_GOOGLE_CLIENT_ID` | When Google enabled | Google OAuth2 client ID |
|
||||
| `SOCIAL_AUTH_GOOGLE_CLIENT_SECRET` | When Google enabled | Google OAuth2 client secret |
|
||||
| `SOCIAL_AUTH_MICROSOFT_ENABLED` | No | Enable Microsoft Sign-In (`true`/`false`). Default: `false` |
|
||||
| `SOCIAL_AUTH_MICROSOFT_CLIENT_ID` | When Microsoft enabled | Azure AD application (client) ID |
|
||||
| `SOCIAL_AUTH_MICROSOFT_CLIENT_SECRET` | When Microsoft enabled | Azure AD client secret |
|
||||
| `SOCIAL_AUTH_MICROSOFT_TENANT` | No | Azure AD tenant. Default: `common` |
|
||||
| `SOCIAL_AUTH_APPLE_ENABLED` | No | Enable Apple Sign-In (`true`/`false`). Default: `false` |
|
||||
| `SOCIAL_AUTH_APPLE_CLIENT_ID` | When Apple enabled | Apple Services ID |
|
||||
| `SOCIAL_AUTH_APPLE_TEAM_ID` | When Apple enabled | Apple Developer Team ID |
|
||||
| `SOCIAL_AUTH_APPLE_KEY_ID` | When Apple enabled | Apple Sign-In key ID |
|
||||
| `SOCIAL_AUTH_APPLE_PRIVATE_KEY` | When Apple enabled | Apple Sign-In private key (PEM) |
|
||||
| `SOCIAL_AUTH_DROPBOX_ENABLED` | No | Enable Dropbox Sign-In (`true`/`false`). Default: `false` |
|
||||
| `SOCIAL_AUTH_DROPBOX_CLIENT_ID` | When Dropbox enabled | Dropbox App Key |
|
||||
| `SOCIAL_AUTH_DROPBOX_CLIENT_SECRET` | When Dropbox enabled | Dropbox App Secret |
|
||||
@@ -348,6 +348,7 @@ in task messages or logs.
|
||||
| `PAPERLESS` | Paperless-ngx REST API, API token |
|
||||
| `EMAIL` | SMTP/STARTTLS, file as attachment |
|
||||
| `RCLONE` | `rclone copyto` subprocess, per-user rclone config |
|
||||
| `ICLOUD` | pyicloud library, Apple ID + app-specific password |
|
||||
|
||||
### Multiple Destinations
|
||||
|
||||
|
||||
@@ -63,6 +63,54 @@ DocuElevate will process the following attachment types from emails:
|
||||
| TIFF | `.tif`, `.tiff` | Common format from older scanners/fax |
|
||||
| Multi-page TIFF | `.tif` | Full multi-page support |
|
||||
|
||||
### Controlling Which Attachment Types Are Ingested
|
||||
|
||||
By default, DocuElevate only ingests **document** attachments (PDFs, Word, Excel, PowerPoint, OpenDocument, RTF, TXT, CSV, HTML, Markdown). Images are **not** ingested by default — this prevents cluttering your document archive with inline images or unrelated photo attachments.
|
||||
|
||||
#### Global Default (Admin Setting)
|
||||
|
||||
Set the `IMAP_ATTACHMENT_FILTER` environment variable to control the system-wide fallback when no ingestion profile is assigned to a mailbox:
|
||||
|
||||
| Value | Behaviour |
|
||||
|-------|-----------|
|
||||
| `documents_only` | **(Default)** Only PDFs and office/document files. Images are skipped. |
|
||||
| `all` | All supported file types, including images. |
|
||||
|
||||
```env
|
||||
IMAP_ATTACHMENT_FILTER=documents_only
|
||||
```
|
||||
|
||||
#### Ingestion Profiles (Fine-Grained Per-Mailbox Control)
|
||||
|
||||
For precise control, you can create **Ingestion Profiles** that let you pick exactly which file-type categories to accept from each mailbox. This is more powerful than the binary global toggle and works independently per mailbox.
|
||||
|
||||
**Available categories:**
|
||||
|
||||
| Category | File types included |
|
||||
|----------|---------------------|
|
||||
| PDF | `.pdf` |
|
||||
| Microsoft Office | `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt`, `.pptx`, and macro-enabled variants |
|
||||
| OpenDocument | `.odt`, `.ods`, `.odp`, `.odg`, `.odf` (LibreOffice / OpenOffice) |
|
||||
| Text & Data | `.txt`, `.csv`, `.rtf` |
|
||||
| Web & Markup | `.html`, `.htm`, `.md`, `.markdown` |
|
||||
| Images | `.jpg`, `.png`, `.gif`, `.bmp`, `.tiff`, `.webp`, `.svg` |
|
||||
|
||||
**Managing profiles:**
|
||||
|
||||
1. Go to **Email Ingestion** (`/imap-accounts`)
|
||||
2. Click **Manage profiles** (or the **+** icon next to the profile dropdown)
|
||||
3. Create a new profile, give it a name, and tick the categories you want
|
||||
4. When adding or editing a mailbox, select your profile from the dropdown
|
||||
|
||||
Two built-in profiles are always available and cannot be deleted:
|
||||
|
||||
- **Documents Only** — PDF, Office, OpenDocument, Text, Web (no images)
|
||||
- **All Files** — all categories including images
|
||||
|
||||
Users can also create unlimited **custom profiles** to mix and match exactly the categories they need per mailbox (e.g. a scanner mailbox that only accepts PDFs, or a finance mailbox that accepts Office and CSV but not images).
|
||||
|
||||
Custom profiles are created via the UI or the `/api/imap-profiles/` API.
|
||||
|
||||
---
|
||||
|
||||
## Setting Up Your Scanner/Device
|
||||
|
||||
@@ -168,15 +168,15 @@
|
||||
<a href="/admin/scheduled-jobs" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-clock w-4 mr-2 text-indigo-500" aria-hidden="true"></i> {{ _("nav.scheduled_jobs") }}
|
||||
</a>
|
||||
<a href="/admin/compliance" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-check-double w-4 mr-2 text-green-500" aria-hidden="true"></i> Compliance
|
||||
</a>
|
||||
<a href="/admin/backup" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-database w-4 mr-2 text-green-600" aria-hidden="true"></i> {{ _("nav.backup_restore") }}
|
||||
</a>
|
||||
<a href="/admin/audit-logs" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-shield-halved w-4 mr-2 text-indigo-500" aria-hidden="true"></i> Audit Logs
|
||||
</a>
|
||||
<a href="/admin/audit-logs" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-shield-halved w-4 mr-2 text-indigo-500" aria-hidden="true"></i> Audit Logs
|
||||
</a>
|
||||
<a href="/status" role="menuitem" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
|
||||
{% if request and request.url.path == '/status' %}aria-current="page"{% endif %}>
|
||||
<i class="fas fa-circle-dot w-4 mr-2 text-gray-500" aria-hidden="true"></i> {{ _("nav.status") }}
|
||||
@@ -389,6 +389,9 @@
|
||||
<a href="/admin/scheduled-jobs" class="block px-3 py-3 rounded-md text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-50">
|
||||
<i class="fas fa-clock mr-2 text-indigo-500" aria-hidden="true"></i> {{ _("nav.scheduled_jobs") }}
|
||||
</a>
|
||||
<a href="/admin/compliance" class="block px-3 py-3 rounded-md text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-50">
|
||||
<i class="fas fa-check-double mr-2 text-green-500" aria-hidden="true"></i> Compliance
|
||||
</a>
|
||||
<a href="/admin/backup" class="block px-3 py-3 rounded-md text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-50">
|
||||
<i class="fas fa-database mr-2 text-green-500" aria-hidden="true"></i> {{ _("nav.backup_restore") }}
|
||||
</a>
|
||||
|
||||
@@ -0,0 +1,302 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Compliance Templates - DocuElevate{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mx-auto px-4 py-6" x-data="complianceApp()">
|
||||
<!-- Header -->
|
||||
<div class="mb-6">
|
||||
<div class="flex flex-col sm:flex-row justify-between items-start gap-4 mb-4">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold mb-1">Compliance Templates</h1>
|
||||
<p class="text-gray-500 text-sm">
|
||||
Pre-built compliance configurations for GDPR, HIPAA, and SOC 2.
|
||||
Apply templates with one click to align your instance with regulatory requirements.
|
||||
</p>
|
||||
</div>
|
||||
<button @click="refreshAll()"
|
||||
class="inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
|
||||
:disabled="loading"
|
||||
aria-label="Refresh compliance status">
|
||||
<i class="fas fa-sync-alt mr-2" :class="loading ? 'animate-spin' : ''" aria-hidden="true"></i> Refresh
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Overall Status Banner -->
|
||||
<div class="mb-6 rounded-lg p-5 shadow"
|
||||
:class="{
|
||||
'bg-green-50 border border-green-200': summary.overall_status === 'compliant',
|
||||
'bg-yellow-50 border border-yellow-200': summary.overall_status === 'partial',
|
||||
'bg-red-50 border border-red-200': summary.overall_status === 'non_compliant' || summary.overall_status === 'unknown'
|
||||
}">
|
||||
<div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4">
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="inline-flex items-center justify-center h-12 w-12 rounded-full text-xl"
|
||||
:class="{
|
||||
'bg-green-100 text-green-600': summary.overall_status === 'compliant',
|
||||
'bg-yellow-100 text-yellow-600': summary.overall_status === 'partial',
|
||||
'bg-red-100 text-red-600': summary.overall_status === 'non_compliant' || summary.overall_status === 'unknown'
|
||||
}">
|
||||
<i :class="{
|
||||
'fas fa-check-circle': summary.overall_status === 'compliant',
|
||||
'fas fa-exclamation-triangle': summary.overall_status === 'partial',
|
||||
'fas fa-times-circle': summary.overall_status === 'non_compliant' || summary.overall_status === 'unknown'
|
||||
}" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold"
|
||||
:class="{
|
||||
'text-green-800': summary.overall_status === 'compliant',
|
||||
'text-yellow-800': summary.overall_status === 'partial',
|
||||
'text-red-800': summary.overall_status === 'non_compliant' || summary.overall_status === 'unknown'
|
||||
}">
|
||||
<span x-text="summary.overall_status === 'compliant' ? 'All Checks Passing' :
|
||||
summary.overall_status === 'partial' ? 'Partially Compliant' :
|
||||
'Non-Compliant'"></span>
|
||||
</h2>
|
||||
<p class="text-sm text-gray-600">
|
||||
<span x-text="summary.total_passed"></span> of <span x-text="summary.total_checks"></span> checks passing across all templates
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-4 text-center">
|
||||
<div>
|
||||
<div class="text-2xl font-bold text-green-700" x-text="summary.total_passed"></div>
|
||||
<div class="text-xs text-gray-500">Passed</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-2xl font-bold text-red-700" x-text="summary.total_failed"></div>
|
||||
<div class="text-xs text-gray-500">Failed</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-2xl font-bold text-gray-700" x-text="summary.total_checks"></div>
|
||||
<div class="text-xs text-gray-500">Total</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Alert Messages -->
|
||||
<div x-show="alertMessage" x-cloak
|
||||
class="mb-4 rounded-lg p-4 flex items-center gap-3"
|
||||
:class="alertType === 'success' ? 'bg-green-50 border border-green-200 text-green-800' :
|
||||
'bg-red-50 border border-red-200 text-red-800'"
|
||||
role="alert">
|
||||
<i :class="alertType === 'success' ? 'fas fa-check-circle text-green-500' : 'fas fa-exclamation-circle text-red-500'" aria-hidden="true"></i>
|
||||
<span x-text="alertMessage"></span>
|
||||
<button @click="alertMessage = ''" class="ml-auto text-gray-400 hover:text-gray-600" aria-label="Dismiss alert">
|
||||
<i class="fas fa-times" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Template Cards -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
|
||||
<template x-for="tmpl in templates" :key="tmpl.name">
|
||||
<div class="bg-white rounded-lg shadow-md overflow-hidden">
|
||||
<!-- Card Header -->
|
||||
<div class="p-5 border-b"
|
||||
:class="{
|
||||
'border-green-200 bg-green-50': tmpl._status === 'compliant',
|
||||
'border-yellow-200 bg-yellow-50': tmpl._status === 'partial',
|
||||
'border-gray-200': tmpl._status === 'not_applied' || tmpl._status === 'non_compliant'
|
||||
}">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h3 class="text-lg font-bold text-gray-800" x-text="tmpl.display_name"></h3>
|
||||
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-semibold"
|
||||
:class="{
|
||||
'bg-green-100 text-green-800': tmpl._status === 'compliant',
|
||||
'bg-yellow-100 text-yellow-800': tmpl._status === 'partial',
|
||||
'bg-red-100 text-red-800': tmpl._status === 'non_compliant',
|
||||
'bg-gray-100 text-gray-600': tmpl._status === 'not_applied'
|
||||
}">
|
||||
<span x-text="tmpl._status === 'compliant' ? 'Compliant' :
|
||||
tmpl._status === 'partial' ? 'Partial' :
|
||||
tmpl._status === 'non_compliant' ? 'Non-Compliant' :
|
||||
'Not Applied'"></span>
|
||||
</span>
|
||||
</div>
|
||||
<p class="text-sm text-gray-600" x-text="tmpl.description"></p>
|
||||
</div>
|
||||
|
||||
<!-- Check Results (when expanded) -->
|
||||
<div class="p-5" x-show="tmpl._expanded" x-collapse>
|
||||
<h4 class="text-sm font-semibold text-gray-700 mb-3">
|
||||
<i class="fas fa-clipboard-check mr-1" aria-hidden="true"></i>
|
||||
Compliance Checks (<span x-text="tmpl._statusData ? tmpl._statusData.passed : '?'"></span>/<span x-text="tmpl._statusData ? tmpl._statusData.total : '?'"></span>)
|
||||
</h4>
|
||||
<ul class="space-y-2">
|
||||
<template x-for="check in (tmpl._statusData ? tmpl._statusData.check_results : [])" :key="check.key">
|
||||
<li class="flex items-start gap-2 text-sm">
|
||||
<span class="mt-0.5 flex-shrink-0">
|
||||
<i :class="check.passing ? 'fas fa-check-circle text-green-500' : 'fas fa-times-circle text-red-500'" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<span class="font-medium" x-text="check.label"></span>
|
||||
<p class="text-xs text-gray-500" x-text="check.description"></p>
|
||||
<p class="text-xs mt-0.5" x-show="!check.passing">
|
||||
<span class="text-red-600">Current: <code x-text="check.actual"></code></span>
|
||||
<span class="text-gray-400 mx-1">→</span>
|
||||
<span class="text-green-600">Expected: <code x-text="check.expected"></code></span>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
</template>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Card Footer -->
|
||||
<div class="px-5 py-4 bg-gray-50 border-t flex items-center justify-between gap-2">
|
||||
<button @click="toggleExpand(tmpl)"
|
||||
class="inline-flex items-center px-3 py-1.5 text-sm text-gray-600 hover:text-gray-800 hover:bg-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
:aria-expanded="tmpl._expanded"
|
||||
:aria-label="'Toggle details for ' + tmpl.display_name">
|
||||
<i class="fas mr-1" :class="tmpl._expanded ? 'fa-chevron-up' : 'fa-chevron-down'" aria-hidden="true"></i>
|
||||
<span x-text="tmpl._expanded ? 'Hide Details' : 'Show Details'"></span>
|
||||
</button>
|
||||
<button @click="applyTemplate(tmpl.name)"
|
||||
:disabled="tmpl._applying"
|
||||
:aria-busy="tmpl._applying"
|
||||
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-md text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 min-h-[44px] min-w-[44px]"
|
||||
:class="tmpl._applying ? 'bg-gray-400 cursor-not-allowed' : 'bg-blue-600 hover:bg-blue-700'"
|
||||
:aria-label="'Apply ' + tmpl.display_name + ' template'"
|
||||
aria-live="polite">>
|
||||
<i class="fas mr-1.5" :class="tmpl._applying ? 'fa-spinner animate-spin' : 'fa-bolt'" aria-hidden="true"></i>
|
||||
<span x-text="tmpl._applying ? 'Applying…' : 'Apply Template'"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Applied info -->
|
||||
<div x-show="tmpl.applied_at" class="px-5 py-2 bg-gray-50 border-t text-xs text-gray-500">
|
||||
<i class="fas fa-clock mr-1" aria-hidden="true"></i>
|
||||
Last applied: <span x-text="tmpl.applied_at ? new Date(tmpl.applied_at).toLocaleString() : 'Never'"></span>
|
||||
<span x-show="tmpl.applied_by"> by <span x-text="tmpl.applied_by"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Empty State -->
|
||||
<div x-show="!loading && templates.length === 0" class="text-center py-12 text-gray-500">
|
||||
<i class="fas fa-shield-alt text-4xl mb-4" aria-hidden="true"></i>
|
||||
<p class="text-lg font-medium">No compliance templates available</p>
|
||||
<p class="text-sm">Templates will appear here after seeding.</p>
|
||||
</div>
|
||||
|
||||
<!-- Loading Spinner -->
|
||||
<div x-show="loading && templates.length === 0" class="text-center py-12">
|
||||
<i class="fas fa-spinner animate-spin text-3xl text-blue-500" aria-hidden="true"></i>
|
||||
<p class="text-gray-500 mt-2">Loading compliance templates…</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function complianceApp() {
|
||||
return {
|
||||
templates: [],
|
||||
summary: { overall_status: 'unknown', total_checks: 0, total_passed: 0, total_failed: 0 },
|
||||
loading: true,
|
||||
alertMessage: '',
|
||||
alertType: 'success',
|
||||
|
||||
async init() {
|
||||
await this.refreshAll();
|
||||
},
|
||||
|
||||
async refreshAll() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const [templatesRes, summaryRes] = await Promise.all([
|
||||
fetch('/api/compliance/templates'),
|
||||
fetch('/api/compliance/summary')
|
||||
]);
|
||||
|
||||
if (templatesRes.ok) {
|
||||
const data = await templatesRes.json();
|
||||
this.templates = data.map(t => ({
|
||||
...t,
|
||||
_expanded: false,
|
||||
_applying: false,
|
||||
_status: t.status || 'not_applied',
|
||||
_statusData: null
|
||||
}));
|
||||
|
||||
// Fetch status for each template
|
||||
for (const tmpl of this.templates) {
|
||||
this.fetchTemplateStatus(tmpl);
|
||||
}
|
||||
}
|
||||
|
||||
if (summaryRes.ok) {
|
||||
this.summary = await summaryRes.json();
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to load compliance data:', err);
|
||||
this.showAlert('error', 'Failed to load compliance data. Please try again.');
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
|
||||
async fetchTemplateStatus(tmpl) {
|
||||
try {
|
||||
const res = await fetch(`/api/compliance/templates/${tmpl.name}/status`);
|
||||
if (res.ok) {
|
||||
tmpl._statusData = await res.json();
|
||||
tmpl._status = tmpl._statusData.status;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Failed to fetch status for ${tmpl.name}:`, err);
|
||||
}
|
||||
},
|
||||
|
||||
async toggleExpand(tmpl) {
|
||||
tmpl._expanded = !tmpl._expanded;
|
||||
if (tmpl._expanded && !tmpl._statusData) {
|
||||
await this.fetchTemplateStatus(tmpl);
|
||||
}
|
||||
},
|
||||
|
||||
async applyTemplate(name) {
|
||||
const tmpl = this.templates.find(t => t.name === name);
|
||||
if (!tmpl) return;
|
||||
|
||||
if (!confirm(`Apply the ${tmpl.display_name} compliance template?\n\nThis will update your application settings to meet ${name.toUpperCase()} requirements.`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
tmpl._applying = true;
|
||||
this.alertMessage = '';
|
||||
|
||||
try {
|
||||
const res = await fetch(`/api/compliance/templates/${name}/apply`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
if (res.ok && data.success) {
|
||||
this.showAlert('success', `${tmpl.display_name} template applied successfully.`);
|
||||
await this.refreshAll();
|
||||
} else {
|
||||
this.showAlert('error', data.detail || data.error || 'Failed to apply template.');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Failed to apply ${name}:`, err);
|
||||
this.showAlert('error', 'Network error. Please try again.');
|
||||
} finally {
|
||||
tmpl._applying = false;
|
||||
}
|
||||
},
|
||||
|
||||
showAlert(type, message) {
|
||||
this.alertType = type;
|
||||
this.alertMessage = message;
|
||||
if (type === 'success') {
|
||||
setTimeout(() => { this.alertMessage = ''; }, 5000);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -524,6 +524,7 @@
|
||||
<option value="webdav" {% if storage_provider == "webdav" %}selected{% endif %}>WebDAV</option>
|
||||
<option value="ftp" {% if storage_provider == "ftp" %}selected{% endif %}>FTP</option>
|
||||
<option value="sftp" {% if storage_provider == "sftp" %}selected{% endif %}>SFTP</option>
|
||||
<option value="icloud" {% if storage_provider == "icloud" %}selected{% endif %}>iCloud Drive</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -172,6 +172,11 @@
|
||||
<i class="fas fa-trash-alt mr-1" aria-hidden="true"></i>Delete after process
|
||||
</span>
|
||||
</template>
|
||||
<template x-if="acct.profile_id">
|
||||
<span class="inline-flex items-center px-2 py-0.5 rounded bg-blue-50 text-blue-700">
|
||||
<i class="fas fa-filter mr-1" aria-hidden="true"></i><span x-text="profileName(acct.profile_id)"></span>
|
||||
</span>
|
||||
</template>
|
||||
<template x-if="acct.last_checked_at">
|
||||
<span class="text-gray-400" :title="acct.last_checked_at">
|
||||
<i class="fas fa-clock mr-1" aria-hidden="true"></i>Last polled: <span x-text="formatDate(acct.last_checked_at)"></span>
|
||||
@@ -386,6 +391,49 @@
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Attachment filter -->
|
||||
<div>
|
||||
<label for="acct-profile" class="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
||||
Ingestion Profile
|
||||
</label>
|
||||
<div class="flex gap-2 items-center">
|
||||
<select
|
||||
id="acct-profile"
|
||||
x-model.number="form.profile_id"
|
||||
class="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white text-sm"
|
||||
aria-describedby="acct-profile-hint"
|
||||
>
|
||||
<option :value="null">Use global default</option>
|
||||
<template x-for="profile in profiles" :key="profile.id">
|
||||
<option :value="profile.id" x-text="profile.name + (profile.is_builtin ? '' : ' (custom)')"></option>
|
||||
</template>
|
||||
</select>
|
||||
<button
|
||||
type="button"
|
||||
@click="openProfileModal(null)"
|
||||
class="inline-flex items-center px-3 py-2 text-sm font-medium rounded border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
style="min-height:40px;"
|
||||
title="Create new profile"
|
||||
aria-label="Create new ingestion profile"
|
||||
>
|
||||
<i class="fas fa-plus" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<p id="acct-profile-hint" class="mt-1 text-xs text-gray-400 dark:text-gray-500">
|
||||
Controls which attachment types are ingested. Leave blank to use the global default (documents only).
|
||||
<button type="button" @click="showProfilesSection = !showProfilesSection" class="underline hover:text-blue-600 focus:outline-none">
|
||||
Manage profiles
|
||||
</button>
|
||||
</p>
|
||||
<!-- Inline selected profile summary -->
|
||||
<template x-if="form.profile_id">
|
||||
<div class="mt-2 text-xs bg-blue-50 dark:bg-blue-900/20 rounded px-2 py-1.5 text-blue-800 dark:text-blue-200">
|
||||
<strong x-text="profileName(form.profile_id)"></strong>:
|
||||
<span x-text="profileCategorySummary(form.profile_id)"></span>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Test connection result -->
|
||||
<template x-if="testResult">
|
||||
<div
|
||||
@@ -494,10 +542,277 @@
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ── Ingestion Profiles panel ─────────────────────────────────────────────── -->
|
||||
<div
|
||||
x-show="showProfilesSection"
|
||||
x-transition
|
||||
class="fixed inset-0 z-50 flex items-center justify-center bg-black/50 px-4"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="profiles-panel-title"
|
||||
@keydown.escape.window="showProfilesSection = false"
|
||||
style="display:none;"
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-2xl overflow-y-auto max-h-[90vh]" @click.stop>
|
||||
<div class="px-6 pt-6 pb-2 flex items-center justify-between">
|
||||
<h2 id="profiles-panel-title" class="text-lg font-semibold text-gray-900 dark:text-white flex items-center gap-2">
|
||||
<i class="fas fa-filter text-blue-500" aria-hidden="true"></i>
|
||||
Ingestion Profiles
|
||||
</h2>
|
||||
<button
|
||||
type="button"
|
||||
@click="showProfilesSection = false"
|
||||
class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500 rounded"
|
||||
aria-label="Close profiles panel"
|
||||
>
|
||||
<i class="fas fa-times text-xl" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="px-6 pb-6 pt-2">
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
|
||||
Profiles define which attachment types are ingested from emails. Assign a profile to each IMAP account for fine-grained control.
|
||||
</p>
|
||||
|
||||
<!-- Profile list -->
|
||||
<div class="space-y-3 mb-4">
|
||||
<template x-for="profile in profiles" :key="profile.id">
|
||||
<div class="border border-gray-100 dark:border-gray-700 rounded-lg p-4 flex items-start gap-3">
|
||||
<div class="flex-1 min-w-0">
|
||||
<div class="flex items-center gap-2 flex-wrap">
|
||||
<span class="font-medium text-sm text-gray-900 dark:text-white" x-text="profile.name"></span>
|
||||
<template x-if="profile.is_builtin">
|
||||
<span class="text-xs px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-700 text-gray-500">built-in</span>
|
||||
</template>
|
||||
</div>
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5" x-text="profile.description || ''"></p>
|
||||
<!-- Category badges -->
|
||||
<div class="flex flex-wrap gap-1 mt-2">
|
||||
<template x-for="cat in profile.allowed_categories" :key="cat">
|
||||
<span class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300">
|
||||
<span x-text="categoryLabel(cat)"></span>
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-1 shrink-0">
|
||||
<button
|
||||
type="button"
|
||||
@click="openProfileModal(profile)"
|
||||
:disabled="profile.is_builtin"
|
||||
:class="profile.is_builtin ? 'opacity-40 cursor-not-allowed' : ''"
|
||||
class="p-1.5 text-gray-400 hover:text-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 rounded"
|
||||
:aria-label="`Edit profile ${profile.name}`"
|
||||
:title="profile.is_builtin ? 'Built-in profiles cannot be edited' : 'Edit profile'"
|
||||
>
|
||||
<i class="fas fa-edit text-sm" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
@click="confirmDeleteProfile(profile)"
|
||||
:disabled="profile.is_builtin"
|
||||
:class="profile.is_builtin ? 'opacity-40 cursor-not-allowed' : ''"
|
||||
class="p-1.5 text-gray-400 hover:text-red-600 focus:outline-none focus:ring-2 focus:ring-red-500 rounded"
|
||||
:aria-label="`Delete profile ${profile.name}`"
|
||||
:title="profile.is_builtin ? 'Built-in profiles cannot be deleted' : 'Delete profile'"
|
||||
>
|
||||
<i class="fas fa-trash-alt text-sm" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
@click="openProfileModal(null)"
|
||||
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded bg-blue-600 hover:bg-blue-700 text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
|
||||
style="min-height:40px;"
|
||||
>
|
||||
<i class="fas fa-plus mr-2" aria-hidden="true"></i> New Profile
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Profile create / edit modal ────────────────────────────────────────────── -->
|
||||
<div
|
||||
x-show="profileModalOpen"
|
||||
x-transition:enter="ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0"
|
||||
x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0"
|
||||
class="fixed inset-0 z-[60] flex items-center justify-center bg-black/50 px-4"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
:aria-labelledby="editingProfile ? 'profile-modal-title-edit' : 'profile-modal-title-create'"
|
||||
@keydown.escape.window="closeProfileModal()"
|
||||
style="display:none;"
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-lg overflow-y-auto max-h-[90vh]" @click.stop>
|
||||
<div class="px-6 pt-6 pb-2 flex items-center justify-between">
|
||||
<h2
|
||||
:id="editingProfile ? 'profile-modal-title-edit' : 'profile-modal-title-create'"
|
||||
class="text-lg font-semibold text-gray-900 dark:text-white"
|
||||
x-text="editingProfile ? 'Edit Profile' : 'New Ingestion Profile'"
|
||||
></h2>
|
||||
<button
|
||||
type="button"
|
||||
@click="closeProfileModal()"
|
||||
class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500 rounded"
|
||||
aria-label="Close modal"
|
||||
>
|
||||
<i class="fas fa-times text-xl" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<form @submit.prevent="saveProfile()" class="px-6 pb-6 pt-4 space-y-4">
|
||||
|
||||
<!-- Profile name -->
|
||||
<div>
|
||||
<label for="profile-name" class="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
||||
Profile Name <span class="text-red-500" aria-hidden="true">*</span>
|
||||
</label>
|
||||
<input
|
||||
id="profile-name"
|
||||
type="text"
|
||||
x-model="profileForm.name"
|
||||
placeholder="e.g. Scanner Inbox, Finance Documents"
|
||||
required
|
||||
maxlength="255"
|
||||
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white text-sm"
|
||||
aria-required="true"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Description -->
|
||||
<div>
|
||||
<label for="profile-description" class="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
||||
Description
|
||||
</label>
|
||||
<input
|
||||
id="profile-description"
|
||||
type="text"
|
||||
x-model="profileForm.description"
|
||||
placeholder="Optional description"
|
||||
maxlength="500"
|
||||
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Category checkboxes -->
|
||||
<div>
|
||||
<fieldset>
|
||||
<legend class="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-2">
|
||||
File Type Categories <span class="text-red-500" aria-hidden="true">*</span>
|
||||
</legend>
|
||||
<div class="space-y-2">
|
||||
<template x-for="cat in categories" :key="cat.key">
|
||||
<label class="flex items-start gap-3 cursor-pointer group">
|
||||
<input
|
||||
type="checkbox"
|
||||
:value="cat.key"
|
||||
:checked="profileForm.allowed_categories.includes(cat.key)"
|
||||
@change="toggleCategory(cat.key)"
|
||||
class="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"
|
||||
/>
|
||||
<span class="flex-1">
|
||||
<span class="text-sm font-medium text-gray-800 dark:text-gray-100" x-text="cat.label"></span>
|
||||
<span class="block text-xs text-gray-500 dark:text-gray-400" x-text="cat.description"></span>
|
||||
</span>
|
||||
</label>
|
||||
</template>
|
||||
</div>
|
||||
<p x-show="profileForm.allowed_categories.length === 0" class="mt-2 text-xs text-red-600" role="alert">
|
||||
Select at least one category.
|
||||
</p>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- Form error -->
|
||||
<template x-if="profileFormError">
|
||||
<p class="text-sm text-red-600" role="alert" x-text="profileFormError"></p>
|
||||
</template>
|
||||
|
||||
<!-- Actions -->
|
||||
<div class="flex justify-end gap-2 pt-2 border-t border-gray-100 dark:border-gray-700">
|
||||
<button
|
||||
type="button"
|
||||
@click="closeProfileModal()"
|
||||
class="px-4 py-2 text-sm font-medium rounded border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
style="min-height:40px;"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
:disabled="savingProfile || profileForm.allowed_categories.length === 0"
|
||||
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded bg-blue-600 hover:bg-blue-700 text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50"
|
||||
style="min-height:40px;"
|
||||
>
|
||||
<template x-if="savingProfile">
|
||||
<i class="fas fa-spinner fa-spin mr-2" aria-hidden="true"></i>
|
||||
</template>
|
||||
<span x-text="editingProfile ? 'Save Changes' : 'Create Profile'"></span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Delete profile confirmation modal ────────────────────────────────────── -->
|
||||
<div
|
||||
x-show="deleteProfileModalOpen"
|
||||
x-transition
|
||||
class="fixed inset-0 z-[60] flex items-center justify-center bg-black/50 px-4"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="delete-profile-modal-title"
|
||||
@keydown.escape.window="deleteProfileModalOpen = false"
|
||||
style="display:none;"
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-sm p-6" @click.stop>
|
||||
<h2 id="delete-profile-modal-title" class="text-lg font-semibold text-gray-900 dark:text-white mb-2">
|
||||
Delete Profile?
|
||||
</h2>
|
||||
<p class="text-sm text-gray-600 dark:text-gray-300 mb-4">
|
||||
Are you sure you want to delete the profile
|
||||
<strong x-text="profileToDelete ? profileToDelete.name : ''"></strong>?
|
||||
IMAP accounts using this profile will fall back to the global default.
|
||||
</p>
|
||||
<div class="flex justify-end gap-2">
|
||||
<button
|
||||
type="button"
|
||||
@click="deleteProfileModalOpen = false; profileToDelete = null"
|
||||
class="px-4 py-2 text-sm font-medium rounded border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500"
|
||||
style="min-height:40px;"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
@click="deleteProfile()"
|
||||
:disabled="deletingProfile"
|
||||
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded bg-red-600 hover:bg-red-700 text-white focus:outline-none focus:ring-2 focus:ring-red-500 disabled:opacity-50"
|
||||
style="min-height:40px;"
|
||||
>
|
||||
<template x-if="deletingProfile">
|
||||
<i class="fas fa-spinner fa-spin mr-2" aria-hidden="true"></i>
|
||||
</template>
|
||||
Delete
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function imapAccountsApp() {
|
||||
return {
|
||||
accounts: {{ accounts | tojson }},
|
||||
profiles: {{ profiles | tojson }},
|
||||
categories: {{ categories | tojson }},
|
||||
defaultCategories: {{ default_categories | tojson }},
|
||||
quota: {
|
||||
current_count: {{ current_count }},
|
||||
max_mailboxes: {{ max_mailboxes | tojson }},
|
||||
@@ -508,17 +823,17 @@ function imapAccountsApp() {
|
||||
loading: false,
|
||||
alert: { show: false, type: '', title: '', message: '' },
|
||||
|
||||
// Modal state
|
||||
// Account modal state
|
||||
modalOpen: false,
|
||||
editingAccount: null,
|
||||
form: { name: '', host: '', port: 993, username: '', password: '', use_ssl: true, delete_after_process: false, is_active: true },
|
||||
form: { name: '', host: '', port: 993, username: '', password: '', use_ssl: true, delete_after_process: false, is_active: true, profile_id: null },
|
||||
showPassword: false,
|
||||
saving: false,
|
||||
testing: false,
|
||||
testResult: null,
|
||||
formError: null,
|
||||
|
||||
// Delete state
|
||||
// Account delete state
|
||||
deleteModalOpen: false,
|
||||
accountToDelete: null,
|
||||
deleting: false,
|
||||
@@ -526,6 +841,17 @@ function imapAccountsApp() {
|
||||
// Test (saved account) state
|
||||
testingId: null,
|
||||
|
||||
// Profiles panel & modal state
|
||||
showProfilesSection: false,
|
||||
profileModalOpen: false,
|
||||
editingProfile: null,
|
||||
profileForm: { name: '', description: '', allowed_categories: [] },
|
||||
savingProfile: false,
|
||||
profileFormError: null,
|
||||
deleteProfileModalOpen: false,
|
||||
profileToDelete: null,
|
||||
deletingProfile: false,
|
||||
|
||||
get canAdd() {
|
||||
return this.quota.can_add;
|
||||
},
|
||||
@@ -549,9 +875,33 @@ function imapAccountsApp() {
|
||||
setTimeout(() => { this.alert.show = false; }, 5000);
|
||||
},
|
||||
|
||||
// ── Profile helpers ──────────────────────────────────────────────────────
|
||||
|
||||
profileById(id) {
|
||||
return this.profiles.find(p => p.id === id) || null;
|
||||
},
|
||||
|
||||
profileName(id) {
|
||||
const p = this.profileById(id);
|
||||
return p ? p.name : 'Unknown profile';
|
||||
},
|
||||
|
||||
profileCategorySummary(id) {
|
||||
const p = this.profileById(id);
|
||||
if (!p) return '';
|
||||
return p.allowed_categories.map(k => this.categoryLabel(k)).join(', ');
|
||||
},
|
||||
|
||||
categoryLabel(key) {
|
||||
const cat = this.categories.find(c => c.key === key);
|
||||
return cat ? cat.label : key;
|
||||
},
|
||||
|
||||
// ── Account modal ────────────────────────────────────────────────────────
|
||||
|
||||
openCreateModal() {
|
||||
this.editingAccount = null;
|
||||
this.form = { name: '', host: '', port: 993, username: '', password: '', use_ssl: true, delete_after_process: false, is_active: true };
|
||||
this.form = { name: '', host: '', port: 993, username: '', password: '', use_ssl: true, delete_after_process: false, is_active: true, profile_id: null };
|
||||
this.showPassword = false;
|
||||
this.testResult = null;
|
||||
this.formError = null;
|
||||
@@ -569,6 +919,7 @@ function imapAccountsApp() {
|
||||
use_ssl: acct.use_ssl,
|
||||
delete_after_process: acct.delete_after_process,
|
||||
is_active: acct.is_active,
|
||||
profile_id: acct.profile_id || null,
|
||||
};
|
||||
this.showPassword = false;
|
||||
this.testResult = null;
|
||||
@@ -592,6 +943,8 @@ function imapAccountsApp() {
|
||||
if (this.editingAccount && payload.password === '') {
|
||||
delete payload.password;
|
||||
}
|
||||
// Normalise profile_id: empty string → null
|
||||
if (payload.profile_id === '' || payload.profile_id === 0) payload.profile_id = null;
|
||||
let resp;
|
||||
if (this.editingAccount) {
|
||||
resp = await fetch(`/api/imap-accounts/${this.editingAccount.id}`, {
|
||||
@@ -719,6 +1072,126 @@ function imapAccountsApp() {
|
||||
this.deleting = false;
|
||||
}
|
||||
},
|
||||
|
||||
// ── Profile CRUD ─────────────────────────────────────────────────────────
|
||||
|
||||
openProfileModal(profile) {
|
||||
this.editingProfile = profile;
|
||||
if (profile) {
|
||||
this.profileForm = {
|
||||
name: profile.name,
|
||||
description: profile.description || '',
|
||||
allowed_categories: [...profile.allowed_categories],
|
||||
};
|
||||
} else {
|
||||
this.profileForm = { name: '', description: '', allowed_categories: [...this.defaultCategories] };
|
||||
}
|
||||
this.profileFormError = null;
|
||||
this.profileModalOpen = true;
|
||||
},
|
||||
|
||||
closeProfileModal() {
|
||||
this.profileModalOpen = false;
|
||||
this.editingProfile = null;
|
||||
this.profileFormError = null;
|
||||
},
|
||||
|
||||
toggleCategory(key) {
|
||||
const idx = this.profileForm.allowed_categories.indexOf(key);
|
||||
if (idx === -1) {
|
||||
this.profileForm.allowed_categories.push(key);
|
||||
} else {
|
||||
this.profileForm.allowed_categories.splice(idx, 1);
|
||||
}
|
||||
},
|
||||
|
||||
async saveProfile() {
|
||||
if (this.profileForm.allowed_categories.length === 0) {
|
||||
this.profileFormError = 'Select at least one category.';
|
||||
return;
|
||||
}
|
||||
this.profileFormError = null;
|
||||
this.savingProfile = true;
|
||||
try {
|
||||
const payload = {
|
||||
name: this.profileForm.name,
|
||||
description: this.profileForm.description || null,
|
||||
allowed_categories: this.profileForm.allowed_categories,
|
||||
};
|
||||
let resp;
|
||||
if (this.editingProfile) {
|
||||
resp = await fetch(`/api/imap-profiles/${this.editingProfile.id}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': getCsrfToken() },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
} else {
|
||||
resp = await fetch('/api/imap-profiles/', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': getCsrfToken() },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
}
|
||||
const data = await resp.json();
|
||||
if (!resp.ok) {
|
||||
this.profileFormError = data.detail || 'Failed to save profile.';
|
||||
return;
|
||||
}
|
||||
// Flatten response into the same shape used locally
|
||||
const normalized = {
|
||||
id: data.id,
|
||||
name: data.name,
|
||||
description: data.description,
|
||||
owner_id: data.owner_id,
|
||||
allowed_categories: data.allowed_categories,
|
||||
is_builtin: data.is_builtin,
|
||||
};
|
||||
if (this.editingProfile) {
|
||||
const idx = this.profiles.findIndex(p => p.id === normalized.id);
|
||||
if (idx !== -1) this.profiles.splice(idx, 1, normalized);
|
||||
} else {
|
||||
this.profiles.push(normalized);
|
||||
}
|
||||
this.closeProfileModal();
|
||||
this.showAlert('success', 'Saved', this.editingProfile ? 'Profile updated.' : 'Profile created.');
|
||||
} catch (err) {
|
||||
this.profileFormError = `Network error: ${err.message || 'Unknown error'}. Please try again.`;
|
||||
} finally {
|
||||
this.savingProfile = false;
|
||||
}
|
||||
},
|
||||
|
||||
confirmDeleteProfile(profile) {
|
||||
this.profileToDelete = profile;
|
||||
this.deleteProfileModalOpen = true;
|
||||
},
|
||||
|
||||
async deleteProfile() {
|
||||
if (!this.profileToDelete) return;
|
||||
this.deletingProfile = true;
|
||||
try {
|
||||
const resp = await fetch(`/api/imap-profiles/${this.profileToDelete.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: { 'X-CSRF-Token': getCsrfToken() },
|
||||
});
|
||||
if (resp.ok || resp.status === 204) {
|
||||
const deletedId = this.profileToDelete.id;
|
||||
this.profiles = this.profiles.filter(p => p.id !== deletedId);
|
||||
// Clear profile_id on accounts that referenced this profile
|
||||
this.accounts.forEach(a => { if (a.profile_id === deletedId) a.profile_id = null; });
|
||||
this.showAlert('success', 'Deleted', `Profile "${this.profileToDelete.name}" removed.`);
|
||||
this.deleteProfileModalOpen = false;
|
||||
this.profileToDelete = null;
|
||||
} else {
|
||||
const data = await resp.json();
|
||||
this.showAlert('error', 'Delete Failed', data.detail || 'Could not delete profile.');
|
||||
}
|
||||
} catch (err) {
|
||||
this.showAlert('error', 'Delete Failed', `Network error: ${err.message || 'Unknown error'}`);
|
||||
} finally {
|
||||
this.deletingProfile = false;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Езикът беше променен на {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Български",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "L'idioma s'ha canviat a {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Català",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Jazyk byl změněn na {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Čeština",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Sproget blev ændret til {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Dansk",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+459
-342
@@ -1,394 +1,511 @@
|
||||
{
|
||||
"nav.dashboard": "Übersicht",
|
||||
"nav.upload": "Hochladen",
|
||||
"nav.files": "Dateien",
|
||||
"nav.search": "Suche",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.help": "Hilfe",
|
||||
"nav.settings": "Einstellungen",
|
||||
"nav.login": "Anmelden",
|
||||
"nav.logout": "Abmelden",
|
||||
"nav.signup": "Registrieren",
|
||||
"nav.profile": "Profil",
|
||||
"nav.admin": "Administration",
|
||||
"nav.admin.users": "Benutzer",
|
||||
"nav.admin.plans": "Tarife",
|
||||
"nav.admin.scheduled_jobs": "Geplante Aufgaben",
|
||||
"nav.admin.backups": "Sicherungen",
|
||||
"nav.admin.audit_logs": "Prüfprotokolle",
|
||||
"nav.queue": "Warteschlange",
|
||||
"nav.integrations": "Integrationen",
|
||||
"nav.status": "Systemstatus",
|
||||
"nav.notifications": "Benachrichtigungen",
|
||||
"nav.shared_links": "Geteilte Links",
|
||||
"nav.duplicates": "Duplikate",
|
||||
"nav.api_tokens": "API-Token",
|
||||
"nav.subscription": "Abonnement",
|
||||
"nav.imap": "E-Mail-Import",
|
||||
"nav.version": "Versionsinformationen",
|
||||
"footer.copyright": "© {year} DocuElevate",
|
||||
"footer.about": "Über uns",
|
||||
"footer.privacy": "Datenschutz",
|
||||
"footer.terms": "Nutzungsbedingungen",
|
||||
"footer.cookies": "Cookie-Richtlinie",
|
||||
"footer.imprint": "Impressum",
|
||||
"footer.attribution": "Namensnennung",
|
||||
"footer.license": "Lizenz",
|
||||
"footer.version": "Version",
|
||||
"common.loading": "Laden...",
|
||||
"common.save": "Speichern",
|
||||
"common.cancel": "Abbrechen",
|
||||
"common.delete": "Löschen",
|
||||
"common.edit": "Bearbeiten",
|
||||
"common.create": "Erstellen",
|
||||
"common.confirm": "Bestätigen",
|
||||
"common.close": "Schließen",
|
||||
"common.back": "Zurück",
|
||||
"common.next": "Weiter",
|
||||
"common.previous": "Zurück",
|
||||
"common.search": "Suche",
|
||||
"common.filter": "Filtern",
|
||||
"common.reset": "Zurücksetzen",
|
||||
"common.submit": "Absenden",
|
||||
"common.download": "Herunterladen",
|
||||
"common.upload": "Hochladen",
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Passwort bestätigen",
|
||||
"auth.display_name_label": "Anzeigename",
|
||||
"auth.email_label": "E-Mail",
|
||||
"auth.forgot_password": "Passwort vergessen?",
|
||||
"auth.login": "Anmelden",
|
||||
"auth.login_title": "Anmelden",
|
||||
"auth.logout": "Abmelden",
|
||||
"auth.my_account": "Mein Konto",
|
||||
"auth.password_label": "Passwort",
|
||||
"auth.profile": "Profil",
|
||||
"auth.remember_me": "Angemeldet bleiben",
|
||||
"auth.signup": "Registrieren",
|
||||
"auth.signup_title": "Registrieren",
|
||||
"auth.username_label": "Benutzername",
|
||||
"common.actions": "Aktionen",
|
||||
"common.status": "Status",
|
||||
"common.name": "Name",
|
||||
"common.description": "Beschreibung",
|
||||
"common.type": "Typ",
|
||||
"common.active": "Aktiv",
|
||||
"common.all": "Alle",
|
||||
"common.back": "Zurück",
|
||||
"common.cancel": "Abbrechen",
|
||||
"common.close": "Schließen",
|
||||
"common.completed": "Abgeschlossen",
|
||||
"common.confirm": "Bestätigen",
|
||||
"common.copied": "Kopiert!",
|
||||
"common.copy": "Kopieren",
|
||||
"common.create": "Erstellen",
|
||||
"common.created": "Erstellt",
|
||||
"common.date": "Datum",
|
||||
"common.size": "Größe",
|
||||
"common.enabled": "Aktiviert",
|
||||
"common.delete": "Löschen",
|
||||
"common.description": "Beschreibung",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Deaktiviert",
|
||||
"common.yes": "Ja",
|
||||
"common.download": "Herunterladen",
|
||||
"common.duplicate": "Duplikat",
|
||||
"common.edit": "Bearbeiten",
|
||||
"common.enabled": "Aktiviert",
|
||||
"common.error": "Fehler",
|
||||
"common.failed": "Fehlgeschlagen",
|
||||
"common.filter": "Filtern",
|
||||
"common.inactive": "Inaktiv",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Laden...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Weiter",
|
||||
"common.no": "Nein",
|
||||
"common.none": "Keine",
|
||||
"common.error": "Fehler",
|
||||
"common.success": "Erfolg",
|
||||
"common.warning": "Warnung",
|
||||
"common.info": "Info",
|
||||
"common.tags": "Tags",
|
||||
"common.pending": "Ausstehend",
|
||||
"common.previous": "Zurück",
|
||||
"common.processing": "Verarbeitung",
|
||||
"common.completed": "Abgeschlossen",
|
||||
"common.failed": "Fehlgeschlagen",
|
||||
"common.duplicate": "Duplikat",
|
||||
"common.active": "Aktiv",
|
||||
"cookie.message": "Diese Website verwendet Cookies, um Ihr Erlebnis zu verbessern.",
|
||||
"common.refresh": "Aktualisieren",
|
||||
"common.reset": "Zurücksetzen",
|
||||
"common.retry": "Erneut versuchen",
|
||||
"common.save": "Speichern",
|
||||
"common.search": "Suche",
|
||||
"common.select": "Auswählen",
|
||||
"common.size": "Größe",
|
||||
"common.status": "Status",
|
||||
"common.submit": "Absenden",
|
||||
"common.success": "Erfolg",
|
||||
"common.tags": "Tags",
|
||||
"common.type": "Typ",
|
||||
"common.updated": "Aktualisiert",
|
||||
"common.upload": "Hochladen",
|
||||
"common.view": "Ansehen",
|
||||
"common.warning": "Warnung",
|
||||
"common.yes": "Ja",
|
||||
"cookie.accept": "Akzeptieren",
|
||||
"cookie.learn_more": "Mehr erfahren",
|
||||
"language.selector_label": "Sprache wählen",
|
||||
"language.change_success": "Sprache geändert zu {language}",
|
||||
"upload.page_title": "Dateien hochladen",
|
||||
"upload.section_device": "Vom Gerät hochladen",
|
||||
"upload.drop_hint_desktop": "Dateien oder Ordner hierher ziehen oder klicken, um Dateien auszuwählen.",
|
||||
"upload.drop_hint_mobile": "Tippen Sie, um Dateien auszuwählen, oder verwenden Sie die Kamera-Schaltfläche unten.",
|
||||
"upload.browse_button": "Dateien durchsuchen",
|
||||
"upload.file_types": "Erlaubte Typen: PDF, Office-Dokumente (Word, Excel, PowerPoint usw.), Bilder",
|
||||
"upload.file_size_hint": "Maximale Größe: 500 MB pro Datei",
|
||||
"upload.camera_button": "Foto aufnehmen / Dokument scannen",
|
||||
"upload.section_url": "Von URL hochladen",
|
||||
"upload.url_label": "Datei-URL",
|
||||
"upload.url_placeholder": "https://beispiel.de/dokument.pdf",
|
||||
"upload.url_description": "Geben Sie einen direkten Link zu einer Datei ein (PDF, Office-Dokumente oder Bilder)",
|
||||
"upload.filename_label": "Dateiname (optional)",
|
||||
"upload.filename_placeholder": "mein-dokument.pdf",
|
||||
"upload.filename_description": "Leer lassen, um den Dateinamen aus der URL zu verwenden",
|
||||
"upload.download_button": "Herunterladen und verarbeiten",
|
||||
"upload.error_url_required": "Bitte geben Sie eine URL ein",
|
||||
"upload.error_invalid_url": "Ungültiges URL-Format",
|
||||
"upload.downloading": "Datei wird von URL heruntergeladen...",
|
||||
"upload.button_processing": "Verarbeitung...",
|
||||
"files.page_title": "Dateiübersicht",
|
||||
"files.drop_overlay_title": "Dateien oder Ordner zum Hochladen hier ablegen",
|
||||
"files.drop_overlay_hint": "Unterstützt PDF, Office-Dokumente, Bilder, HTML, Markdown und mehr",
|
||||
"files.upload_modal_header": "Dateien hochladen",
|
||||
"files.queue_banner_link": "Warteschlange ansehen",
|
||||
"files.filter_search_placeholder": "Dateinamen eingeben...",
|
||||
"files.filter_mime_type": "MIME-Typ",
|
||||
"files.filter_all_types": "Alle Typen",
|
||||
"files.filter_all_statuses": "Alle Status",
|
||||
"files.filter_date_from": "Datum von",
|
||||
"files.filter_date_to": "Datum bis",
|
||||
"files.filter_storage_provider": "Speicheranbieter",
|
||||
"files.filter_all_providers": "Alle Anbieter",
|
||||
"files.filter_tags_placeholder": "z.B. Rechnung,Amazon",
|
||||
"files.filter_ocr_quality": "OCR-Qualität",
|
||||
"files.filter_ocr_all": "Alle Dateien",
|
||||
"files.filter_ocr_poor": "Schlechte Qualität",
|
||||
"files.filter_ocr_good": "Gute Qualität",
|
||||
"files.filter_ocr_unchecked": "Noch nicht bewertet",
|
||||
"files.filter_apply": "Filter anwenden",
|
||||
"files.filter_clear": "Zurücksetzen",
|
||||
"files.saved_searches_label": "Gespeicherte Suchen",
|
||||
"files.saved_searches_empty": "Noch keine gespeicherten Suchen",
|
||||
"files.saved_searches_save": "Aktuelle speichern",
|
||||
"files.saved_searches_error": "Gespeicherte Suchen konnten nicht geladen werden",
|
||||
"files.fulltext_search_label": "Volltextsuche",
|
||||
"files.fulltext_search_placeholder": "Dokumentinhalt, Absender, Tags, Typ durchsuchen...",
|
||||
"files.search_results_title": "Suchergebnisse",
|
||||
"files.search_results_empty": "Keine Ergebnisse gefunden.",
|
||||
"files.bulk_reprocess": "Ausgewählte erneut verarbeiten",
|
||||
"files.bulk_cloud_ocr": "Cloud-OCR erneut ausführen",
|
||||
"files.bulk_download": "Als ZIP herunterladen",
|
||||
"files.bulk_delete": "Ausgewählte löschen",
|
||||
"files.bulk_clear_selection": "Auswahl aufheben",
|
||||
"files.table_select_all": "Alle Dateien auf dieser Seite auswählen",
|
||||
"files.table_id": "ID",
|
||||
"files.table_original_filename": "Originaler Dateiname",
|
||||
"files.table_mime_type": "MIME-Typ",
|
||||
"files.table_created_at": "Erstellt am",
|
||||
"files.table_actions": "Aktionen",
|
||||
"files.table_empty": "Keine Dateien gefunden",
|
||||
"files.action_preview": "Schnellvorschau",
|
||||
"files.action_details": "Details anzeigen",
|
||||
"cookie.message": "Diese Website verwendet Cookies, um Ihr Erlebnis zu verbessern.",
|
||||
"cookie.notice": "DocuElevate verwendet nur essentielle Sitzungscookies, die für die Authentifizierung und den Servicebetrieb erforderlich sind. Es werden keine Tracking- oder Analyse-Cookies verwendet.",
|
||||
"cookie.notice_label": "Cookie-Hinweis",
|
||||
"cookie.policy_link": "Cookie-Richtlinie",
|
||||
"cookie.privacy_link": "Datenschutzhinweis",
|
||||
"dashboard.active_integrations": "Aktive Integrationen",
|
||||
"dashboard.files_this_month": "Dateien diesen Monat",
|
||||
"dashboard.files_today": "Dateien heute",
|
||||
"dashboard.ocr_processed": "OCR verarbeitet",
|
||||
"dashboard.quick_actions": "Schnellaktionen",
|
||||
"dashboard.recent_activity": "Letzte Aktivitäten",
|
||||
"dashboard.storage_targets": "Speicherziele",
|
||||
"dashboard.title": "Übersicht",
|
||||
"dashboard.total_files": "Dateien gesamt",
|
||||
"dashboard.welcome": "Willkommen bei DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Ups, diese Seite konnten wir nicht finden!",
|
||||
"error.404_home": "Zur Startseite",
|
||||
"error.404_message": "Es scheint, als hätte DocuElevate das gesuchte Dokument verlegt. Keine Sorge – wir helfen Ihnen weiter.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Unsere Server haben ein Problem und brauchen einen Moment.",
|
||||
"error.500_heading": "Ups! Etwas ist schiefgelaufen.",
|
||||
"error.500_home": "Zur Startseite",
|
||||
"error.forbidden": "Zugriff verweigert",
|
||||
"error.forbidden_message": "Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",
|
||||
"error.not_found": "Seite nicht gefunden",
|
||||
"error.not_found_message": "Die gesuchte Seite existiert nicht.",
|
||||
"error.server_error": "Interner Serverfehler",
|
||||
"error.server_error_message": "Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut.",
|
||||
"error.unauthorized": "Nicht autorisiert",
|
||||
"error.unauthorized_message": "Sie müssen sich anmelden, um auf diese Seite zuzugreifen.",
|
||||
"files.action_delete": "Datei löschen",
|
||||
"files.pagination_first": "Erste",
|
||||
"files.pagination_previous": "Vorherige",
|
||||
"files.pagination_next": "Nächste",
|
||||
"files.pagination_last": "Letzte",
|
||||
"files.delete_modal_title": "Löschung bestätigen",
|
||||
"files.delete_modal_message": "Sind Sie sicher, dass Sie diese Datei löschen möchten?",
|
||||
"files.action_details": "Details anzeigen",
|
||||
"files.action_preview": "Schnellvorschau",
|
||||
"files.bulk_clear_selection": "Auswahl aufheben",
|
||||
"files.bulk_cloud_ocr": "Cloud-OCR erneut ausführen",
|
||||
"files.bulk_delete": "Ausgewählte löschen",
|
||||
"files.bulk_download": "Als ZIP herunterladen",
|
||||
"files.bulk_reprocess": "Ausgewählte erneut verarbeiten",
|
||||
"files.delete_modal_cancel": "Abbrechen",
|
||||
"files.delete_modal_confirm": "Löschen",
|
||||
"files.preview_modal_title": "Vorschau",
|
||||
"files.delete_modal_message": "Sind Sie sicher, dass Sie diese Datei löschen möchten?",
|
||||
"files.delete_modal_title": "Löschung bestätigen",
|
||||
"files.document_title": "Dokumenttitel",
|
||||
"files.drop_overlay_hint": "Unterstützt PDF, Office-Dokumente, Bilder, HTML, Markdown und mehr",
|
||||
"files.drop_overlay_title": "Dateien oder Ordner zum Hochladen hier ablegen",
|
||||
"files.file_size": "Dateigröße",
|
||||
"files.filename": "Dateiname",
|
||||
"files.filter_all_providers": "Alle Anbieter",
|
||||
"files.filter_all_statuses": "Alle Status",
|
||||
"files.filter_all_types": "Alle Typen",
|
||||
"files.filter_apply": "Filter anwenden",
|
||||
"files.filter_clear": "Zurücksetzen",
|
||||
"files.filter_date_from": "Datum von",
|
||||
"files.filter_date_to": "Datum bis",
|
||||
"files.filter_mime_type": "MIME-Typ",
|
||||
"files.filter_ocr_all": "Alle Dateien",
|
||||
"files.filter_ocr_good": "Gute Qualität",
|
||||
"files.filter_ocr_poor": "Schlechte Qualität",
|
||||
"files.filter_ocr_quality": "OCR-Qualität",
|
||||
"files.filter_ocr_unchecked": "Noch nicht bewertet",
|
||||
"files.filter_search_placeholder": "Dateinamen eingeben...",
|
||||
"files.filter_storage_provider": "Speicheranbieter",
|
||||
"files.filter_tags_placeholder": "z.B. Rechnung,Amazon",
|
||||
"files.fulltext_search_label": "Volltextsuche",
|
||||
"files.fulltext_search_placeholder": "Dokumentinhalt, Absender, Tags, Typ durchsuchen...",
|
||||
"files.no_files": "Keine Dateien gefunden",
|
||||
"files.ocr_status": "OCR-Status",
|
||||
"files.page_title": "Dateiübersicht",
|
||||
"files.pagination_first": "Erste",
|
||||
"files.pagination_last": "Letzte",
|
||||
"files.pagination_next": "Nächste",
|
||||
"files.pagination_previous": "Vorherige",
|
||||
"files.preview_modal_close": "Vorschau schließen",
|
||||
"search.page_title": "Dokumente suchen",
|
||||
"search.heading": "Dokumentensuche",
|
||||
"search.input_placeholder": "Dokumente nach Inhalt, Absender, Tags, Typ suchen...",
|
||||
"search.button": "Suchen",
|
||||
"search.filter_document_type": "Dokumenttyp",
|
||||
"search.filter_document_type_placeholder": "z.B. Rechnung",
|
||||
"search.filter_tags_placeholder": "z.B. Amazon",
|
||||
"search.filter_sender": "Absender",
|
||||
"search.filter_sender_placeholder": "z.B. ACME GmbH",
|
||||
"search.filter_language": "Sprache",
|
||||
"search.filter_language_placeholder": "z.B. de",
|
||||
"search.filter_text_quality": "Textqualität",
|
||||
"search.filter_text_quality_all": "Alle",
|
||||
"search.filter_text_quality_high": "Hoch",
|
||||
"search.filter_text_quality_medium": "Mittel",
|
||||
"search.filter_text_quality_low": "Niedrig",
|
||||
"search.filter_text_quality_no_text": "Kein Text",
|
||||
"search.filter_date_from": "Datum von",
|
||||
"search.filter_date_to": "Datum bis",
|
||||
"search.filter_clear_button": "Filter zurücksetzen",
|
||||
"search.saved_label": "Gespeicherte Suchen",
|
||||
"search.saved_loading": "Laden...",
|
||||
"search.saved_empty": "Noch keine gespeicherten Suchen",
|
||||
"search.saved_error": "Gespeicherte Suchen konnten nicht geladen werden",
|
||||
"search.saved_button": "Aktuelle speichern",
|
||||
"search.result_empty": "Keine Dokumente gefunden, die Ihrer Suche entsprechen.",
|
||||
"search.loading_indicator": "Suche läuft…",
|
||||
"search.error_message": "Suche ist vorübergehend nicht verfügbar. Bitte versuchen Sie es gleich erneut.",
|
||||
"help.page_title": "Hilfezentrum",
|
||||
"files.preview_modal_title": "Vorschau",
|
||||
"files.queue_banner_link": "Warteschlange ansehen",
|
||||
"files.saved_searches_empty": "Noch keine gespeicherten Suchen",
|
||||
"files.saved_searches_error": "Gespeicherte Suchen konnten nicht geladen werden",
|
||||
"files.saved_searches_label": "Gespeicherte Suchen",
|
||||
"files.saved_searches_save": "Aktuelle speichern",
|
||||
"files.search_results_empty": "Keine Ergebnisse gefunden.",
|
||||
"files.search_results_title": "Suchergebnisse",
|
||||
"files.table_actions": "Aktionen",
|
||||
"files.table_created_at": "Erstellt am",
|
||||
"files.table_empty": "Keine Dateien gefunden",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME-Typ",
|
||||
"files.table_original_filename": "Originaler Dateiname",
|
||||
"files.table_select_all": "Alle Dateien auf dieser Seite auswählen",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Dateien",
|
||||
"files.upload_modal_header": "Dateien hochladen",
|
||||
"files.uploaded": "Hochgeladen",
|
||||
"footer.about": "Über uns",
|
||||
"footer.attribution": "Namensnennung",
|
||||
"footer.attributions": "Quellenangaben",
|
||||
"footer.cookies": "Cookie-Richtlinie",
|
||||
"footer.copyright": "© {year} DocuElevate",
|
||||
"footer.imprint": "Impressum",
|
||||
"footer.license": "Lizenz",
|
||||
"footer.navigation": "Fußzeilennavigation",
|
||||
"footer.privacy": "Datenschutz",
|
||||
"footer.terms": "Nutzungsbedingungen",
|
||||
"footer.version": "Version",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-verknüpft. Dateien landen in Ihrem gewählten Ordner.",
|
||||
"help.destinations_email": "E-Mail-Weiterleitung",
|
||||
"help.destinations_email_desc": "Verarbeitete Dateien als SMTP-Anhänge gesendet.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Dienstkonto oder OAuth. Unterstützt geteilte Laufwerke.",
|
||||
"help.destinations_heading": "Ziele – Wohin die Dokumente gehen",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Selbstgehosteter Cloud-Speicher über WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API-Integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Dokumente direkt in Paperless zur Archivierung übertragen.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Jeder S3-kompatible Bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Sichere Dateiübertragung auf beliebige Server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "Metadaten per POST an einen externen Endpunkt senden.",
|
||||
"help.documentation": "Dokumentation",
|
||||
"help.faq": "Häufig gestellte Fragen",
|
||||
"help.faq_1_a": "Navigieren Sie zur Upload-Seite, ziehen Sie Ihre Dateien per Drag-and-Drop oder klicken Sie auf Datei auswählen. DocuElevate konvertiert Bilder und Office-Dokumente in PDF, führt OCR durch und extrahiert Metadaten automatisch.",
|
||||
"help.faq_1_q": "Wie lade ich Dokumente hoch?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF und HTML. Nicht-PDF-Dateien werden vor der Verarbeitung automatisch in PDF konvertiert.",
|
||||
"help.faq_2_q": "Welche Dateiformate werden unterstützt?",
|
||||
"help.faq_3_a": "Ja. Gehen Sie zu E-Mail-Import, fügen Sie ein IMAP-Konto hinzu, und DocuElevate prüft auf neue Nachrichten und verarbeitet Anhänge automatisch.",
|
||||
"help.faq_3_q": "Kann ich Dokumente per E-Mail importieren?",
|
||||
"help.faq_4_a": "Pipelines ermöglichen es Ihnen, Verarbeitungsschritte zu verketten – OCR, KI-Extraktion, Formatkonvertierung – und das Ergebnis an ein oder mehrere Ziele weiterzuleiten. Erstellen und verwalten Sie diese auf der Pipelines-Seite.",
|
||||
"help.faq_4_q": "Wie funktionieren Verarbeitungs-Pipelines?",
|
||||
"help.faq_5_a": "DocuElevate verschlüsselt Anmeldedaten im Ruhezustand, kommuniziert über TLS und speichert Ihre Dokumente nie länger als nötig. Weitere Details finden Sie in der Datenschutzerklärung.",
|
||||
"help.faq_5_q": "Sind meine Daten sicher?",
|
||||
"help.faq_heading": "Häufig gestellte Fragen",
|
||||
"help.getting_started": "Erste Schritte",
|
||||
"help.heading": "Hilfezentrum",
|
||||
"help.subheading": "Alles, was Sie brauchen, um DocuElevate optimal zu nutzen. Durchsuchen Sie die Themen unten oder suchen Sie nach dem, was Sie brauchen.",
|
||||
"help.page_title": "Hilfezentrum",
|
||||
"help.quickstart_heading": "Schnellstart",
|
||||
"help.quickstart_upload": "Dokumente hochladen",
|
||||
"help.quickstart_upload_desc": "Ziehen Sie Dateien auf die Upload-Seite oder klicken Sie auf Datei auswählen. DocuElevate konvertiert Bilder und Office-Dokumente in PDF, führt OCR durch und extrahiert Metadaten automatisch.",
|
||||
"help.quickstart_storage": "Speicher verbinden",
|
||||
"help.quickstart_storage_desc": "Gehen Sie zu Einstellungen und verknüpfen Sie Ihre Cloud-Konten. Verarbeitete Dokumente werden automatisch an jedes konfigurierte Ziel weitergeleitet.",
|
||||
"help.quickstart_upload": "Dokumente hochladen",
|
||||
"help.quickstart_upload_desc": "Ziehen Sie Dateien auf die Upload-Seite oder klicken Sie auf Datei auswählen. DocuElevate konvertiert Bilder und Office-Dokumente in PDF, führt OCR durch und extrahiert Metadaten automatisch.",
|
||||
"help.quickstart_workflows": "Arbeitsabläufe automatisieren",
|
||||
"help.quickstart_workflows_desc": "Erstellen Sie Pipelines, um mehrstufige Verarbeitungs- und Weiterleitungsregeln zu definieren. Kombinieren Sie OCR, KI-Extraktion, Formatkonvertierung und Zustellung in einem einzigen Ablauf.",
|
||||
"help.sources_heading": "Quellen – Dokumente einbringen",
|
||||
"help.sources_web_upload": "Web-Upload",
|
||||
"help.sources_web_upload_desc": "Der schnellste Weg, um loszulegen. Öffnen Sie die Upload-Seite, legen Sie eine oder mehrere Dateien ab, und DocuElevate kümmert sich um den Rest. Unterstützte Formate sind PDF, JPEG, PNG, TIFF, DOCX, XLSX und mehr.",
|
||||
"help.sources_email_ingestion": "E-Mail-Import (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Leiten Sie Dokumente an ein dediziertes Postfach weiter. Unter E-Mail-Import fügen Sie ein oder mehrere IMAP-Konten hinzu. DocuElevate prüft auf neue Nachrichten und verarbeitet Anhänge automatisch.",
|
||||
"help.sources_heading": "Quellen – Dokumente einbringen",
|
||||
"help.sources_rest_api": "REST-API",
|
||||
"help.sources_rest_api_desc": "Integrieren Sie programmgesteuert, indem Sie Dateien an /api/upload senden. Ideal für Skripte, überwachte Ordner, Scanner oder Drittanbieter-Tools wie Zapier und n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobil",
|
||||
"help.sources_scanner_desc": "Richten Sie Netzwerkscanner auf den Upload-Endpunkt von DocuElevate oder verwenden Sie eine mobile Scan-App, die benutzerdefinierte HTTP-Ziele unterstützt.",
|
||||
"help.destinations_heading": "Ziele – Wohin die Dokumente gehen",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-verknüpft. Dateien landen in Ihrem gewählten Ordner.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Dienstkonto oder OAuth. Unterstützt geteilte Laufwerke.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API-Integration.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Jeder S3-kompatible Bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Selbstgehosteter Cloud-Speicher über WebDAV.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Dokumente direkt in Paperless zur Archivierung übertragen.",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Sichere Dateiübertragung auf beliebige Server.",
|
||||
"help.destinations_email": "E-Mail-Weiterleitung",
|
||||
"help.destinations_email_desc": "Verarbeitete Dateien als SMTP-Anhänge gesendet.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "Metadaten per POST an einen externen Endpunkt senden.",
|
||||
"help.workflows_heading": "Arbeitsabläufe & Pipelines",
|
||||
"help.workflows_what_is": "Was ist eine Pipeline?",
|
||||
"help.workflows_definition": "Eine Pipeline ist eine Reihe von Verarbeitungsschritten, die automatisch ausgeführt werden, wenn ein Dokument aufgenommen wird. Jeder Schritt kann das Dokument transformieren, anreichern oder weiterleiten.",
|
||||
"help.workflows_typical_steps": "Typische Schritte",
|
||||
"help.workflows_step_1": "In PDF konvertieren",
|
||||
"help.workflows_step_2": "OCR – Text extrahieren",
|
||||
"help.workflows_step_3": "KI-Metadatenextraktion",
|
||||
"help.workflows_step_4": "An ein oder mehrere Ziele liefern",
|
||||
"help.sources_web_upload": "Web-Upload",
|
||||
"help.sources_web_upload_desc": "Der schnellste Weg, um loszulegen. Öffnen Sie die Upload-Seite, legen Sie eine oder mehrere Dateien ab, und DocuElevate kümmert sich um den Rest. Unterstützte Formate sind PDF, JPEG, PNG, TIFF, DOCX, XLSX und mehr.",
|
||||
"help.subheading": "Alles, was Sie brauchen, um DocuElevate optimal zu nutzen. Durchsuchen Sie die Themen unten oder suchen Sie nach dem, was Sie brauchen.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Wenden Sie sich an Ihren Administrator für Support-Informationen.",
|
||||
"help.support_description": "Können Sie nicht finden, was Sie suchen? Unser Support-Team hilft Ihnen gerne weiter.",
|
||||
"help.support_heading": "Support kontaktieren",
|
||||
"help.title": "Hilfecenter",
|
||||
"help.workflows_creating": "Eine Pipeline erstellen",
|
||||
"help.workflows_definition": "Eine Pipeline ist eine Reihe von Verarbeitungsschritten, die automatisch ausgeführt werden, wenn ein Dokument aufgenommen wird. Jeder Schritt kann das Dokument transformieren, anreichern oder weiterleiten.",
|
||||
"help.workflows_heading": "Arbeitsabläufe & Pipelines",
|
||||
"help.workflows_step_1": "In PDF konvertieren",
|
||||
"help.workflows_step_1_create": "Gehen Sie im Hauptmenü zu Pipelines.",
|
||||
"help.workflows_step_2": "OCR – Text extrahieren",
|
||||
"help.workflows_step_2_create": "Klicken Sie auf Neue Pipeline und geben Sie ihr einen Namen.",
|
||||
"help.workflows_step_3": "KI-Metadatenextraktion",
|
||||
"help.workflows_step_3_create": "Fügen Sie die benötigten Verarbeitungsschritte hinzu.",
|
||||
"help.workflows_step_4": "An ein oder mehrere Ziele liefern",
|
||||
"help.workflows_step_4_create": "Wählen Sie ein oder mehrere Zustellungsziele.",
|
||||
"help.workflows_step_5_create": "Speichern – neue Dokumente werden automatisch durch diese Pipeline verarbeitet.",
|
||||
"help.faq_heading": "Häufig gestellte Fragen",
|
||||
"help.faq_1_q": "Wie lade ich Dokumente hoch?",
|
||||
"help.faq_1_a": "Navigieren Sie zur Upload-Seite, ziehen Sie Ihre Dateien per Drag-and-Drop oder klicken Sie auf Datei auswählen. DocuElevate konvertiert Bilder und Office-Dokumente in PDF, führt OCR durch und extrahiert Metadaten automatisch.",
|
||||
"help.faq_2_q": "Welche Dateiformate werden unterstützt?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF und HTML. Nicht-PDF-Dateien werden vor der Verarbeitung automatisch in PDF konvertiert.",
|
||||
"help.faq_3_q": "Kann ich Dokumente per E-Mail importieren?",
|
||||
"help.faq_3_a": "Ja. Gehen Sie zu E-Mail-Import, fügen Sie ein IMAP-Konto hinzu, und DocuElevate prüft auf neue Nachrichten und verarbeitet Anhänge automatisch.",
|
||||
"help.faq_4_q": "Wie funktionieren Verarbeitungs-Pipelines?",
|
||||
"help.faq_4_a": "Pipelines ermöglichen es Ihnen, Verarbeitungsschritte zu verketten – OCR, KI-Extraktion, Formatkonvertierung – und das Ergebnis an ein oder mehrere Ziele weiterzuleiten. Erstellen und verwalten Sie diese auf der Pipelines-Seite.",
|
||||
"help.faq_5_q": "Sind meine Daten sicher?",
|
||||
"help.faq_5_a": "DocuElevate verschlüsselt Anmeldedaten im Ruhezustand, kommuniziert über TLS und speichert Ihre Dokumente nie länger als nötig. Weitere Details finden Sie in der Datenschutzerklärung.",
|
||||
"help.support_heading": "Support kontaktieren",
|
||||
"help.support_description": "Können Sie nicht finden, was Sie suchen? Unser Support-Team hilft Ihnen gerne weiter.",
|
||||
"help.support_admin_message": "Wenden Sie sich an Ihren Administrator für Support-Informationen.",
|
||||
"index.page_title_public": "Intelligente Dokumentenverarbeitung",
|
||||
"index.page_title_dashboard": "Übersicht",
|
||||
"help.workflows_typical_steps": "Typische Schritte",
|
||||
"help.workflows_what_is": "Was ist eine Pipeline?",
|
||||
"index.badge_intelligent": "Intelligente Dokumentenverarbeitung",
|
||||
"index.hero_heading": "Vom Hochladen zur Erkenntnis – automatisch.",
|
||||
"index.hero_description": "DocuElevate nimmt Ihre Dokumente auf, führt OCR durch, extrahiert Metadaten mit KI und leitet Dateien an Dropbox, Google Drive, OneDrive, S3, Nextcloud und mehr weiter – alles in einer nahtlosen Pipeline.",
|
||||
"index.hero_signup": "Kostenlos starten",
|
||||
"index.hero_login": "Anmelden",
|
||||
"index.hero_pricing": "Tarife & Preise ansehen",
|
||||
"index.feature_section_title": "Alles, was Sie für intelligente Dokumenten-Workflows brauchen",
|
||||
"index.feature_ocr": "OCR & Texterkennung",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence konvertiert gescannte PDFs und Bilder automatisch in vollständig durchsuchbaren Text.",
|
||||
"index.capabilities_cloud": "Cloud-Speicher: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "E-Mail- & URL-basierte Dokumentenaufnahme",
|
||||
"index.capabilities_ocr": "OCR & Metadatenextraktion mit KI",
|
||||
"index.capabilities_paperless": "Paperless-ngx-Integration für Dokumentenverwaltung",
|
||||
"index.capabilities_title": "Funktionen",
|
||||
"index.capabilities_workflows": "Automatisierte Klassifizierung & Routing-Workflows",
|
||||
"index.cta_description": "Schließen Sie sich Teams an, die ihre Dokumentenverarbeitung bereits mit DocuElevate automatisieren.",
|
||||
"index.cta_heading": "Bereit, Ihren Dokumenten-Workflow zu verbessern?",
|
||||
"index.cta_pricing": "Preise ansehen",
|
||||
"index.cta_signup": "Kostenloses Konto erstellen",
|
||||
"index.dashboard_subtitle": "Intelligente Dokumentenverarbeitung & -verwaltung",
|
||||
"index.feature_ai": "KI-Metadatenextraktion",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini und andere KI-Anbieter klassifizieren Dokumente und extrahieren wichtige Felder wie Daten, Beträge und Betreffzeilen.",
|
||||
"index.feature_cloud": "Multi-Cloud-Speicher",
|
||||
"index.feature_cloud_desc": "Leiten Sie verarbeitete Dateien an Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP und mehr weiter.",
|
||||
"index.feature_email": "E-Mail- & IMAP-Import",
|
||||
"index.feature_email_desc": "Ziehen Sie Dokumente automatisch aus Gmail oder jedem IMAP-Postfach – keine manuellen Uploads nötig.",
|
||||
"index.feature_search": "Volltextsuche",
|
||||
"index.feature_search_desc": "Finden Sie sofort jedes Dokument nach Inhalt, Metadaten oder Tags in Ihrem gesamten Archiv.",
|
||||
"index.feature_ocr": "OCR & Texterkennung",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence konvertiert gescannte PDFs und Bilder automatisch in vollständig durchsuchbaren Text.",
|
||||
"index.feature_pipelines": "Benutzerdefinierte Pipelines",
|
||||
"index.feature_pipelines_desc": "Erstellen Sie Verarbeitungs-Pipelines mit konfigurierbaren Schritten – OCR, KI-Extraktion, Formatkonvertierung und Speicher-Routing in beliebiger Reihenfolge.",
|
||||
"index.cta_heading": "Bereit, Ihren Dokumenten-Workflow zu verbessern?",
|
||||
"index.cta_description": "Schließen Sie sich Teams an, die ihre Dokumentenverarbeitung bereits mit DocuElevate automatisieren.",
|
||||
"index.cta_signup": "Kostenloses Konto erstellen",
|
||||
"index.cta_pricing": "Preise ansehen",
|
||||
"index.dashboard_subtitle": "Intelligente Dokumentenverarbeitung & -verwaltung",
|
||||
"index.platform_overview": "Plattformübersicht",
|
||||
"index.stat_total_files": "Dateien gesamt",
|
||||
"index.stat_files_today": "Dateien heute",
|
||||
"index.stat_files_month": "Dateien diesen Monat",
|
||||
"index.stat_active_users": "Aktive Benutzer",
|
||||
"index.usage_my_usage": "Meine Nutzung",
|
||||
"index.usage_lifetime": "Dateien gesamt",
|
||||
"index.usage_today": "Dateien heute",
|
||||
"index.usage_month": "Dateien diesen Monat",
|
||||
"index.usage_unlimited": "Unbegrenzt",
|
||||
"index.tier_plan": "Tarif",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "Alle Details ansehen",
|
||||
"index.quick_actions": "Schnellaktionen",
|
||||
"index.quick_upload": "Dokument hochladen",
|
||||
"index.quick_upload_desc": "Eine neue Datei verarbeiten",
|
||||
"index.quick_documents": "Meine Dokumente",
|
||||
"index.quick_documents_desc": "Ihre verarbeiteten Dateien durchsuchen",
|
||||
"index.quick_subscription": "Mein Abonnement",
|
||||
"index.quick_subscription_desc": "Tarif & Nutzungsdetails anzeigen",
|
||||
"index.quick_search": "Suche",
|
||||
"index.quick_search_desc": "Volltextsuche über Dokumente",
|
||||
"index.upgrade_plan": "Tarif upgraden",
|
||||
"index.upgrade_description": "Mehr Dokumente, mehr Ziele und Prioritäts-Support freischalten.",
|
||||
"index.upgrade_daily_limits": "Höhere tägliche & monatliche Limits",
|
||||
"index.upgrade_destinations": "Mehr Speicherziele",
|
||||
"index.upgrade_ocr_pages": "Mehr OCR-Seiten",
|
||||
"index.upgrade_view_pricing": "Tarife & Preise ansehen",
|
||||
"index.integrations_title": "Integrationen",
|
||||
"index.integrations_active": "Aktive Integrationen",
|
||||
"index.integrations_storage": "Speicherziele",
|
||||
"index.integrations_view_status": "Systemstatus anzeigen",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligente Dokumentenverarbeitung & -verwaltung",
|
||||
"index.capabilities_title": "Funktionen",
|
||||
"index.capabilities_ocr": "OCR & Metadatenextraktion mit KI",
|
||||
"index.capabilities_cloud": "Cloud-Speicher: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_paperless": "Paperless-ngx-Integration für Dokumentenverwaltung",
|
||||
"index.capabilities_ingestion": "E-Mail- & URL-basierte Dokumentenaufnahme",
|
||||
"index.capabilities_workflows": "Automatisierte Klassifizierung & Routing-Workflows",
|
||||
"index.feature_search": "Volltextsuche",
|
||||
"index.feature_search_desc": "Finden Sie sofort jedes Dokument nach Inhalt, Metadaten oder Tags in Ihrem gesamten Archiv.",
|
||||
"index.feature_section_title": "Alles, was Sie für intelligente Dokumenten-Workflows brauchen",
|
||||
"index.getting_started": "Erste Schritte",
|
||||
"index.getting_started_1": "Integrationen über Systemstatus konfigurieren",
|
||||
"index.getting_started_2": "Erstes Dokument hochladen",
|
||||
"index.getting_started_3": "Ergebnisse in Dateien überprüfen",
|
||||
"index.getting_started_learn": "Mehr über DocuElevate erfahren",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Ups, diese Seite konnten wir nicht finden!",
|
||||
"error.404_message": "Es scheint, als hätte DocuElevate das gesuchte Dokument verlegt. Keine Sorge – wir helfen Ihnen weiter.",
|
||||
"error.404_home": "Zur Startseite",
|
||||
"error.500_code": "500",
|
||||
"error.500_heading": "Ups! Etwas ist schiefgelaufen.",
|
||||
"error.500_description": "Unsere Server haben ein Problem und brauchen einen Moment.",
|
||||
"error.500_home": "Zur Startseite",
|
||||
"pipelines.page_title": "Verarbeitungs-Pipelines",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.default_label": "Standard",
|
||||
"pipelines.inactive_label": "Inaktiv",
|
||||
"pipelines.disabled_label": "Deaktiviert",
|
||||
"pipelines.enabled_label": "Aktiviert",
|
||||
"pipelines.empty_state": "Noch keine Pipelines",
|
||||
"pipelines.set_default": "Als meine Standard-Pipeline festlegen",
|
||||
"pipelines.description_label": "Beschreibung",
|
||||
"pipelines.active_label": "Aktiv",
|
||||
"integrations.page_title": "Integrationen",
|
||||
"integrations.imap_settings": "IMAP-Einstellungen",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.username_label": "Benutzername",
|
||||
"integrations.password_label": "Passwort",
|
||||
"integrations.folder_label": "Ordner",
|
||||
"index.hero_description": "DocuElevate nimmt Ihre Dokumente auf, führt OCR durch, extrahiert Metadaten mit KI und leitet Dateien an Dropbox, Google Drive, OneDrive, S3, Nextcloud und mehr weiter – alles in einer nahtlosen Pipeline.",
|
||||
"index.hero_heading": "Vom Hochladen zur Erkenntnis – automatisch.",
|
||||
"index.hero_login": "Anmelden",
|
||||
"index.hero_pricing": "Tarife & Preise ansehen",
|
||||
"index.hero_signup": "Kostenlos starten",
|
||||
"index.integrations_active": "Aktive Integrationen",
|
||||
"index.integrations_storage": "Speicherziele",
|
||||
"index.integrations_title": "Integrationen",
|
||||
"index.integrations_view_status": "Systemstatus anzeigen",
|
||||
"index.page_title_dashboard": "Übersicht",
|
||||
"index.page_title_public": "Intelligente Dokumentenverarbeitung",
|
||||
"index.platform_overview": "Plattformübersicht",
|
||||
"index.quick_actions": "Schnellaktionen",
|
||||
"index.quick_documents": "Meine Dokumente",
|
||||
"index.quick_documents_desc": "Ihre verarbeiteten Dateien durchsuchen",
|
||||
"index.quick_search": "Suche",
|
||||
"index.quick_search_desc": "Volltextsuche über Dokumente",
|
||||
"index.quick_subscription": "Mein Abonnement",
|
||||
"index.quick_subscription_desc": "Tarif & Nutzungsdetails anzeigen",
|
||||
"index.quick_upload": "Dokument hochladen",
|
||||
"index.quick_upload_desc": "Eine neue Datei verarbeiten",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligente Dokumentenverarbeitung & -verwaltung",
|
||||
"index.stat_active_users": "Aktive Benutzer",
|
||||
"index.stat_files_month": "Dateien diesen Monat",
|
||||
"index.stat_files_today": "Dateien heute",
|
||||
"index.stat_total_files": "Dateien gesamt",
|
||||
"index.tier_plan": "Tarif",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "Alle Details ansehen",
|
||||
"index.upgrade_daily_limits": "Höhere tägliche & monatliche Limits",
|
||||
"index.upgrade_description": "Mehr Dokumente, mehr Ziele und Prioritäts-Support freischalten.",
|
||||
"index.upgrade_destinations": "Mehr Speicherziele",
|
||||
"index.upgrade_ocr_pages": "Mehr OCR-Seiten",
|
||||
"index.upgrade_plan": "Tarif upgraden",
|
||||
"index.upgrade_view_pricing": "Tarife & Preise ansehen",
|
||||
"index.usage_lifetime": "Dateien gesamt",
|
||||
"index.usage_month": "Dateien diesen Monat",
|
||||
"index.usage_my_usage": "Meine Nutzung",
|
||||
"index.usage_today": "Dateien heute",
|
||||
"index.usage_unlimited": "Unbegrenzt",
|
||||
"integrations.configure": "Konfigurieren",
|
||||
"integrations.connect": "Verbinden",
|
||||
"integrations.connected": "Verbunden",
|
||||
"integrations.disconnect": "Trennen",
|
||||
"integrations.empty_state": "Keine Integrationen konfiguriert",
|
||||
"status.page_title": "Systemstatus",
|
||||
"status.app_version": "App-Version",
|
||||
"status.build_date": "Build-Datum",
|
||||
"status.last_check": "Letzte Prüfung",
|
||||
"status.container_id": "Container-ID",
|
||||
"status.git_commit": "Git-Commit",
|
||||
"status.setting_label": "Einstellung",
|
||||
"status.value_label": "Wert",
|
||||
"notifications.page_title": "Benachrichtigungen",
|
||||
"notifications.manage_desc": "Verwalten Sie Ihren Posteingang, Ziele und Ereignispräferenzen",
|
||||
"notifications.tab_inbox": "Posteingang",
|
||||
"notifications.tab_settings": "Einstellungen",
|
||||
"notifications.filter_all": "Alle",
|
||||
"notifications.filter_unread": "Nur ungelesene",
|
||||
"notifications.filter_read": "Nur gelesene",
|
||||
"notifications.mark_all_read_btn": "Alle als gelesen markieren",
|
||||
"auth.login_title": "Anmelden",
|
||||
"auth.signup_title": "Registrieren",
|
||||
"auth.forgot_password": "Passwort vergessen?",
|
||||
"auth.remember_me": "Angemeldet bleiben",
|
||||
"auth.email_label": "E-Mail",
|
||||
"auth.password_label": "Passwort",
|
||||
"auth.confirm_password": "Passwort bestätigen",
|
||||
"auth.username_label": "Benutzername",
|
||||
"auth.display_name_label": "Anzeigename",
|
||||
"language.nb": "Norsk",
|
||||
"language.da": "Dansk",
|
||||
"language.sv": "Svenska",
|
||||
"language.fi": "Suomi",
|
||||
"language.is": "Íslenska",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hu": "Magyar",
|
||||
"integrations.folder_label": "Ordner",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP-Einstellungen",
|
||||
"integrations.not_connected": "Nicht verbunden",
|
||||
"integrations.page_title": "Integrationen",
|
||||
"integrations.password_label": "Passwort",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrationen",
|
||||
"integrations.username_label": "Benutzername",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.change_success": "Sprache geändert zu {language}",
|
||||
"language.changed": "Sprache geändert zu {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "Englisch",
|
||||
"language.es": "Spanisch",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Französisch",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italienisch",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Niederländisch",
|
||||
"language.pl": "Polnisch",
|
||||
"language.pt": "Portugiesisch",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Russisch",
|
||||
"language.selector": "Sprache",
|
||||
"language.selector_label": "Sprache wählen",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.ro": "Română",
|
||||
"language.bg": "Български",
|
||||
"language.uk": "Українська",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.et": "Eesti",
|
||||
"language.lv": "Latviešu",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.ca": "Català"
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "Chinesisch",
|
||||
"nav.about": "Über uns",
|
||||
"nav.admin": "Administration",
|
||||
"nav.admin.audit_logs": "Prüfprotokolle",
|
||||
"nav.admin.backups": "Sicherungen",
|
||||
"nav.admin.plans": "Tarife",
|
||||
"nav.admin.scheduled_jobs": "Geplante Aufgaben",
|
||||
"nav.admin.users": "Benutzer",
|
||||
"nav.admin_actions": "Admin-Aktionen",
|
||||
"nav.admin_menu": "Admin-Menü",
|
||||
"nav.api_docs": "API-Dokumentation",
|
||||
"nav.api_tokens": "API-Token",
|
||||
"nav.backup_restore": "Sicherung & Wiederherstellung",
|
||||
"nav.credentials": "Zugangsdaten",
|
||||
"nav.dark_mode": "Dunkelmodus",
|
||||
"nav.dashboard": "Übersicht",
|
||||
"nav.developer_docs": "Entwicklerdokumentation",
|
||||
"nav.duplicates": "Duplikate",
|
||||
"nav.file_manager": "Dateimanager",
|
||||
"nav.files": "Dateien",
|
||||
"nav.help": "Hilfe",
|
||||
"nav.help_center": "Hilfecenter",
|
||||
"nav.imap": "E-Mail-Import",
|
||||
"nav.integrations": "Integrationen",
|
||||
"nav.light_mode": "Hellmodus",
|
||||
"nav.login": "Anmelden",
|
||||
"nav.logout": "Abmelden",
|
||||
"nav.main_navigation": "Hauptnavigation",
|
||||
"nav.notifications": "Benachrichtigungen",
|
||||
"nav.open_main_menu": "Hauptmenü öffnen",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan-Designer",
|
||||
"nav.pricing": "Preise",
|
||||
"nav.profile": "Profil",
|
||||
"nav.queue": "Warteschlange",
|
||||
"nav.queue_monitor": "Warteschlangen-Monitor",
|
||||
"nav.scheduled_jobs": "Geplante Aufgaben",
|
||||
"nav.search": "Suche",
|
||||
"nav.settings": "Einstellungen",
|
||||
"nav.shared_links": "Geteilte Links",
|
||||
"nav.signup": "Registrieren",
|
||||
"nav.similarity": "Ähnlichkeit",
|
||||
"nav.skip_to_content": "Zum Hauptinhalt springen",
|
||||
"nav.status": "Systemstatus",
|
||||
"nav.subscription": "Abonnement",
|
||||
"nav.toggle_dark_mode": "Dunkelmodus umschalten",
|
||||
"nav.toggle_nav": "Navigationsmenü umschalten",
|
||||
"nav.upload": "Hochladen",
|
||||
"nav.users": "Benutzer",
|
||||
"nav.version": "Versionsinformationen",
|
||||
"notifications.filter_all": "Alle",
|
||||
"notifications.filter_read": "Nur gelesene",
|
||||
"notifications.filter_unread": "Nur ungelesene",
|
||||
"notifications.manage_desc": "Verwalten Sie Ihren Posteingang, Ziele und Ereignispräferenzen",
|
||||
"notifications.mark_all_read": "Alle als gelesen markieren",
|
||||
"notifications.mark_all_read_btn": "Alle als gelesen markieren",
|
||||
"notifications.mark_read": "Als gelesen markieren",
|
||||
"notifications.no_notifications": "Keine Benachrichtigungen",
|
||||
"notifications.page_title": "Benachrichtigungen",
|
||||
"notifications.tab_inbox": "Posteingang",
|
||||
"notifications.tab_settings": "Einstellungen",
|
||||
"notifications.title": "Benachrichtigungen",
|
||||
"notifications.unread_count": "{count} ungelesene Benachrichtigungen",
|
||||
"pipelines.active_label": "Aktiv",
|
||||
"pipelines.create": "Pipeline erstellen",
|
||||
"pipelines.default_label": "Standard",
|
||||
"pipelines.description_label": "Beschreibung",
|
||||
"pipelines.disabled_label": "Deaktiviert",
|
||||
"pipelines.edit": "Pipeline bearbeiten",
|
||||
"pipelines.empty_state": "Noch keine Pipelines",
|
||||
"pipelines.enabled_label": "Aktiviert",
|
||||
"pipelines.inactive_label": "Inaktiv",
|
||||
"pipelines.page_title": "Verarbeitungs-Pipelines",
|
||||
"pipelines.set_default": "Als meine Standard-Pipeline festlegen",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Verarbeitungs-Pipelines",
|
||||
"search.button": "Suchen",
|
||||
"search.error_message": "Suche ist vorübergehend nicht verfügbar. Bitte versuchen Sie es gleich erneut.",
|
||||
"search.filter_clear_button": "Filter zurücksetzen",
|
||||
"search.filter_date_from": "Datum von",
|
||||
"search.filter_date_to": "Datum bis",
|
||||
"search.filter_document_type": "Dokumenttyp",
|
||||
"search.filter_document_type_placeholder": "z.B. Rechnung",
|
||||
"search.filter_language": "Sprache",
|
||||
"search.filter_language_placeholder": "z.B. de",
|
||||
"search.filter_sender": "Absender",
|
||||
"search.filter_sender_placeholder": "z.B. ACME GmbH",
|
||||
"search.filter_tags_placeholder": "z.B. Amazon",
|
||||
"search.filter_text_quality": "Textqualität",
|
||||
"search.filter_text_quality_all": "Alle",
|
||||
"search.filter_text_quality_high": "Hoch",
|
||||
"search.filter_text_quality_low": "Niedrig",
|
||||
"search.filter_text_quality_medium": "Mittel",
|
||||
"search.filter_text_quality_no_text": "Kein Text",
|
||||
"search.heading": "Dokumentensuche",
|
||||
"search.input_placeholder": "Dokumente nach Inhalt, Absender, Tags, Typ suchen...",
|
||||
"search.loading_indicator": "Suche läuft…",
|
||||
"search.no_results": "Keine Ergebnisse gefunden",
|
||||
"search.page_title": "Dokumente suchen",
|
||||
"search.placeholder": "Nach Dateiname, Inhalt, Tags suchen...",
|
||||
"search.result_empty": "Keine Dokumente gefunden, die Ihrer Suche entsprechen.",
|
||||
"search.results_count": "{count} Ergebnisse gefunden",
|
||||
"search.saved_button": "Aktuelle speichern",
|
||||
"search.saved_empty": "Noch keine gespeicherten Suchen",
|
||||
"search.saved_error": "Gespeicherte Suchen konnten nicht geladen werden",
|
||||
"search.saved_label": "Gespeicherte Suchen",
|
||||
"search.saved_loading": "Laden...",
|
||||
"search.title": "Dokumente suchen",
|
||||
"settings.reset_confirm": "Möchten Sie diese Einstellung wirklich zurücksetzen?",
|
||||
"settings.save_error": "Einstellung konnte nicht gespeichert werden",
|
||||
"settings.save_success": "Einstellung erfolgreich gespeichert",
|
||||
"settings.title": "Einstellungen",
|
||||
"status.app_version": "App-Version",
|
||||
"status.build_date": "Build-Datum",
|
||||
"status.container_id": "Container-ID",
|
||||
"status.git_commit": "Git-Commit",
|
||||
"status.last_check": "Letzte Prüfung",
|
||||
"status.page_title": "Systemstatus",
|
||||
"status.setting_label": "Einstellung",
|
||||
"status.value_label": "Wert",
|
||||
"upload.browse_button": "Dateien durchsuchen",
|
||||
"upload.button_processing": "Verarbeitung...",
|
||||
"upload.camera_button": "Foto aufnehmen / Dokument scannen",
|
||||
"upload.download_button": "Herunterladen und verarbeiten",
|
||||
"upload.downloading": "Datei wird von URL heruntergeladen...",
|
||||
"upload.drag_drop": "Dateien hierher ziehen oder zum Durchsuchen klicken",
|
||||
"upload.drop_hint_desktop": "Dateien oder Ordner hierher ziehen oder klicken, um Dateien auszuwählen.",
|
||||
"upload.drop_hint_mobile": "Tippen Sie, um Dateien auszuwählen, oder verwenden Sie die Kamera-Schaltfläche unten.",
|
||||
"upload.error": "Upload fehlgeschlagen",
|
||||
"upload.error_invalid_url": "Ungültiges URL-Format",
|
||||
"upload.error_url_required": "Bitte geben Sie eine URL ein",
|
||||
"upload.file_size_hint": "Maximale Größe: 500 MB pro Datei",
|
||||
"upload.file_types": "Erlaubte Typen: PDF, Office-Dokumente (Word, Excel, PowerPoint usw.), Bilder",
|
||||
"upload.filename_description": "Leer lassen, um den Dateinamen aus der URL zu verwenden",
|
||||
"upload.filename_label": "Dateiname (optional)",
|
||||
"upload.filename_placeholder": "mein-dokument.pdf",
|
||||
"upload.max_size": "Maximale Dateigröße: {size}",
|
||||
"upload.page_title": "Dateien hochladen",
|
||||
"upload.section_device": "Vom Gerät hochladen",
|
||||
"upload.section_url": "Von URL hochladen",
|
||||
"upload.select_file": "Datei auswählen",
|
||||
"upload.success": "Datei erfolgreich hochgeladen",
|
||||
"upload.title": "Dokument hochladen",
|
||||
"upload.uploading": "Wird hochgeladen...",
|
||||
"upload.url_description": "Geben Sie einen direkten Link zu einer Datei ein (PDF, Office-Dokumente oder Bilder)",
|
||||
"upload.url_label": "Datei-URL",
|
||||
"upload.url_placeholder": "https://beispiel.de/dokument.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Η γλώσσα άλλαξε σε {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Ελληνικά",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Panel",
|
||||
"nav.upload": "Subir",
|
||||
"nav.files": "Archivos",
|
||||
"nav.search": "Buscar",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.integrations": "Integraciones",
|
||||
"nav.help": "Ayuda",
|
||||
"nav.notifications": "Notificaciones",
|
||||
"nav.pricing": "Precios",
|
||||
"nav.about": "Acerca de",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Configuración",
|
||||
"nav.users": "Usuarios",
|
||||
"nav.plan_designer": "Diseñador de planes",
|
||||
"nav.credentials": "Credenciales",
|
||||
"nav.file_manager": "Gestor de archivos",
|
||||
"nav.duplicates": "Duplicados",
|
||||
"nav.similarity": "Similitud",
|
||||
"nav.queue_monitor": "Monitor de cola",
|
||||
"nav.scheduled_jobs": "Tareas programadas",
|
||||
"nav.backup_restore": "Copia de seguridad y restauración",
|
||||
"nav.status": "Estado",
|
||||
"nav.api_docs": "Documentación API",
|
||||
"nav.developer_docs": "Documentación para desarrolladores",
|
||||
"nav.dark_mode": "Modo oscuro",
|
||||
"nav.light_mode": "Modo claro",
|
||||
"nav.toggle_dark_mode": "Alternar modo oscuro",
|
||||
"nav.toggle_nav": "Alternar menú de navegación",
|
||||
"nav.open_main_menu": "Abrir menú principal",
|
||||
"nav.skip_to_content": "Ir al contenido principal",
|
||||
"nav.main_navigation": "Navegación principal",
|
||||
"nav.admin_menu": "Menú de administración",
|
||||
"nav.admin_actions": "Acciones de administración",
|
||||
"nav.help_center": "Centro de ayuda",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Iniciar sesión",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Cerrar sesión",
|
||||
"auth.signup": "Registrarse",
|
||||
"auth.my_account": "Mi cuenta",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Perfil",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Privacidad",
|
||||
"footer.imprint": "Aviso legal",
|
||||
"footer.terms": "Términos",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.license": "Licencia",
|
||||
"footer.attributions": "Atribuciones",
|
||||
"footer.version": "Versión {version}",
|
||||
"footer.navigation": "Navegación del pie de página",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Registrarse",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Acciones",
|
||||
"common.active": "Activo",
|
||||
"common.all": "Todo",
|
||||
"common.back": "Atrás",
|
||||
"common.cancel": "Cancelar",
|
||||
"common.close": "Cerrar",
|
||||
"common.completed": "Completado",
|
||||
"common.confirm": "Confirmar",
|
||||
"common.copied": "¡Copiado!",
|
||||
"common.copy": "Copiar",
|
||||
"common.created": "Creado",
|
||||
"common.date": "Fecha",
|
||||
"common.delete": "Eliminar",
|
||||
"common.description": "Descripción",
|
||||
"common.details": "Detalles",
|
||||
"common.disabled": "Deshabilitado",
|
||||
"common.download": "Descargar",
|
||||
"common.edit": "Editar",
|
||||
"common.enabled": "Habilitado",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Fallido",
|
||||
"common.filter": "Filtrar",
|
||||
"common.inactive": "Inactivo",
|
||||
"common.info": "Información",
|
||||
"common.loading": "Cargando...",
|
||||
"common.name": "Nombre",
|
||||
"common.next": "Siguiente",
|
||||
"common.no": "No",
|
||||
"common.none": "Ninguno",
|
||||
"common.pending": "Pendiente",
|
||||
"common.processing": "Procesando",
|
||||
"common.refresh": "Actualizar",
|
||||
"common.reset": "Restablecer",
|
||||
"common.retry": "Reintentar",
|
||||
"common.save": "Guardar",
|
||||
"common.search": "Buscar",
|
||||
"common.select": "Seleccionar",
|
||||
"common.size": "Tamaño",
|
||||
"common.status": "Estado",
|
||||
"common.success": "Éxito",
|
||||
"common.type": "Tipo",
|
||||
"common.updated": "Actualizado",
|
||||
"common.upload": "Subir",
|
||||
"common.view": "Ver",
|
||||
"common.warning": "Advertencia",
|
||||
"common.yes": "Sí",
|
||||
"cookie.accept": "Entendido",
|
||||
"cookie.notice": "DocuElevate utiliza solo cookies de sesión esenciales necesarias para la autenticación y el funcionamiento del servicio. No se utilizan cookies de seguimiento ni analíticas.",
|
||||
"cookie.notice_label": "Aviso de cookies",
|
||||
"cookie.policy_link": "Política de cookies",
|
||||
"cookie.privacy_link": "Aviso de privacidad",
|
||||
"cookie.accept": "Entendido",
|
||||
"cookie.notice_label": "Aviso de cookies",
|
||||
|
||||
"common.save": "Guardar",
|
||||
"common.cancel": "Cancelar",
|
||||
"common.delete": "Eliminar",
|
||||
"common.edit": "Editar",
|
||||
"common.close": "Cerrar",
|
||||
"common.confirm": "Confirmar",
|
||||
"common.back": "Atrás",
|
||||
"common.next": "Siguiente",
|
||||
"common.loading": "Cargando...",
|
||||
"common.error": "Error",
|
||||
"common.success": "Éxito",
|
||||
"common.warning": "Advertencia",
|
||||
"common.info": "Información",
|
||||
"common.yes": "Sí",
|
||||
"common.no": "No",
|
||||
"common.search": "Buscar",
|
||||
"common.filter": "Filtrar",
|
||||
"common.reset": "Restablecer",
|
||||
"common.refresh": "Actualizar",
|
||||
"common.download": "Descargar",
|
||||
"common.actions": "Acciones",
|
||||
"common.details": "Detalles",
|
||||
"common.name": "Nombre",
|
||||
"common.description": "Descripción",
|
||||
"common.type": "Tipo",
|
||||
"common.status": "Estado",
|
||||
"common.date": "Fecha",
|
||||
"common.size": "Tamaño",
|
||||
"common.created": "Creado",
|
||||
"common.updated": "Actualizado",
|
||||
"common.enabled": "Habilitado",
|
||||
"common.disabled": "Deshabilitado",
|
||||
"common.active": "Activo",
|
||||
"common.inactive": "Inactivo",
|
||||
"common.all": "Todo",
|
||||
"common.none": "Ninguno",
|
||||
"common.select": "Seleccionar",
|
||||
"common.upload": "Subir",
|
||||
"common.processing": "Procesando",
|
||||
"common.completed": "Completado",
|
||||
"common.failed": "Fallido",
|
||||
"common.pending": "Pendiente",
|
||||
"common.retry": "Reintentar",
|
||||
"common.view": "Ver",
|
||||
"common.copy": "Copiar",
|
||||
"common.copied": "¡Copiado!",
|
||||
|
||||
"language.selector": "Idioma",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Idioma cambiado a {language}",
|
||||
|
||||
"dashboard.active_integrations": "Integraciones activas",
|
||||
"dashboard.files_this_month": "Archivos este mes",
|
||||
"dashboard.files_today": "Archivos hoy",
|
||||
"dashboard.ocr_processed": "OCR procesados",
|
||||
"dashboard.quick_actions": "Acciones rápidas",
|
||||
"dashboard.recent_activity": "Actividad reciente",
|
||||
"dashboard.storage_targets": "Destinos de almacenamiento",
|
||||
"dashboard.title": "Panel",
|
||||
"dashboard.total_files": "Total de archivos",
|
||||
"dashboard.files_today": "Archivos hoy",
|
||||
"dashboard.files_this_month": "Archivos este mes",
|
||||
"dashboard.ocr_processed": "OCR procesados",
|
||||
"dashboard.active_integrations": "Integraciones activas",
|
||||
"dashboard.storage_targets": "Destinos de almacenamiento",
|
||||
"dashboard.recent_activity": "Actividad reciente",
|
||||
"dashboard.quick_actions": "Acciones rápidas",
|
||||
"dashboard.welcome": "Bienvenido a DocuElevate",
|
||||
|
||||
"upload.title": "Subir documento",
|
||||
"upload.drag_drop": "Arrastre archivos aquí o haga clic para buscar",
|
||||
"upload.select_file": "Seleccionar archivo",
|
||||
"upload.uploading": "Subiendo...",
|
||||
"upload.success": "Archivo subido con éxito",
|
||||
"upload.error": "Error al subir",
|
||||
"upload.max_size": "Tamaño máximo del archivo: {size}",
|
||||
|
||||
"files.title": "Archivos",
|
||||
"files.no_files": "No se encontraron archivos",
|
||||
"files.filename": "Nombre del archivo",
|
||||
"files.document_title": "Título del documento",
|
||||
"files.uploaded": "Subido",
|
||||
"files.file_size": "Tamaño del archivo",
|
||||
"files.ocr_status": "Estado OCR",
|
||||
"files.tags": "Etiquetas",
|
||||
|
||||
"search.title": "Buscar documentos",
|
||||
"search.placeholder": "Buscar por nombre, contenido, etiquetas...",
|
||||
"search.no_results": "No se encontraron resultados",
|
||||
"search.results_count": "{count} resultados encontrados",
|
||||
|
||||
"settings.title": "Configuración",
|
||||
"settings.save_success": "Configuración guardada con éxito",
|
||||
"settings.save_error": "Error al guardar la configuración",
|
||||
"settings.reset_confirm": "¿Está seguro de que desea restablecer esta configuración?",
|
||||
|
||||
"integrations.title": "Integraciones",
|
||||
"integrations.connect": "Conectar",
|
||||
"integrations.disconnect": "Desconectar",
|
||||
"integrations.connected": "Conectado",
|
||||
"integrations.not_connected": "No conectado",
|
||||
"integrations.configure": "Configurar",
|
||||
|
||||
"pipelines.title": "Pipelines de procesamiento",
|
||||
"pipelines.create": "Crear pipeline",
|
||||
"pipelines.edit": "Editar pipeline",
|
||||
|
||||
"help.title": "Centro de ayuda",
|
||||
"help.getting_started": "Primeros pasos",
|
||||
"help.faq": "Preguntas frecuentes",
|
||||
"help.documentation": "Documentación",
|
||||
"help.support": "Soporte",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Prohibido",
|
||||
"error.forbidden_message": "No tiene permiso para acceder a esta página.",
|
||||
"error.not_found": "Página no encontrada",
|
||||
"error.not_found_message": "La página que busca no existe.",
|
||||
"error.server_error": "Error interno del servidor",
|
||||
"error.server_error_message": "Algo salió mal. Inténtelo de nuevo más tarde.",
|
||||
"error.unauthorized": "No autorizado",
|
||||
"error.unauthorized_message": "Debe iniciar sesión para acceder a esta página.",
|
||||
"error.forbidden": "Prohibido",
|
||||
"error.forbidden_message": "No tiene permiso para acceder a esta página.",
|
||||
|
||||
"notifications.title": "Notificaciones",
|
||||
"notifications.mark_read": "Marcar como leído",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Título del documento",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Tamaño del archivo",
|
||||
"files.filename": "Nombre del archivo",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No se encontraron archivos",
|
||||
"files.ocr_status": "Estado OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Etiquetas",
|
||||
"files.title": "Archivos",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Subido",
|
||||
"footer.attributions": "Atribuciones",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Aviso legal",
|
||||
"footer.license": "Licencia",
|
||||
"footer.navigation": "Navegación del pie de página",
|
||||
"footer.privacy": "Privacidad",
|
||||
"footer.terms": "Términos",
|
||||
"footer.version": "Versión {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentación",
|
||||
"help.faq": "Preguntas frecuentes",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Primeros pasos",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Soporte",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Centro de ayuda",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configurar",
|
||||
"integrations.connect": "Conectar",
|
||||
"integrations.connected": "Conectado",
|
||||
"integrations.disconnect": "Desconectar",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "No conectado",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integraciones",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Idioma cambiado a {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Idioma",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "Acerca de",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Acciones de administración",
|
||||
"nav.admin_menu": "Menú de administración",
|
||||
"nav.api_docs": "Documentación API",
|
||||
"nav.backup_restore": "Copia de seguridad y restauración",
|
||||
"nav.credentials": "Credenciales",
|
||||
"nav.dark_mode": "Modo oscuro",
|
||||
"nav.dashboard": "Panel",
|
||||
"nav.developer_docs": "Documentación para desarrolladores",
|
||||
"nav.duplicates": "Duplicados",
|
||||
"nav.file_manager": "Gestor de archivos",
|
||||
"nav.files": "Archivos",
|
||||
"nav.help": "Ayuda",
|
||||
"nav.help_center": "Centro de ayuda",
|
||||
"nav.integrations": "Integraciones",
|
||||
"nav.light_mode": "Modo claro",
|
||||
"nav.main_navigation": "Navegación principal",
|
||||
"nav.notifications": "Notificaciones",
|
||||
"nav.open_main_menu": "Abrir menú principal",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Diseñador de planes",
|
||||
"nav.pricing": "Precios",
|
||||
"nav.queue_monitor": "Monitor de cola",
|
||||
"nav.scheduled_jobs": "Tareas programadas",
|
||||
"nav.search": "Buscar",
|
||||
"nav.settings": "Configuración",
|
||||
"nav.similarity": "Similitud",
|
||||
"nav.skip_to_content": "Ir al contenido principal",
|
||||
"nav.status": "Estado",
|
||||
"nav.toggle_dark_mode": "Alternar modo oscuro",
|
||||
"nav.toggle_nav": "Alternar menú de navegación",
|
||||
"nav.upload": "Subir",
|
||||
"nav.users": "Usuarios",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Marcar todo como leído",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Marcar como leído",
|
||||
"notifications.no_notifications": "Sin notificaciones",
|
||||
"notifications.unread_count": "{count} notificaciones no leídas"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notificaciones",
|
||||
"notifications.unread_count": "{count} notificaciones no leídas",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Crear pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Editar pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Pipelines de procesamiento",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No se encontraron resultados",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Buscar por nombre, contenido, etiquetas...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} resultados encontrados",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Buscar documentos",
|
||||
"settings.reset_confirm": "¿Está seguro de que desea restablecer esta configuración?",
|
||||
"settings.save_error": "Error al guardar la configuración",
|
||||
"settings.save_success": "Configuración guardada con éxito",
|
||||
"settings.title": "Configuración",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Arrastre archivos aquí o haga clic para buscar",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Error al subir",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Tamaño máximo del archivo: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Seleccionar archivo",
|
||||
"upload.success": "Archivo subido con éxito",
|
||||
"upload.title": "Subir documento",
|
||||
"upload.uploading": "Subiendo...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Keel muudeti keelele {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Eesti",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Kieli vaihdettiin kieleen {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Suomi",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Tableau de bord",
|
||||
"nav.upload": "Téléverser",
|
||||
"nav.files": "Fichiers",
|
||||
"nav.search": "Recherche",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.integrations": "Intégrations",
|
||||
"nav.help": "Aide",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.pricing": "Tarifs",
|
||||
"nav.about": "À propos",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Paramètres",
|
||||
"nav.users": "Utilisateurs",
|
||||
"nav.plan_designer": "Concepteur de plans",
|
||||
"nav.credentials": "Identifiants",
|
||||
"nav.file_manager": "Gestionnaire de fichiers",
|
||||
"nav.duplicates": "Doublons",
|
||||
"nav.similarity": "Similarité",
|
||||
"nav.queue_monitor": "File d'attente",
|
||||
"nav.scheduled_jobs": "Tâches planifiées",
|
||||
"nav.backup_restore": "Sauvegarde et restauration",
|
||||
"nav.status": "Statut",
|
||||
"nav.api_docs": "Documentation API",
|
||||
"nav.developer_docs": "Documentation développeur",
|
||||
"nav.dark_mode": "Mode sombre",
|
||||
"nav.light_mode": "Mode clair",
|
||||
"nav.toggle_dark_mode": "Basculer le mode sombre",
|
||||
"nav.toggle_nav": "Basculer le menu de navigation",
|
||||
"nav.open_main_menu": "Ouvrir le menu principal",
|
||||
"nav.skip_to_content": "Aller au contenu principal",
|
||||
"nav.main_navigation": "Navigation principale",
|
||||
"nav.admin_menu": "Menu admin",
|
||||
"nav.admin_actions": "Actions admin",
|
||||
"nav.help_center": "Centre d'aide",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Se connecter",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Se déconnecter",
|
||||
"auth.signup": "S'inscrire",
|
||||
"auth.my_account": "Mon compte",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profil",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Confidentialité",
|
||||
"footer.imprint": "Mentions légales",
|
||||
"footer.terms": "Conditions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.license": "Licence",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.version": "Version {version}",
|
||||
"footer.navigation": "Navigation du pied de page",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "S'inscrire",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Actif",
|
||||
"common.all": "Tout",
|
||||
"common.back": "Retour",
|
||||
"common.cancel": "Annuler",
|
||||
"common.close": "Fermer",
|
||||
"common.completed": "Terminé",
|
||||
"common.confirm": "Confirmer",
|
||||
"common.copied": "Copié !",
|
||||
"common.copy": "Copier",
|
||||
"common.created": "Créé",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Supprimer",
|
||||
"common.description": "Description",
|
||||
"common.details": "Détails",
|
||||
"common.disabled": "Désactivé",
|
||||
"common.download": "Télécharger",
|
||||
"common.edit": "Modifier",
|
||||
"common.enabled": "Activé",
|
||||
"common.error": "Erreur",
|
||||
"common.failed": "Échoué",
|
||||
"common.filter": "Filtrer",
|
||||
"common.inactive": "Inactif",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Chargement...",
|
||||
"common.name": "Nom",
|
||||
"common.next": "Suivant",
|
||||
"common.no": "Non",
|
||||
"common.none": "Aucun",
|
||||
"common.pending": "En attente",
|
||||
"common.processing": "En cours de traitement",
|
||||
"common.refresh": "Actualiser",
|
||||
"common.reset": "Réinitialiser",
|
||||
"common.retry": "Réessayer",
|
||||
"common.save": "Enregistrer",
|
||||
"common.search": "Rechercher",
|
||||
"common.select": "Sélectionner",
|
||||
"common.size": "Taille",
|
||||
"common.status": "Statut",
|
||||
"common.success": "Succès",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Mis à jour",
|
||||
"common.upload": "Téléverser",
|
||||
"common.view": "Voir",
|
||||
"common.warning": "Avertissement",
|
||||
"common.yes": "Oui",
|
||||
"cookie.accept": "Compris",
|
||||
"cookie.notice": "DocuElevate utilise uniquement des cookies de session essentiels nécessaires à l'authentification et au fonctionnement du service. Aucun cookie de suivi ou d'analyse n'est utilisé.",
|
||||
"cookie.notice_label": "Avis relatif aux cookies",
|
||||
"cookie.policy_link": "Politique de cookies",
|
||||
"cookie.privacy_link": "Avis de confidentialité",
|
||||
"cookie.accept": "Compris",
|
||||
"cookie.notice_label": "Avis relatif aux cookies",
|
||||
|
||||
"common.save": "Enregistrer",
|
||||
"common.cancel": "Annuler",
|
||||
"common.delete": "Supprimer",
|
||||
"common.edit": "Modifier",
|
||||
"common.close": "Fermer",
|
||||
"common.confirm": "Confirmer",
|
||||
"common.back": "Retour",
|
||||
"common.next": "Suivant",
|
||||
"common.loading": "Chargement...",
|
||||
"common.error": "Erreur",
|
||||
"common.success": "Succès",
|
||||
"common.warning": "Avertissement",
|
||||
"common.info": "Info",
|
||||
"common.yes": "Oui",
|
||||
"common.no": "Non",
|
||||
"common.search": "Rechercher",
|
||||
"common.filter": "Filtrer",
|
||||
"common.reset": "Réinitialiser",
|
||||
"common.refresh": "Actualiser",
|
||||
"common.download": "Télécharger",
|
||||
"common.actions": "Actions",
|
||||
"common.details": "Détails",
|
||||
"common.name": "Nom",
|
||||
"common.description": "Description",
|
||||
"common.type": "Type",
|
||||
"common.status": "Statut",
|
||||
"common.date": "Date",
|
||||
"common.size": "Taille",
|
||||
"common.created": "Créé",
|
||||
"common.updated": "Mis à jour",
|
||||
"common.enabled": "Activé",
|
||||
"common.disabled": "Désactivé",
|
||||
"common.active": "Actif",
|
||||
"common.inactive": "Inactif",
|
||||
"common.all": "Tout",
|
||||
"common.none": "Aucun",
|
||||
"common.select": "Sélectionner",
|
||||
"common.upload": "Téléverser",
|
||||
"common.processing": "En cours de traitement",
|
||||
"common.completed": "Terminé",
|
||||
"common.failed": "Échoué",
|
||||
"common.pending": "En attente",
|
||||
"common.retry": "Réessayer",
|
||||
"common.view": "Voir",
|
||||
"common.copy": "Copier",
|
||||
"common.copied": "Copié !",
|
||||
|
||||
"language.selector": "Langue",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Langue changée en {language}",
|
||||
|
||||
"dashboard.active_integrations": "Intégrations actives",
|
||||
"dashboard.files_this_month": "Fichiers ce mois-ci",
|
||||
"dashboard.files_today": "Fichiers aujourd'hui",
|
||||
"dashboard.ocr_processed": "OCR traités",
|
||||
"dashboard.quick_actions": "Actions rapides",
|
||||
"dashboard.recent_activity": "Activité récente",
|
||||
"dashboard.storage_targets": "Destinations de stockage",
|
||||
"dashboard.title": "Tableau de bord",
|
||||
"dashboard.total_files": "Total des fichiers",
|
||||
"dashboard.files_today": "Fichiers aujourd'hui",
|
||||
"dashboard.files_this_month": "Fichiers ce mois-ci",
|
||||
"dashboard.ocr_processed": "OCR traités",
|
||||
"dashboard.active_integrations": "Intégrations actives",
|
||||
"dashboard.storage_targets": "Destinations de stockage",
|
||||
"dashboard.recent_activity": "Activité récente",
|
||||
"dashboard.quick_actions": "Actions rapides",
|
||||
"dashboard.welcome": "Bienvenue sur DocuElevate",
|
||||
|
||||
"upload.title": "Téléverser un document",
|
||||
"upload.drag_drop": "Glissez-déposez vos fichiers ici ou cliquez pour parcourir",
|
||||
"upload.select_file": "Sélectionner un fichier",
|
||||
"upload.uploading": "Téléversement en cours...",
|
||||
"upload.success": "Fichier téléversé avec succès",
|
||||
"upload.error": "Échec du téléversement",
|
||||
"upload.max_size": "Taille maximale du fichier : {size}",
|
||||
|
||||
"files.title": "Fichiers",
|
||||
"files.no_files": "Aucun fichier trouvé",
|
||||
"files.filename": "Nom du fichier",
|
||||
"files.document_title": "Titre du document",
|
||||
"files.uploaded": "Téléversé",
|
||||
"files.file_size": "Taille du fichier",
|
||||
"files.ocr_status": "Statut OCR",
|
||||
"files.tags": "Étiquettes",
|
||||
|
||||
"search.title": "Rechercher des documents",
|
||||
"search.placeholder": "Rechercher par nom, contenu, étiquettes...",
|
||||
"search.no_results": "Aucun résultat trouvé",
|
||||
"search.results_count": "{count} résultats trouvés",
|
||||
|
||||
"settings.title": "Paramètres",
|
||||
"settings.save_success": "Paramètre enregistré avec succès",
|
||||
"settings.save_error": "Échec de l'enregistrement du paramètre",
|
||||
"settings.reset_confirm": "Êtes-vous sûr de vouloir réinitialiser ce paramètre ?",
|
||||
|
||||
"integrations.title": "Intégrations",
|
||||
"integrations.connect": "Connecter",
|
||||
"integrations.disconnect": "Déconnecter",
|
||||
"integrations.connected": "Connecté",
|
||||
"integrations.not_connected": "Non connecté",
|
||||
"integrations.configure": "Configurer",
|
||||
|
||||
"pipelines.title": "Pipelines de traitement",
|
||||
"pipelines.create": "Créer un pipeline",
|
||||
"pipelines.edit": "Modifier le pipeline",
|
||||
|
||||
"help.title": "Centre d'aide",
|
||||
"help.getting_started": "Premiers pas",
|
||||
"help.faq": "Questions fréquentes",
|
||||
"help.documentation": "Documentation",
|
||||
"help.support": "Support",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Interdit",
|
||||
"error.forbidden_message": "Vous n'avez pas la permission d'accéder à cette page.",
|
||||
"error.not_found": "Page non trouvée",
|
||||
"error.not_found_message": "La page que vous recherchez n'existe pas.",
|
||||
"error.server_error": "Erreur interne du serveur",
|
||||
"error.server_error_message": "Quelque chose s'est mal passé. Veuillez réessayer plus tard.",
|
||||
"error.unauthorized": "Non autorisé",
|
||||
"error.unauthorized_message": "Vous devez vous connecter pour accéder à cette page.",
|
||||
"error.forbidden": "Interdit",
|
||||
"error.forbidden_message": "Vous n'avez pas la permission d'accéder à cette page.",
|
||||
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.mark_read": "Marquer comme lu",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Titre du document",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Taille du fichier",
|
||||
"files.filename": "Nom du fichier",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Aucun fichier trouvé",
|
||||
"files.ocr_status": "Statut OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Étiquettes",
|
||||
"files.title": "Fichiers",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Téléversé",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Mentions légales",
|
||||
"footer.license": "Licence",
|
||||
"footer.navigation": "Navigation du pied de page",
|
||||
"footer.privacy": "Confidentialité",
|
||||
"footer.terms": "Conditions",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Questions fréquentes",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Premiers pas",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Centre d'aide",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configurer",
|
||||
"integrations.connect": "Connecter",
|
||||
"integrations.connected": "Connecté",
|
||||
"integrations.disconnect": "Déconnecter",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Non connecté",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Intégrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Langue changée en {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Langue",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "À propos",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Actions admin",
|
||||
"nav.admin_menu": "Menu admin",
|
||||
"nav.api_docs": "Documentation API",
|
||||
"nav.backup_restore": "Sauvegarde et restauration",
|
||||
"nav.credentials": "Identifiants",
|
||||
"nav.dark_mode": "Mode sombre",
|
||||
"nav.dashboard": "Tableau de bord",
|
||||
"nav.developer_docs": "Documentation développeur",
|
||||
"nav.duplicates": "Doublons",
|
||||
"nav.file_manager": "Gestionnaire de fichiers",
|
||||
"nav.files": "Fichiers",
|
||||
"nav.help": "Aide",
|
||||
"nav.help_center": "Centre d'aide",
|
||||
"nav.integrations": "Intégrations",
|
||||
"nav.light_mode": "Mode clair",
|
||||
"nav.main_navigation": "Navigation principale",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Ouvrir le menu principal",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Concepteur de plans",
|
||||
"nav.pricing": "Tarifs",
|
||||
"nav.queue_monitor": "File d'attente",
|
||||
"nav.scheduled_jobs": "Tâches planifiées",
|
||||
"nav.search": "Recherche",
|
||||
"nav.settings": "Paramètres",
|
||||
"nav.similarity": "Similarité",
|
||||
"nav.skip_to_content": "Aller au contenu principal",
|
||||
"nav.status": "Statut",
|
||||
"nav.toggle_dark_mode": "Basculer le mode sombre",
|
||||
"nav.toggle_nav": "Basculer le menu de navigation",
|
||||
"nav.upload": "Téléverser",
|
||||
"nav.users": "Utilisateurs",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Tout marquer comme lu",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Marquer comme lu",
|
||||
"notifications.no_notifications": "Aucune notification",
|
||||
"notifications.unread_count": "{count} notifications non lues"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} notifications non lues",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Créer un pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Modifier le pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Pipelines de traitement",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Aucun résultat trouvé",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Rechercher par nom, contenu, étiquettes...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} résultats trouvés",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Rechercher des documents",
|
||||
"settings.reset_confirm": "Êtes-vous sûr de vouloir réinitialiser ce paramètre ?",
|
||||
"settings.save_error": "Échec de l'enregistrement du paramètre",
|
||||
"settings.save_success": "Paramètre enregistré avec succès",
|
||||
"settings.title": "Paramètres",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Glissez-déposez vos fichiers ici ou cliquez pour parcourir",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Échec du téléversement",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Taille maximale du fichier : {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Sélectionner un fichier",
|
||||
"upload.success": "Fichier téléversé avec succès",
|
||||
"upload.title": "Téléverser un document",
|
||||
"upload.uploading": "Téléversement en cours...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Athraíodh an teanga go {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Gaeilge",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Jezik je promijenjen na {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Hrvatski",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "A nyelv megváltozott erre: {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Magyar",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Tungumálið var breytt í {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Íslenska",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Cruscotto",
|
||||
"nav.upload": "Carica",
|
||||
"nav.files": "File",
|
||||
"nav.search": "Cerca",
|
||||
"nav.pipelines": "Pipeline",
|
||||
"nav.integrations": "Integrazioni",
|
||||
"nav.help": "Aiuto",
|
||||
"nav.notifications": "Notifiche",
|
||||
"nav.pricing": "Prezzi",
|
||||
"nav.about": "Informazioni",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Impostazioni",
|
||||
"nav.users": "Utenti",
|
||||
"nav.plan_designer": "Designer dei piani",
|
||||
"nav.credentials": "Credenziali",
|
||||
"nav.file_manager": "Gestore file",
|
||||
"nav.duplicates": "Duplicati",
|
||||
"nav.similarity": "Similarità",
|
||||
"nav.queue_monitor": "Monitor coda",
|
||||
"nav.scheduled_jobs": "Attività pianificate",
|
||||
"nav.backup_restore": "Backup e ripristino",
|
||||
"nav.status": "Stato",
|
||||
"nav.api_docs": "Documentazione API",
|
||||
"nav.developer_docs": "Documentazione sviluppatore",
|
||||
"nav.dark_mode": "Modalità scura",
|
||||
"nav.light_mode": "Modalità chiara",
|
||||
"nav.toggle_dark_mode": "Attiva/disattiva modalità scura",
|
||||
"nav.toggle_nav": "Attiva/disattiva menu di navigazione",
|
||||
"nav.open_main_menu": "Apri menu principale",
|
||||
"nav.skip_to_content": "Vai al contenuto principale",
|
||||
"nav.main_navigation": "Navigazione principale",
|
||||
"nav.admin_menu": "Menu admin",
|
||||
"nav.admin_actions": "Azioni admin",
|
||||
"nav.help_center": "Centro assistenza",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Accedi",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Esci",
|
||||
"auth.signup": "Registrati",
|
||||
"auth.my_account": "Il mio account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profilo",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.imprint": "Note legali",
|
||||
"footer.terms": "Termini",
|
||||
"footer.cookies": "Cookie",
|
||||
"footer.license": "Licenza",
|
||||
"footer.attributions": "Attribuzioni",
|
||||
"footer.version": "Versione {version}",
|
||||
"footer.navigation": "Navigazione a piè di pagina",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Registrati",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Azioni",
|
||||
"common.active": "Attivo",
|
||||
"common.all": "Tutto",
|
||||
"common.back": "Indietro",
|
||||
"common.cancel": "Annulla",
|
||||
"common.close": "Chiudi",
|
||||
"common.completed": "Completato",
|
||||
"common.confirm": "Conferma",
|
||||
"common.copied": "Copiato!",
|
||||
"common.copy": "Copia",
|
||||
"common.created": "Creato",
|
||||
"common.date": "Data",
|
||||
"common.delete": "Elimina",
|
||||
"common.description": "Descrizione",
|
||||
"common.details": "Dettagli",
|
||||
"common.disabled": "Disabilitato",
|
||||
"common.download": "Scarica",
|
||||
"common.edit": "Modifica",
|
||||
"common.enabled": "Abilitato",
|
||||
"common.error": "Errore",
|
||||
"common.failed": "Fallito",
|
||||
"common.filter": "Filtra",
|
||||
"common.inactive": "Inattivo",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Caricamento...",
|
||||
"common.name": "Nome",
|
||||
"common.next": "Avanti",
|
||||
"common.no": "No",
|
||||
"common.none": "Nessuno",
|
||||
"common.pending": "In attesa",
|
||||
"common.processing": "In elaborazione",
|
||||
"common.refresh": "Aggiorna",
|
||||
"common.reset": "Reimposta",
|
||||
"common.retry": "Riprova",
|
||||
"common.save": "Salva",
|
||||
"common.search": "Cerca",
|
||||
"common.select": "Seleziona",
|
||||
"common.size": "Dimensione",
|
||||
"common.status": "Stato",
|
||||
"common.success": "Successo",
|
||||
"common.type": "Tipo",
|
||||
"common.updated": "Aggiornato",
|
||||
"common.upload": "Carica",
|
||||
"common.view": "Visualizza",
|
||||
"common.warning": "Avviso",
|
||||
"common.yes": "Sì",
|
||||
"cookie.accept": "Ho capito",
|
||||
"cookie.notice": "DocuElevate utilizza solo cookie di sessione essenziali necessari per l'autenticazione e il funzionamento del servizio. Non vengono utilizzati cookie di tracciamento o analisi.",
|
||||
"cookie.notice_label": "Avviso sui cookie",
|
||||
"cookie.policy_link": "Politica sui cookie",
|
||||
"cookie.privacy_link": "Informativa sulla privacy",
|
||||
"cookie.accept": "Ho capito",
|
||||
"cookie.notice_label": "Avviso sui cookie",
|
||||
|
||||
"common.save": "Salva",
|
||||
"common.cancel": "Annulla",
|
||||
"common.delete": "Elimina",
|
||||
"common.edit": "Modifica",
|
||||
"common.close": "Chiudi",
|
||||
"common.confirm": "Conferma",
|
||||
"common.back": "Indietro",
|
||||
"common.next": "Avanti",
|
||||
"common.loading": "Caricamento...",
|
||||
"common.error": "Errore",
|
||||
"common.success": "Successo",
|
||||
"common.warning": "Avviso",
|
||||
"common.info": "Info",
|
||||
"common.yes": "Sì",
|
||||
"common.no": "No",
|
||||
"common.search": "Cerca",
|
||||
"common.filter": "Filtra",
|
||||
"common.reset": "Reimposta",
|
||||
"common.refresh": "Aggiorna",
|
||||
"common.download": "Scarica",
|
||||
"common.actions": "Azioni",
|
||||
"common.details": "Dettagli",
|
||||
"common.name": "Nome",
|
||||
"common.description": "Descrizione",
|
||||
"common.type": "Tipo",
|
||||
"common.status": "Stato",
|
||||
"common.date": "Data",
|
||||
"common.size": "Dimensione",
|
||||
"common.created": "Creato",
|
||||
"common.updated": "Aggiornato",
|
||||
"common.enabled": "Abilitato",
|
||||
"common.disabled": "Disabilitato",
|
||||
"common.active": "Attivo",
|
||||
"common.inactive": "Inattivo",
|
||||
"common.all": "Tutto",
|
||||
"common.none": "Nessuno",
|
||||
"common.select": "Seleziona",
|
||||
"common.upload": "Carica",
|
||||
"common.processing": "In elaborazione",
|
||||
"common.completed": "Completato",
|
||||
"common.failed": "Fallito",
|
||||
"common.pending": "In attesa",
|
||||
"common.retry": "Riprova",
|
||||
"common.view": "Visualizza",
|
||||
"common.copy": "Copia",
|
||||
"common.copied": "Copiato!",
|
||||
|
||||
"language.selector": "Lingua",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Lingua cambiata in {language}",
|
||||
|
||||
"dashboard.active_integrations": "Integrazioni attive",
|
||||
"dashboard.files_this_month": "File questo mese",
|
||||
"dashboard.files_today": "File oggi",
|
||||
"dashboard.ocr_processed": "OCR elaborati",
|
||||
"dashboard.quick_actions": "Azioni rapide",
|
||||
"dashboard.recent_activity": "Attività recente",
|
||||
"dashboard.storage_targets": "Destinazioni di archiviazione",
|
||||
"dashboard.title": "Cruscotto",
|
||||
"dashboard.total_files": "File totali",
|
||||
"dashboard.files_today": "File oggi",
|
||||
"dashboard.files_this_month": "File questo mese",
|
||||
"dashboard.ocr_processed": "OCR elaborati",
|
||||
"dashboard.active_integrations": "Integrazioni attive",
|
||||
"dashboard.storage_targets": "Destinazioni di archiviazione",
|
||||
"dashboard.recent_activity": "Attività recente",
|
||||
"dashboard.quick_actions": "Azioni rapide",
|
||||
"dashboard.welcome": "Benvenuto su DocuElevate",
|
||||
|
||||
"upload.title": "Carica documento",
|
||||
"upload.drag_drop": "Trascina i file qui o fai clic per sfogliare",
|
||||
"upload.select_file": "Seleziona file",
|
||||
"upload.uploading": "Caricamento in corso...",
|
||||
"upload.success": "File caricato con successo",
|
||||
"upload.error": "Caricamento fallito",
|
||||
"upload.max_size": "Dimensione massima del file: {size}",
|
||||
|
||||
"files.title": "File",
|
||||
"files.no_files": "Nessun file trovato",
|
||||
"files.filename": "Nome del file",
|
||||
"files.document_title": "Titolo del documento",
|
||||
"files.uploaded": "Caricato",
|
||||
"files.file_size": "Dimensione del file",
|
||||
"files.ocr_status": "Stato OCR",
|
||||
"files.tags": "Tag",
|
||||
|
||||
"search.title": "Cerca documenti",
|
||||
"search.placeholder": "Cerca per nome, contenuto, tag...",
|
||||
"search.no_results": "Nessun risultato trovato",
|
||||
"search.results_count": "{count} risultati trovati",
|
||||
|
||||
"settings.title": "Impostazioni",
|
||||
"settings.save_success": "Impostazione salvata con successo",
|
||||
"settings.save_error": "Salvataggio impostazione fallito",
|
||||
"settings.reset_confirm": "Sei sicuro di voler reimpostare questa impostazione?",
|
||||
|
||||
"integrations.title": "Integrazioni",
|
||||
"integrations.connect": "Connetti",
|
||||
"integrations.disconnect": "Disconnetti",
|
||||
"integrations.connected": "Connesso",
|
||||
"integrations.not_connected": "Non connesso",
|
||||
"integrations.configure": "Configura",
|
||||
|
||||
"pipelines.title": "Pipeline di elaborazione",
|
||||
"pipelines.create": "Crea pipeline",
|
||||
"pipelines.edit": "Modifica pipeline",
|
||||
|
||||
"help.title": "Centro assistenza",
|
||||
"help.getting_started": "Per iniziare",
|
||||
"help.faq": "Domande frequenti",
|
||||
"help.documentation": "Documentazione",
|
||||
"help.support": "Supporto",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Vietato",
|
||||
"error.forbidden_message": "Non hai il permesso di accedere a questa pagina.",
|
||||
"error.not_found": "Pagina non trovata",
|
||||
"error.not_found_message": "La pagina che stai cercando non esiste.",
|
||||
"error.server_error": "Errore interno del server",
|
||||
"error.server_error_message": "Qualcosa è andato storto. Riprova più tardi.",
|
||||
"error.unauthorized": "Non autorizzato",
|
||||
"error.unauthorized_message": "Devi accedere per visualizzare questa pagina.",
|
||||
"error.forbidden": "Vietato",
|
||||
"error.forbidden_message": "Non hai il permesso di accedere a questa pagina.",
|
||||
|
||||
"notifications.title": "Notifiche",
|
||||
"notifications.mark_read": "Segna come letto",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Titolo del documento",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Dimensione del file",
|
||||
"files.filename": "Nome del file",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Nessun file trovato",
|
||||
"files.ocr_status": "Stato OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tag",
|
||||
"files.title": "File",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Caricato",
|
||||
"footer.attributions": "Attribuzioni",
|
||||
"footer.cookies": "Cookie",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Note legali",
|
||||
"footer.license": "Licenza",
|
||||
"footer.navigation": "Navigazione a piè di pagina",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Termini",
|
||||
"footer.version": "Versione {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentazione",
|
||||
"help.faq": "Domande frequenti",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Per iniziare",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Supporto",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Centro assistenza",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configura",
|
||||
"integrations.connect": "Connetti",
|
||||
"integrations.connected": "Connesso",
|
||||
"integrations.disconnect": "Disconnetti",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Non connesso",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrazioni",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Lingua cambiata in {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Lingua",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "Informazioni",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Azioni admin",
|
||||
"nav.admin_menu": "Menu admin",
|
||||
"nav.api_docs": "Documentazione API",
|
||||
"nav.backup_restore": "Backup e ripristino",
|
||||
"nav.credentials": "Credenziali",
|
||||
"nav.dark_mode": "Modalità scura",
|
||||
"nav.dashboard": "Cruscotto",
|
||||
"nav.developer_docs": "Documentazione sviluppatore",
|
||||
"nav.duplicates": "Duplicati",
|
||||
"nav.file_manager": "Gestore file",
|
||||
"nav.files": "File",
|
||||
"nav.help": "Aiuto",
|
||||
"nav.help_center": "Centro assistenza",
|
||||
"nav.integrations": "Integrazioni",
|
||||
"nav.light_mode": "Modalità chiara",
|
||||
"nav.main_navigation": "Navigazione principale",
|
||||
"nav.notifications": "Notifiche",
|
||||
"nav.open_main_menu": "Apri menu principale",
|
||||
"nav.pipelines": "Pipeline",
|
||||
"nav.plan_designer": "Designer dei piani",
|
||||
"nav.pricing": "Prezzi",
|
||||
"nav.queue_monitor": "Monitor coda",
|
||||
"nav.scheduled_jobs": "Attività pianificate",
|
||||
"nav.search": "Cerca",
|
||||
"nav.settings": "Impostazioni",
|
||||
"nav.similarity": "Similarità",
|
||||
"nav.skip_to_content": "Vai al contenuto principale",
|
||||
"nav.status": "Stato",
|
||||
"nav.toggle_dark_mode": "Attiva/disattiva modalità scura",
|
||||
"nav.toggle_nav": "Attiva/disattiva menu di navigazione",
|
||||
"nav.upload": "Carica",
|
||||
"nav.users": "Utenti",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Segna tutto come letto",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Segna come letto",
|
||||
"notifications.no_notifications": "Nessuna notifica",
|
||||
"notifications.unread_count": "{count} notifiche non lette"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifiche",
|
||||
"notifications.unread_count": "{count} notifiche non lette",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Crea pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Modifica pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Pipeline di elaborazione",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Nessun risultato trovato",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Cerca per nome, contenuto, tag...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} risultati trovati",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Cerca documenti",
|
||||
"settings.reset_confirm": "Sei sicuro di voler reimpostare questa impostazione?",
|
||||
"settings.save_error": "Salvataggio impostazione fallito",
|
||||
"settings.save_success": "Impostazione salvata con successo",
|
||||
"settings.title": "Impostazioni",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Trascina i file qui o fai clic per sfogliare",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Caricamento fallito",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Dimensione massima del file: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Seleziona file",
|
||||
"upload.success": "File caricato con successo",
|
||||
"upload.title": "Carica documento",
|
||||
"upload.uploading": "Caricamento in corso...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "D'Sprooch gouf op {language} geännert",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Lëtzebuergesch",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Kalba pakeista į {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Lietuvių",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Valoda tika nomainīta uz {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Latviešu",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Språket ble endret til {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Norsk",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.upload": "Uploaden",
|
||||
"nav.files": "Bestanden",
|
||||
"nav.search": "Zoeken",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.integrations": "Integraties",
|
||||
"nav.help": "Help",
|
||||
"nav.notifications": "Meldingen",
|
||||
"nav.pricing": "Prijzen",
|
||||
"nav.about": "Over ons",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Instellingen",
|
||||
"nav.users": "Gebruikers",
|
||||
"nav.plan_designer": "Planontwerper",
|
||||
"nav.credentials": "Referenties",
|
||||
"nav.file_manager": "Bestandsbeheer",
|
||||
"nav.duplicates": "Duplicaten",
|
||||
"nav.similarity": "Gelijkenis",
|
||||
"nav.queue_monitor": "Wachtrijmonitor",
|
||||
"nav.scheduled_jobs": "Geplande taken",
|
||||
"nav.backup_restore": "Back-up en herstel",
|
||||
"nav.status": "Status",
|
||||
"nav.api_docs": "API-documentatie",
|
||||
"nav.developer_docs": "Ontwikkelaarsdocumentatie",
|
||||
"nav.dark_mode": "Donkere modus",
|
||||
"nav.light_mode": "Lichte modus",
|
||||
"nav.toggle_dark_mode": "Donkere modus schakelen",
|
||||
"nav.toggle_nav": "Navigatiemenu schakelen",
|
||||
"nav.open_main_menu": "Hoofdmenu openen",
|
||||
"nav.skip_to_content": "Ga naar hoofdinhoud",
|
||||
"nav.main_navigation": "Hoofdnavigatie",
|
||||
"nav.admin_menu": "Admin-menu",
|
||||
"nav.admin_actions": "Admin-acties",
|
||||
"nav.help_center": "Helpcentrum",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Inloggen",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Uitloggen",
|
||||
"auth.signup": "Registreren",
|
||||
"auth.my_account": "Mijn account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profiel",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.imprint": "Colofon",
|
||||
"footer.terms": "Voorwaarden",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.license": "Licentie",
|
||||
"footer.attributions": "Attributies",
|
||||
"footer.version": "Versie {version}",
|
||||
"footer.navigation": "Voettekstnavigatie",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Registreren",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Acties",
|
||||
"common.active": "Actief",
|
||||
"common.all": "Alles",
|
||||
"common.back": "Terug",
|
||||
"common.cancel": "Annuleren",
|
||||
"common.close": "Sluiten",
|
||||
"common.completed": "Voltooid",
|
||||
"common.confirm": "Bevestigen",
|
||||
"common.copied": "Gekopieerd!",
|
||||
"common.copy": "Kopiëren",
|
||||
"common.created": "Aangemaakt",
|
||||
"common.date": "Datum",
|
||||
"common.delete": "Verwijderen",
|
||||
"common.description": "Beschrijving",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Uitgeschakeld",
|
||||
"common.download": "Downloaden",
|
||||
"common.edit": "Bewerken",
|
||||
"common.enabled": "Ingeschakeld",
|
||||
"common.error": "Fout",
|
||||
"common.failed": "Mislukt",
|
||||
"common.filter": "Filteren",
|
||||
"common.inactive": "Inactief",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Laden...",
|
||||
"common.name": "Naam",
|
||||
"common.next": "Volgende",
|
||||
"common.no": "Nee",
|
||||
"common.none": "Geen",
|
||||
"common.pending": "In afwachting",
|
||||
"common.processing": "Verwerken",
|
||||
"common.refresh": "Vernieuwen",
|
||||
"common.reset": "Herstellen",
|
||||
"common.retry": "Opnieuw proberen",
|
||||
"common.save": "Opslaan",
|
||||
"common.search": "Zoeken",
|
||||
"common.select": "Selecteren",
|
||||
"common.size": "Grootte",
|
||||
"common.status": "Status",
|
||||
"common.success": "Succes",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Bijgewerkt",
|
||||
"common.upload": "Uploaden",
|
||||
"common.view": "Bekijken",
|
||||
"common.warning": "Waarschuwing",
|
||||
"common.yes": "Ja",
|
||||
"cookie.accept": "Begrepen",
|
||||
"cookie.notice": "DocuElevate gebruikt alleen essentiële sessiecookies die nodig zijn voor authenticatie en werking van de service. Er worden geen tracking- of analysecookies gebruikt.",
|
||||
"cookie.notice_label": "Cookiemelding",
|
||||
"cookie.policy_link": "Cookiebeleid",
|
||||
"cookie.privacy_link": "Privacyverklaring",
|
||||
"cookie.accept": "Begrepen",
|
||||
"cookie.notice_label": "Cookiemelding",
|
||||
|
||||
"common.save": "Opslaan",
|
||||
"common.cancel": "Annuleren",
|
||||
"common.delete": "Verwijderen",
|
||||
"common.edit": "Bewerken",
|
||||
"common.close": "Sluiten",
|
||||
"common.confirm": "Bevestigen",
|
||||
"common.back": "Terug",
|
||||
"common.next": "Volgende",
|
||||
"common.loading": "Laden...",
|
||||
"common.error": "Fout",
|
||||
"common.success": "Succes",
|
||||
"common.warning": "Waarschuwing",
|
||||
"common.info": "Info",
|
||||
"common.yes": "Ja",
|
||||
"common.no": "Nee",
|
||||
"common.search": "Zoeken",
|
||||
"common.filter": "Filteren",
|
||||
"common.reset": "Herstellen",
|
||||
"common.refresh": "Vernieuwen",
|
||||
"common.download": "Downloaden",
|
||||
"common.actions": "Acties",
|
||||
"common.details": "Details",
|
||||
"common.name": "Naam",
|
||||
"common.description": "Beschrijving",
|
||||
"common.type": "Type",
|
||||
"common.status": "Status",
|
||||
"common.date": "Datum",
|
||||
"common.size": "Grootte",
|
||||
"common.created": "Aangemaakt",
|
||||
"common.updated": "Bijgewerkt",
|
||||
"common.enabled": "Ingeschakeld",
|
||||
"common.disabled": "Uitgeschakeld",
|
||||
"common.active": "Actief",
|
||||
"common.inactive": "Inactief",
|
||||
"common.all": "Alles",
|
||||
"common.none": "Geen",
|
||||
"common.select": "Selecteren",
|
||||
"common.upload": "Uploaden",
|
||||
"common.processing": "Verwerken",
|
||||
"common.completed": "Voltooid",
|
||||
"common.failed": "Mislukt",
|
||||
"common.pending": "In afwachting",
|
||||
"common.retry": "Opnieuw proberen",
|
||||
"common.view": "Bekijken",
|
||||
"common.copy": "Kopiëren",
|
||||
"common.copied": "Gekopieerd!",
|
||||
|
||||
"language.selector": "Taal",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Taal gewijzigd naar {language}",
|
||||
|
||||
"dashboard.active_integrations": "Actieve integraties",
|
||||
"dashboard.files_this_month": "Bestanden deze maand",
|
||||
"dashboard.files_today": "Bestanden vandaag",
|
||||
"dashboard.ocr_processed": "OCR verwerkt",
|
||||
"dashboard.quick_actions": "Snelle acties",
|
||||
"dashboard.recent_activity": "Recente activiteit",
|
||||
"dashboard.storage_targets": "Opslagdoelen",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Totaal bestanden",
|
||||
"dashboard.files_today": "Bestanden vandaag",
|
||||
"dashboard.files_this_month": "Bestanden deze maand",
|
||||
"dashboard.ocr_processed": "OCR verwerkt",
|
||||
"dashboard.active_integrations": "Actieve integraties",
|
||||
"dashboard.storage_targets": "Opslagdoelen",
|
||||
"dashboard.recent_activity": "Recente activiteit",
|
||||
"dashboard.quick_actions": "Snelle acties",
|
||||
"dashboard.welcome": "Welkom bij DocuElevate",
|
||||
|
||||
"upload.title": "Document uploaden",
|
||||
"upload.drag_drop": "Sleep bestanden hierheen of klik om te bladeren",
|
||||
"upload.select_file": "Bestand selecteren",
|
||||
"upload.uploading": "Uploaden...",
|
||||
"upload.success": "Bestand succesvol geüpload",
|
||||
"upload.error": "Upload mislukt",
|
||||
"upload.max_size": "Maximale bestandsgrootte: {size}",
|
||||
|
||||
"files.title": "Bestanden",
|
||||
"files.no_files": "Geen bestanden gevonden",
|
||||
"files.filename": "Bestandsnaam",
|
||||
"files.document_title": "Documenttitel",
|
||||
"files.uploaded": "Geüpload",
|
||||
"files.file_size": "Bestandsgrootte",
|
||||
"files.ocr_status": "OCR-status",
|
||||
"files.tags": "Tags",
|
||||
|
||||
"search.title": "Documenten zoeken",
|
||||
"search.placeholder": "Zoeken op naam, inhoud, tags...",
|
||||
"search.no_results": "Geen resultaten gevonden",
|
||||
"search.results_count": "{count} resultaten gevonden",
|
||||
|
||||
"settings.title": "Instellingen",
|
||||
"settings.save_success": "Instelling succesvol opgeslagen",
|
||||
"settings.save_error": "Instelling opslaan mislukt",
|
||||
"settings.reset_confirm": "Weet u zeker dat u deze instelling wilt herstellen?",
|
||||
|
||||
"integrations.title": "Integraties",
|
||||
"integrations.connect": "Verbinden",
|
||||
"integrations.disconnect": "Verbreken",
|
||||
"integrations.connected": "Verbonden",
|
||||
"integrations.not_connected": "Niet verbonden",
|
||||
"integrations.configure": "Configureren",
|
||||
|
||||
"pipelines.title": "Verwerkingspipelines",
|
||||
"pipelines.create": "Pipeline maken",
|
||||
"pipelines.edit": "Pipeline bewerken",
|
||||
|
||||
"help.title": "Helpcentrum",
|
||||
"help.getting_started": "Aan de slag",
|
||||
"help.faq": "Veelgestelde vragen",
|
||||
"help.documentation": "Documentatie",
|
||||
"help.support": "Ondersteuning",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Verboden",
|
||||
"error.forbidden_message": "U heeft geen toestemming om deze pagina te openen.",
|
||||
"error.not_found": "Pagina niet gevonden",
|
||||
"error.not_found_message": "De pagina die u zoekt bestaat niet.",
|
||||
"error.server_error": "Interne serverfout",
|
||||
"error.server_error_message": "Er is iets misgegaan. Probeer het later opnieuw.",
|
||||
"error.unauthorized": "Niet geautoriseerd",
|
||||
"error.unauthorized_message": "U moet inloggen om deze pagina te openen.",
|
||||
"error.forbidden": "Verboden",
|
||||
"error.forbidden_message": "U heeft geen toestemming om deze pagina te openen.",
|
||||
|
||||
"notifications.title": "Meldingen",
|
||||
"notifications.mark_read": "Markeren als gelezen",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Documenttitel",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Bestandsgrootte",
|
||||
"files.filename": "Bestandsnaam",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Geen bestanden gevonden",
|
||||
"files.ocr_status": "OCR-status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Bestanden",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Geüpload",
|
||||
"footer.attributions": "Attributies",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Colofon",
|
||||
"footer.license": "Licentie",
|
||||
"footer.navigation": "Voettekstnavigatie",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Voorwaarden",
|
||||
"footer.version": "Versie {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentatie",
|
||||
"help.faq": "Veelgestelde vragen",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Aan de slag",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Ondersteuning",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Helpcentrum",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configureren",
|
||||
"integrations.connect": "Verbinden",
|
||||
"integrations.connected": "Verbonden",
|
||||
"integrations.disconnect": "Verbreken",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Niet verbonden",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integraties",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Taal gewijzigd naar {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Taal",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "Over ons",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin-acties",
|
||||
"nav.admin_menu": "Admin-menu",
|
||||
"nav.api_docs": "API-documentatie",
|
||||
"nav.backup_restore": "Back-up en herstel",
|
||||
"nav.credentials": "Referenties",
|
||||
"nav.dark_mode": "Donkere modus",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Ontwikkelaarsdocumentatie",
|
||||
"nav.duplicates": "Duplicaten",
|
||||
"nav.file_manager": "Bestandsbeheer",
|
||||
"nav.files": "Bestanden",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Helpcentrum",
|
||||
"nav.integrations": "Integraties",
|
||||
"nav.light_mode": "Lichte modus",
|
||||
"nav.main_navigation": "Hoofdnavigatie",
|
||||
"nav.notifications": "Meldingen",
|
||||
"nav.open_main_menu": "Hoofdmenu openen",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Planontwerper",
|
||||
"nav.pricing": "Prijzen",
|
||||
"nav.queue_monitor": "Wachtrijmonitor",
|
||||
"nav.scheduled_jobs": "Geplande taken",
|
||||
"nav.search": "Zoeken",
|
||||
"nav.settings": "Instellingen",
|
||||
"nav.similarity": "Gelijkenis",
|
||||
"nav.skip_to_content": "Ga naar hoofdinhoud",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Donkere modus schakelen",
|
||||
"nav.toggle_nav": "Navigatiemenu schakelen",
|
||||
"nav.upload": "Uploaden",
|
||||
"nav.users": "Gebruikers",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Alles als gelezen markeren",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Markeren als gelezen",
|
||||
"notifications.no_notifications": "Geen meldingen",
|
||||
"notifications.unread_count": "{count} ongelezen meldingen"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Meldingen",
|
||||
"notifications.unread_count": "{count} ongelezen meldingen",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Pipeline maken",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Pipeline bewerken",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Verwerkingspipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Geen resultaten gevonden",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Zoeken op naam, inhoud, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} resultaten gevonden",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Documenten zoeken",
|
||||
"settings.reset_confirm": "Weet u zeker dat u deze instelling wilt herstellen?",
|
||||
"settings.save_error": "Instelling opslaan mislukt",
|
||||
"settings.save_success": "Instelling succesvol opgeslagen",
|
||||
"settings.title": "Instellingen",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Sleep bestanden hierheen of klik om te bladeren",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload mislukt",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximale bestandsgrootte: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Bestand selecteren",
|
||||
"upload.success": "Bestand succesvol geüpload",
|
||||
"upload.title": "Document uploaden",
|
||||
"upload.uploading": "Uploaden...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Pulpit",
|
||||
"nav.upload": "Prześlij",
|
||||
"nav.files": "Pliki",
|
||||
"nav.search": "Szukaj",
|
||||
"nav.pipelines": "Potoki",
|
||||
"nav.integrations": "Integracje",
|
||||
"nav.help": "Pomoc",
|
||||
"nav.notifications": "Powiadomienia",
|
||||
"nav.pricing": "Cennik",
|
||||
"nav.about": "O nas",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Ustawienia",
|
||||
"nav.users": "Użytkownicy",
|
||||
"nav.plan_designer": "Projektant planów",
|
||||
"nav.credentials": "Poświadczenia",
|
||||
"nav.file_manager": "Menedżer plików",
|
||||
"nav.duplicates": "Duplikaty",
|
||||
"nav.similarity": "Podobieństwo",
|
||||
"nav.queue_monitor": "Monitor kolejki",
|
||||
"nav.scheduled_jobs": "Zaplanowane zadania",
|
||||
"nav.backup_restore": "Kopia zapasowa i przywracanie",
|
||||
"nav.status": "Status",
|
||||
"nav.api_docs": "Dokumentacja API",
|
||||
"nav.developer_docs": "Dokumentacja dla programistów",
|
||||
"nav.dark_mode": "Tryb ciemny",
|
||||
"nav.light_mode": "Tryb jasny",
|
||||
"nav.toggle_dark_mode": "Przełącz tryb ciemny",
|
||||
"nav.toggle_nav": "Przełącz menu nawigacji",
|
||||
"nav.open_main_menu": "Otwórz menu główne",
|
||||
"nav.skip_to_content": "Przejdź do treści głównej",
|
||||
"nav.main_navigation": "Nawigacja główna",
|
||||
"nav.admin_menu": "Menu administratora",
|
||||
"nav.admin_actions": "Akcje administratora",
|
||||
"nav.help_center": "Centrum pomocy",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Zaloguj się",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Wyloguj się",
|
||||
"auth.signup": "Zarejestruj się",
|
||||
"auth.my_account": "Moje konto",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profil",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Prywatność",
|
||||
"footer.imprint": "Impressum",
|
||||
"footer.terms": "Regulamin",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.license": "Licencja",
|
||||
"footer.attributions": "Atrybuty",
|
||||
"footer.version": "Wersja {version}",
|
||||
"footer.navigation": "Nawigacja stopki",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Zarejestruj się",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Akcje",
|
||||
"common.active": "Aktywny",
|
||||
"common.all": "Wszystko",
|
||||
"common.back": "Wstecz",
|
||||
"common.cancel": "Anuluj",
|
||||
"common.close": "Zamknij",
|
||||
"common.completed": "Zakończono",
|
||||
"common.confirm": "Potwierdź",
|
||||
"common.copied": "Skopiowano!",
|
||||
"common.copy": "Kopiuj",
|
||||
"common.created": "Utworzono",
|
||||
"common.date": "Data",
|
||||
"common.delete": "Usuń",
|
||||
"common.description": "Opis",
|
||||
"common.details": "Szczegóły",
|
||||
"common.disabled": "Wyłączony",
|
||||
"common.download": "Pobierz",
|
||||
"common.edit": "Edytuj",
|
||||
"common.enabled": "Włączony",
|
||||
"common.error": "Błąd",
|
||||
"common.failed": "Nieudane",
|
||||
"common.filter": "Filtruj",
|
||||
"common.inactive": "Nieaktywny",
|
||||
"common.info": "Informacja",
|
||||
"common.loading": "Ładowanie...",
|
||||
"common.name": "Nazwa",
|
||||
"common.next": "Dalej",
|
||||
"common.no": "Nie",
|
||||
"common.none": "Brak",
|
||||
"common.pending": "Oczekujące",
|
||||
"common.processing": "Przetwarzanie",
|
||||
"common.refresh": "Odśwież",
|
||||
"common.reset": "Resetuj",
|
||||
"common.retry": "Ponów",
|
||||
"common.save": "Zapisz",
|
||||
"common.search": "Szukaj",
|
||||
"common.select": "Wybierz",
|
||||
"common.size": "Rozmiar",
|
||||
"common.status": "Status",
|
||||
"common.success": "Sukces",
|
||||
"common.type": "Typ",
|
||||
"common.updated": "Zaktualizowano",
|
||||
"common.upload": "Prześlij",
|
||||
"common.view": "Wyświetl",
|
||||
"common.warning": "Ostrzeżenie",
|
||||
"common.yes": "Tak",
|
||||
"cookie.accept": "Rozumiem",
|
||||
"cookie.notice": "DocuElevate używa wyłącznie niezbędnych plików cookie sesji wymaganych do uwierzytelniania i działania usługi. Nie są używane pliki cookie śledzące ani analityczne.",
|
||||
"cookie.notice_label": "Informacja o plikach cookie",
|
||||
"cookie.policy_link": "Polityka plików cookie",
|
||||
"cookie.privacy_link": "Informacja o prywatności",
|
||||
"cookie.accept": "Rozumiem",
|
||||
"cookie.notice_label": "Informacja o plikach cookie",
|
||||
|
||||
"common.save": "Zapisz",
|
||||
"common.cancel": "Anuluj",
|
||||
"common.delete": "Usuń",
|
||||
"common.edit": "Edytuj",
|
||||
"common.close": "Zamknij",
|
||||
"common.confirm": "Potwierdź",
|
||||
"common.back": "Wstecz",
|
||||
"common.next": "Dalej",
|
||||
"common.loading": "Ładowanie...",
|
||||
"common.error": "Błąd",
|
||||
"common.success": "Sukces",
|
||||
"common.warning": "Ostrzeżenie",
|
||||
"common.info": "Informacja",
|
||||
"common.yes": "Tak",
|
||||
"common.no": "Nie",
|
||||
"common.search": "Szukaj",
|
||||
"common.filter": "Filtruj",
|
||||
"common.reset": "Resetuj",
|
||||
"common.refresh": "Odśwież",
|
||||
"common.download": "Pobierz",
|
||||
"common.actions": "Akcje",
|
||||
"common.details": "Szczegóły",
|
||||
"common.name": "Nazwa",
|
||||
"common.description": "Opis",
|
||||
"common.type": "Typ",
|
||||
"common.status": "Status",
|
||||
"common.date": "Data",
|
||||
"common.size": "Rozmiar",
|
||||
"common.created": "Utworzono",
|
||||
"common.updated": "Zaktualizowano",
|
||||
"common.enabled": "Włączony",
|
||||
"common.disabled": "Wyłączony",
|
||||
"common.active": "Aktywny",
|
||||
"common.inactive": "Nieaktywny",
|
||||
"common.all": "Wszystko",
|
||||
"common.none": "Brak",
|
||||
"common.select": "Wybierz",
|
||||
"common.upload": "Prześlij",
|
||||
"common.processing": "Przetwarzanie",
|
||||
"common.completed": "Zakończono",
|
||||
"common.failed": "Nieudane",
|
||||
"common.pending": "Oczekujące",
|
||||
"common.retry": "Ponów",
|
||||
"common.view": "Wyświetl",
|
||||
"common.copy": "Kopiuj",
|
||||
"common.copied": "Skopiowano!",
|
||||
|
||||
"language.selector": "Język",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Język zmieniony na {language}",
|
||||
|
||||
"dashboard.active_integrations": "Aktywne integracje",
|
||||
"dashboard.files_this_month": "Pliki w tym miesiącu",
|
||||
"dashboard.files_today": "Pliki dzisiaj",
|
||||
"dashboard.ocr_processed": "OCR przetworzone",
|
||||
"dashboard.quick_actions": "Szybkie akcje",
|
||||
"dashboard.recent_activity": "Ostatnia aktywność",
|
||||
"dashboard.storage_targets": "Cele przechowywania",
|
||||
"dashboard.title": "Pulpit",
|
||||
"dashboard.total_files": "Pliki ogółem",
|
||||
"dashboard.files_today": "Pliki dzisiaj",
|
||||
"dashboard.files_this_month": "Pliki w tym miesiącu",
|
||||
"dashboard.ocr_processed": "OCR przetworzone",
|
||||
"dashboard.active_integrations": "Aktywne integracje",
|
||||
"dashboard.storage_targets": "Cele przechowywania",
|
||||
"dashboard.recent_activity": "Ostatnia aktywność",
|
||||
"dashboard.quick_actions": "Szybkie akcje",
|
||||
"dashboard.welcome": "Witamy w DocuElevate",
|
||||
|
||||
"upload.title": "Prześlij dokument",
|
||||
"upload.drag_drop": "Przeciągnij pliki tutaj lub kliknij, aby przeglądać",
|
||||
"upload.select_file": "Wybierz plik",
|
||||
"upload.uploading": "Przesyłanie...",
|
||||
"upload.success": "Plik przesłany pomyślnie",
|
||||
"upload.error": "Przesyłanie nie powiodło się",
|
||||
"upload.max_size": "Maksymalny rozmiar pliku: {size}",
|
||||
|
||||
"files.title": "Pliki",
|
||||
"files.no_files": "Nie znaleziono plików",
|
||||
"files.filename": "Nazwa pliku",
|
||||
"files.document_title": "Tytuł dokumentu",
|
||||
"files.uploaded": "Przesłano",
|
||||
"files.file_size": "Rozmiar pliku",
|
||||
"files.ocr_status": "Status OCR",
|
||||
"files.tags": "Tagi",
|
||||
|
||||
"search.title": "Szukaj dokumentów",
|
||||
"search.placeholder": "Szukaj wg nazwy, treści, tagów...",
|
||||
"search.no_results": "Nie znaleziono wyników",
|
||||
"search.results_count": "Znaleziono {count} wyników",
|
||||
|
||||
"settings.title": "Ustawienia",
|
||||
"settings.save_success": "Ustawienie zapisane pomyślnie",
|
||||
"settings.save_error": "Nie udało się zapisać ustawienia",
|
||||
"settings.reset_confirm": "Czy na pewno chcesz zresetować to ustawienie?",
|
||||
|
||||
"integrations.title": "Integracje",
|
||||
"integrations.connect": "Połącz",
|
||||
"integrations.disconnect": "Rozłącz",
|
||||
"integrations.connected": "Połączono",
|
||||
"integrations.not_connected": "Nie połączono",
|
||||
"integrations.configure": "Konfiguruj",
|
||||
|
||||
"pipelines.title": "Potoki przetwarzania",
|
||||
"pipelines.create": "Utwórz potok",
|
||||
"pipelines.edit": "Edytuj potok",
|
||||
|
||||
"help.title": "Centrum pomocy",
|
||||
"help.getting_started": "Pierwsze kroki",
|
||||
"help.faq": "Często zadawane pytania",
|
||||
"help.documentation": "Dokumentacja",
|
||||
"help.support": "Wsparcie",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Zabroniono",
|
||||
"error.forbidden_message": "Nie masz uprawnień do dostępu do tej strony.",
|
||||
"error.not_found": "Nie znaleziono strony",
|
||||
"error.not_found_message": "Szukana strona nie istnieje.",
|
||||
"error.server_error": "Wewnętrzny błąd serwera",
|
||||
"error.server_error_message": "Coś poszło nie tak. Spróbuj ponownie później.",
|
||||
"error.unauthorized": "Brak autoryzacji",
|
||||
"error.unauthorized_message": "Musisz się zalogować, aby uzyskać dostęp do tej strony.",
|
||||
"error.forbidden": "Zabroniono",
|
||||
"error.forbidden_message": "Nie masz uprawnień do dostępu do tej strony.",
|
||||
|
||||
"notifications.title": "Powiadomienia",
|
||||
"notifications.mark_read": "Oznacz jako przeczytane",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Tytuł dokumentu",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Rozmiar pliku",
|
||||
"files.filename": "Nazwa pliku",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Nie znaleziono plików",
|
||||
"files.ocr_status": "Status OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tagi",
|
||||
"files.title": "Pliki",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Przesłano",
|
||||
"footer.attributions": "Atrybuty",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Impressum",
|
||||
"footer.license": "Licencja",
|
||||
"footer.navigation": "Nawigacja stopki",
|
||||
"footer.privacy": "Prywatność",
|
||||
"footer.terms": "Regulamin",
|
||||
"footer.version": "Wersja {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Dokumentacja",
|
||||
"help.faq": "Często zadawane pytania",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Pierwsze kroki",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Wsparcie",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Centrum pomocy",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Konfiguruj",
|
||||
"integrations.connect": "Połącz",
|
||||
"integrations.connected": "Połączono",
|
||||
"integrations.disconnect": "Rozłącz",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Nie połączono",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integracje",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Język zmieniony na {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Język",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "O nas",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Akcje administratora",
|
||||
"nav.admin_menu": "Menu administratora",
|
||||
"nav.api_docs": "Dokumentacja API",
|
||||
"nav.backup_restore": "Kopia zapasowa i przywracanie",
|
||||
"nav.credentials": "Poświadczenia",
|
||||
"nav.dark_mode": "Tryb ciemny",
|
||||
"nav.dashboard": "Pulpit",
|
||||
"nav.developer_docs": "Dokumentacja dla programistów",
|
||||
"nav.duplicates": "Duplikaty",
|
||||
"nav.file_manager": "Menedżer plików",
|
||||
"nav.files": "Pliki",
|
||||
"nav.help": "Pomoc",
|
||||
"nav.help_center": "Centrum pomocy",
|
||||
"nav.integrations": "Integracje",
|
||||
"nav.light_mode": "Tryb jasny",
|
||||
"nav.main_navigation": "Nawigacja główna",
|
||||
"nav.notifications": "Powiadomienia",
|
||||
"nav.open_main_menu": "Otwórz menu główne",
|
||||
"nav.pipelines": "Potoki",
|
||||
"nav.plan_designer": "Projektant planów",
|
||||
"nav.pricing": "Cennik",
|
||||
"nav.queue_monitor": "Monitor kolejki",
|
||||
"nav.scheduled_jobs": "Zaplanowane zadania",
|
||||
"nav.search": "Szukaj",
|
||||
"nav.settings": "Ustawienia",
|
||||
"nav.similarity": "Podobieństwo",
|
||||
"nav.skip_to_content": "Przejdź do treści głównej",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Przełącz tryb ciemny",
|
||||
"nav.toggle_nav": "Przełącz menu nawigacji",
|
||||
"nav.upload": "Prześlij",
|
||||
"nav.users": "Użytkownicy",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Oznacz wszystkie jako przeczytane",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Oznacz jako przeczytane",
|
||||
"notifications.no_notifications": "Brak powiadomień",
|
||||
"notifications.unread_count": "{count} nieprzeczytanych powiadomień"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Powiadomienia",
|
||||
"notifications.unread_count": "{count} nieprzeczytanych powiadomień",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Utwórz potok",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edytuj potok",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Potoki przetwarzania",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Nie znaleziono wyników",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Szukaj wg nazwy, treści, tagów...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "Znaleziono {count} wyników",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Szukaj dokumentów",
|
||||
"settings.reset_confirm": "Czy na pewno chcesz zresetować to ustawienie?",
|
||||
"settings.save_error": "Nie udało się zapisać ustawienia",
|
||||
"settings.save_success": "Ustawienie zapisane pomyślnie",
|
||||
"settings.title": "Ustawienia",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Przeciągnij pliki tutaj lub kliknij, aby przeglądać",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Przesyłanie nie powiodło się",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maksymalny rozmiar pliku: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Wybierz plik",
|
||||
"upload.success": "Plik przesłany pomyślnie",
|
||||
"upload.title": "Prześlij dokument",
|
||||
"upload.uploading": "Przesyłanie...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Painel",
|
||||
"nav.upload": "Carregar",
|
||||
"nav.files": "Ficheiros",
|
||||
"nav.search": "Pesquisar",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.integrations": "Integrações",
|
||||
"nav.help": "Ajuda",
|
||||
"nav.notifications": "Notificações",
|
||||
"nav.pricing": "Preços",
|
||||
"nav.about": "Sobre",
|
||||
"nav.admin": "Admin",
|
||||
"nav.settings": "Definições",
|
||||
"nav.users": "Utilizadores",
|
||||
"nav.plan_designer": "Designer de planos",
|
||||
"nav.credentials": "Credenciais",
|
||||
"nav.file_manager": "Gestor de ficheiros",
|
||||
"nav.duplicates": "Duplicados",
|
||||
"nav.similarity": "Similaridade",
|
||||
"nav.queue_monitor": "Monitor de fila",
|
||||
"nav.scheduled_jobs": "Tarefas agendadas",
|
||||
"nav.backup_restore": "Cópia de segurança e restauro",
|
||||
"nav.status": "Estado",
|
||||
"nav.api_docs": "Documentação API",
|
||||
"nav.developer_docs": "Documentação para programadores",
|
||||
"nav.dark_mode": "Modo escuro",
|
||||
"nav.light_mode": "Modo claro",
|
||||
"nav.toggle_dark_mode": "Alternar modo escuro",
|
||||
"nav.toggle_nav": "Alternar menu de navegação",
|
||||
"nav.open_main_menu": "Abrir menu principal",
|
||||
"nav.skip_to_content": "Ir para o conteúdo principal",
|
||||
"nav.main_navigation": "Navegação principal",
|
||||
"nav.admin_menu": "Menu de administração",
|
||||
"nav.admin_actions": "Ações de administração",
|
||||
"nav.help_center": "Centro de ajuda",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Iniciar sessão",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Terminar sessão",
|
||||
"auth.signup": "Registar",
|
||||
"auth.my_account": "A minha conta",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Perfil",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Privacidade",
|
||||
"footer.imprint": "Aviso legal",
|
||||
"footer.terms": "Termos",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.license": "Licença",
|
||||
"footer.attributions": "Atribuições",
|
||||
"footer.version": "Versão {version}",
|
||||
"footer.navigation": "Navegação do rodapé",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Registar",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Ações",
|
||||
"common.active": "Ativo",
|
||||
"common.all": "Tudo",
|
||||
"common.back": "Voltar",
|
||||
"common.cancel": "Cancelar",
|
||||
"common.close": "Fechar",
|
||||
"common.completed": "Concluído",
|
||||
"common.confirm": "Confirmar",
|
||||
"common.copied": "Copiado!",
|
||||
"common.copy": "Copiar",
|
||||
"common.created": "Criado",
|
||||
"common.date": "Data",
|
||||
"common.delete": "Eliminar",
|
||||
"common.description": "Descrição",
|
||||
"common.details": "Detalhes",
|
||||
"common.disabled": "Desativado",
|
||||
"common.download": "Descarregar",
|
||||
"common.edit": "Editar",
|
||||
"common.enabled": "Ativado",
|
||||
"common.error": "Erro",
|
||||
"common.failed": "Falhado",
|
||||
"common.filter": "Filtrar",
|
||||
"common.inactive": "Inativo",
|
||||
"common.info": "Informação",
|
||||
"common.loading": "A carregar...",
|
||||
"common.name": "Nome",
|
||||
"common.next": "Seguinte",
|
||||
"common.no": "Não",
|
||||
"common.none": "Nenhum",
|
||||
"common.pending": "Pendente",
|
||||
"common.processing": "A processar",
|
||||
"common.refresh": "Atualizar",
|
||||
"common.reset": "Repor",
|
||||
"common.retry": "Tentar novamente",
|
||||
"common.save": "Guardar",
|
||||
"common.search": "Pesquisar",
|
||||
"common.select": "Selecionar",
|
||||
"common.size": "Tamanho",
|
||||
"common.status": "Estado",
|
||||
"common.success": "Sucesso",
|
||||
"common.type": "Tipo",
|
||||
"common.updated": "Atualizado",
|
||||
"common.upload": "Carregar",
|
||||
"common.view": "Ver",
|
||||
"common.warning": "Aviso",
|
||||
"common.yes": "Sim",
|
||||
"cookie.accept": "Entendido",
|
||||
"cookie.notice": "O DocuElevate utiliza apenas cookies de sessão essenciais necessários para a autenticação e o funcionamento do serviço. Não são utilizados cookies de rastreamento ou analíticos.",
|
||||
"cookie.notice_label": "Aviso de cookies",
|
||||
"cookie.policy_link": "Política de cookies",
|
||||
"cookie.privacy_link": "Aviso de privacidade",
|
||||
"cookie.accept": "Entendido",
|
||||
"cookie.notice_label": "Aviso de cookies",
|
||||
|
||||
"common.save": "Guardar",
|
||||
"common.cancel": "Cancelar",
|
||||
"common.delete": "Eliminar",
|
||||
"common.edit": "Editar",
|
||||
"common.close": "Fechar",
|
||||
"common.confirm": "Confirmar",
|
||||
"common.back": "Voltar",
|
||||
"common.next": "Seguinte",
|
||||
"common.loading": "A carregar...",
|
||||
"common.error": "Erro",
|
||||
"common.success": "Sucesso",
|
||||
"common.warning": "Aviso",
|
||||
"common.info": "Informação",
|
||||
"common.yes": "Sim",
|
||||
"common.no": "Não",
|
||||
"common.search": "Pesquisar",
|
||||
"common.filter": "Filtrar",
|
||||
"common.reset": "Repor",
|
||||
"common.refresh": "Atualizar",
|
||||
"common.download": "Descarregar",
|
||||
"common.actions": "Ações",
|
||||
"common.details": "Detalhes",
|
||||
"common.name": "Nome",
|
||||
"common.description": "Descrição",
|
||||
"common.type": "Tipo",
|
||||
"common.status": "Estado",
|
||||
"common.date": "Data",
|
||||
"common.size": "Tamanho",
|
||||
"common.created": "Criado",
|
||||
"common.updated": "Atualizado",
|
||||
"common.enabled": "Ativado",
|
||||
"common.disabled": "Desativado",
|
||||
"common.active": "Ativo",
|
||||
"common.inactive": "Inativo",
|
||||
"common.all": "Tudo",
|
||||
"common.none": "Nenhum",
|
||||
"common.select": "Selecionar",
|
||||
"common.upload": "Carregar",
|
||||
"common.processing": "A processar",
|
||||
"common.completed": "Concluído",
|
||||
"common.failed": "Falhado",
|
||||
"common.pending": "Pendente",
|
||||
"common.retry": "Tentar novamente",
|
||||
"common.view": "Ver",
|
||||
"common.copy": "Copiar",
|
||||
"common.copied": "Copiado!",
|
||||
|
||||
"language.selector": "Idioma",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Idioma alterado para {language}",
|
||||
|
||||
"dashboard.active_integrations": "Integrações ativas",
|
||||
"dashboard.files_this_month": "Ficheiros este mês",
|
||||
"dashboard.files_today": "Ficheiros hoje",
|
||||
"dashboard.ocr_processed": "OCR processados",
|
||||
"dashboard.quick_actions": "Ações rápidas",
|
||||
"dashboard.recent_activity": "Atividade recente",
|
||||
"dashboard.storage_targets": "Destinos de armazenamento",
|
||||
"dashboard.title": "Painel",
|
||||
"dashboard.total_files": "Total de ficheiros",
|
||||
"dashboard.files_today": "Ficheiros hoje",
|
||||
"dashboard.files_this_month": "Ficheiros este mês",
|
||||
"dashboard.ocr_processed": "OCR processados",
|
||||
"dashboard.active_integrations": "Integrações ativas",
|
||||
"dashboard.storage_targets": "Destinos de armazenamento",
|
||||
"dashboard.recent_activity": "Atividade recente",
|
||||
"dashboard.quick_actions": "Ações rápidas",
|
||||
"dashboard.welcome": "Bem-vindo ao DocuElevate",
|
||||
|
||||
"upload.title": "Carregar documento",
|
||||
"upload.drag_drop": "Arraste ficheiros para aqui ou clique para procurar",
|
||||
"upload.select_file": "Selecionar ficheiro",
|
||||
"upload.uploading": "A carregar...",
|
||||
"upload.success": "Ficheiro carregado com sucesso",
|
||||
"upload.error": "Falha ao carregar",
|
||||
"upload.max_size": "Tamanho máximo do ficheiro: {size}",
|
||||
|
||||
"files.title": "Ficheiros",
|
||||
"files.no_files": "Nenhum ficheiro encontrado",
|
||||
"files.filename": "Nome do ficheiro",
|
||||
"files.document_title": "Título do documento",
|
||||
"files.uploaded": "Carregado",
|
||||
"files.file_size": "Tamanho do ficheiro",
|
||||
"files.ocr_status": "Estado OCR",
|
||||
"files.tags": "Etiquetas",
|
||||
|
||||
"search.title": "Pesquisar documentos",
|
||||
"search.placeholder": "Pesquisar por nome, conteúdo, etiquetas...",
|
||||
"search.no_results": "Nenhum resultado encontrado",
|
||||
"search.results_count": "{count} resultados encontrados",
|
||||
|
||||
"settings.title": "Definições",
|
||||
"settings.save_success": "Definição guardada com sucesso",
|
||||
"settings.save_error": "Falha ao guardar definição",
|
||||
"settings.reset_confirm": "Tem a certeza de que pretende repor esta definição?",
|
||||
|
||||
"integrations.title": "Integrações",
|
||||
"integrations.connect": "Ligar",
|
||||
"integrations.disconnect": "Desligar",
|
||||
"integrations.connected": "Ligado",
|
||||
"integrations.not_connected": "Não ligado",
|
||||
"integrations.configure": "Configurar",
|
||||
|
||||
"pipelines.title": "Pipelines de processamento",
|
||||
"pipelines.create": "Criar pipeline",
|
||||
"pipelines.edit": "Editar pipeline",
|
||||
|
||||
"help.title": "Centro de ajuda",
|
||||
"help.getting_started": "Primeiros passos",
|
||||
"help.faq": "Perguntas frequentes",
|
||||
"help.documentation": "Documentação",
|
||||
"help.support": "Suporte",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Proibido",
|
||||
"error.forbidden_message": "Não tem permissão para aceder a esta página.",
|
||||
"error.not_found": "Página não encontrada",
|
||||
"error.not_found_message": "A página que procura não existe.",
|
||||
"error.server_error": "Erro interno do servidor",
|
||||
"error.server_error_message": "Algo correu mal. Tente novamente mais tarde.",
|
||||
"error.unauthorized": "Não autorizado",
|
||||
"error.unauthorized_message": "Precisa de iniciar sessão para aceder a esta página.",
|
||||
"error.forbidden": "Proibido",
|
||||
"error.forbidden_message": "Não tem permissão para aceder a esta página.",
|
||||
|
||||
"notifications.title": "Notificações",
|
||||
"notifications.mark_read": "Marcar como lida",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Título do documento",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Tamanho do ficheiro",
|
||||
"files.filename": "Nome do ficheiro",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Nenhum ficheiro encontrado",
|
||||
"files.ocr_status": "Estado OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Etiquetas",
|
||||
"files.title": "Ficheiros",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Carregado",
|
||||
"footer.attributions": "Atribuições",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Aviso legal",
|
||||
"footer.license": "Licença",
|
||||
"footer.navigation": "Navegação do rodapé",
|
||||
"footer.privacy": "Privacidade",
|
||||
"footer.terms": "Termos",
|
||||
"footer.version": "Versão {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentação",
|
||||
"help.faq": "Perguntas frequentes",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Primeiros passos",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Suporte",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Centro de ajuda",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configurar",
|
||||
"integrations.connect": "Ligar",
|
||||
"integrations.connected": "Ligado",
|
||||
"integrations.disconnect": "Desligar",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Não ligado",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrações",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Idioma alterado para {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Idioma",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "Sobre",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Ações de administração",
|
||||
"nav.admin_menu": "Menu de administração",
|
||||
"nav.api_docs": "Documentação API",
|
||||
"nav.backup_restore": "Cópia de segurança e restauro",
|
||||
"nav.credentials": "Credenciais",
|
||||
"nav.dark_mode": "Modo escuro",
|
||||
"nav.dashboard": "Painel",
|
||||
"nav.developer_docs": "Documentação para programadores",
|
||||
"nav.duplicates": "Duplicados",
|
||||
"nav.file_manager": "Gestor de ficheiros",
|
||||
"nav.files": "Ficheiros",
|
||||
"nav.help": "Ajuda",
|
||||
"nav.help_center": "Centro de ajuda",
|
||||
"nav.integrations": "Integrações",
|
||||
"nav.light_mode": "Modo claro",
|
||||
"nav.main_navigation": "Navegação principal",
|
||||
"nav.notifications": "Notificações",
|
||||
"nav.open_main_menu": "Abrir menu principal",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Designer de planos",
|
||||
"nav.pricing": "Preços",
|
||||
"nav.queue_monitor": "Monitor de fila",
|
||||
"nav.scheduled_jobs": "Tarefas agendadas",
|
||||
"nav.search": "Pesquisar",
|
||||
"nav.settings": "Definições",
|
||||
"nav.similarity": "Similaridade",
|
||||
"nav.skip_to_content": "Ir para o conteúdo principal",
|
||||
"nav.status": "Estado",
|
||||
"nav.toggle_dark_mode": "Alternar modo escuro",
|
||||
"nav.toggle_nav": "Alternar menu de navegação",
|
||||
"nav.upload": "Carregar",
|
||||
"nav.users": "Utilizadores",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Marcar todas como lidas",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Marcar como lida",
|
||||
"notifications.no_notifications": "Sem notificações",
|
||||
"notifications.unread_count": "{count} notificações por ler"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notificações",
|
||||
"notifications.unread_count": "{count} notificações por ler",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Criar pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Editar pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Pipelines de processamento",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Nenhum resultado encontrado",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Pesquisar por nome, conteúdo, etiquetas...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} resultados encontrados",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Pesquisar documentos",
|
||||
"settings.reset_confirm": "Tem a certeza de que pretende repor esta definição?",
|
||||
"settings.save_error": "Falha ao guardar definição",
|
||||
"settings.save_success": "Definição guardada com sucesso",
|
||||
"settings.title": "Definições",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Arraste ficheiros para aqui ou clique para procurar",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Falha ao carregar",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Tamanho máximo do ficheiro: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Selecionar ficheiro",
|
||||
"upload.success": "Ficheiro carregado com sucesso",
|
||||
"upload.title": "Carregar documento",
|
||||
"upload.uploading": "A carregar...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Limba a fost schimbată în {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Română",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "Панель управления",
|
||||
"nav.upload": "Загрузить",
|
||||
"nav.files": "Файлы",
|
||||
"nav.search": "Поиск",
|
||||
"nav.pipelines": "Конвейеры",
|
||||
"nav.integrations": "Интеграции",
|
||||
"nav.help": "Помощь",
|
||||
"nav.notifications": "Уведомления",
|
||||
"nav.pricing": "Цены",
|
||||
"nav.about": "О нас",
|
||||
"nav.admin": "Админ",
|
||||
"nav.settings": "Настройки",
|
||||
"nav.users": "Пользователи",
|
||||
"nav.plan_designer": "Конструктор планов",
|
||||
"nav.credentials": "Учётные данные",
|
||||
"nav.file_manager": "Менеджер файлов",
|
||||
"nav.duplicates": "Дубликаты",
|
||||
"nav.similarity": "Сходство",
|
||||
"nav.queue_monitor": "Монитор очереди",
|
||||
"nav.scheduled_jobs": "Запланированные задачи",
|
||||
"nav.backup_restore": "Резервное копирование и восстановление",
|
||||
"nav.status": "Статус",
|
||||
"nav.api_docs": "Документация API",
|
||||
"nav.developer_docs": "Документация для разработчиков",
|
||||
"nav.dark_mode": "Тёмная тема",
|
||||
"nav.light_mode": "Светлая тема",
|
||||
"nav.toggle_dark_mode": "Переключить тёмную тему",
|
||||
"nav.toggle_nav": "Переключить меню навигации",
|
||||
"nav.open_main_menu": "Открыть главное меню",
|
||||
"nav.skip_to_content": "Перейти к основному содержанию",
|
||||
"nav.main_navigation": "Основная навигация",
|
||||
"nav.admin_menu": "Меню администратора",
|
||||
"nav.admin_actions": "Действия администратора",
|
||||
"nav.help_center": "Центр помощи",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Войти",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Выйти",
|
||||
"auth.signup": "Регистрация",
|
||||
"auth.my_account": "Мой аккаунт",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Профиль",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "Конфиденциальность",
|
||||
"footer.imprint": "Выходные данные",
|
||||
"footer.terms": "Условия",
|
||||
"footer.cookies": "Файлы cookie",
|
||||
"footer.license": "Лицензия",
|
||||
"footer.attributions": "Атрибуции",
|
||||
"footer.version": "Версия {version}",
|
||||
"footer.navigation": "Навигация подвала",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Регистрация",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Действия",
|
||||
"common.active": "Активно",
|
||||
"common.all": "Все",
|
||||
"common.back": "Назад",
|
||||
"common.cancel": "Отмена",
|
||||
"common.close": "Закрыть",
|
||||
"common.completed": "Завершено",
|
||||
"common.confirm": "Подтвердить",
|
||||
"common.copied": "Скопировано!",
|
||||
"common.copy": "Копировать",
|
||||
"common.created": "Создано",
|
||||
"common.date": "Дата",
|
||||
"common.delete": "Удалить",
|
||||
"common.description": "Описание",
|
||||
"common.details": "Подробности",
|
||||
"common.disabled": "Отключено",
|
||||
"common.download": "Скачать",
|
||||
"common.edit": "Редактировать",
|
||||
"common.enabled": "Включено",
|
||||
"common.error": "Ошибка",
|
||||
"common.failed": "Ошибка",
|
||||
"common.filter": "Фильтр",
|
||||
"common.inactive": "Неактивно",
|
||||
"common.info": "Информация",
|
||||
"common.loading": "Загрузка...",
|
||||
"common.name": "Название",
|
||||
"common.next": "Далее",
|
||||
"common.no": "Нет",
|
||||
"common.none": "Нет",
|
||||
"common.pending": "В ожидании",
|
||||
"common.processing": "Обработка",
|
||||
"common.refresh": "Обновить",
|
||||
"common.reset": "Сбросить",
|
||||
"common.retry": "Повторить",
|
||||
"common.save": "Сохранить",
|
||||
"common.search": "Поиск",
|
||||
"common.select": "Выбрать",
|
||||
"common.size": "Размер",
|
||||
"common.status": "Статус",
|
||||
"common.success": "Успешно",
|
||||
"common.type": "Тип",
|
||||
"common.updated": "Обновлено",
|
||||
"common.upload": "Загрузить",
|
||||
"common.view": "Просмотр",
|
||||
"common.warning": "Предупреждение",
|
||||
"common.yes": "Да",
|
||||
"cookie.accept": "Понятно",
|
||||
"cookie.notice": "DocuElevate использует только необходимые сессионные файлы cookie для аутентификации и работы сервиса. Файлы cookie для отслеживания и аналитики не используются.",
|
||||
"cookie.notice_label": "Уведомление о файлах cookie",
|
||||
"cookie.policy_link": "Политика файлов cookie",
|
||||
"cookie.privacy_link": "Уведомление о конфиденциальности",
|
||||
"cookie.accept": "Понятно",
|
||||
"cookie.notice_label": "Уведомление о файлах cookie",
|
||||
|
||||
"common.save": "Сохранить",
|
||||
"common.cancel": "Отмена",
|
||||
"common.delete": "Удалить",
|
||||
"common.edit": "Редактировать",
|
||||
"common.close": "Закрыть",
|
||||
"common.confirm": "Подтвердить",
|
||||
"common.back": "Назад",
|
||||
"common.next": "Далее",
|
||||
"common.loading": "Загрузка...",
|
||||
"common.error": "Ошибка",
|
||||
"common.success": "Успешно",
|
||||
"common.warning": "Предупреждение",
|
||||
"common.info": "Информация",
|
||||
"common.yes": "Да",
|
||||
"common.no": "Нет",
|
||||
"common.search": "Поиск",
|
||||
"common.filter": "Фильтр",
|
||||
"common.reset": "Сбросить",
|
||||
"common.refresh": "Обновить",
|
||||
"common.download": "Скачать",
|
||||
"common.actions": "Действия",
|
||||
"common.details": "Подробности",
|
||||
"common.name": "Название",
|
||||
"common.description": "Описание",
|
||||
"common.type": "Тип",
|
||||
"common.status": "Статус",
|
||||
"common.date": "Дата",
|
||||
"common.size": "Размер",
|
||||
"common.created": "Создано",
|
||||
"common.updated": "Обновлено",
|
||||
"common.enabled": "Включено",
|
||||
"common.disabled": "Отключено",
|
||||
"common.active": "Активно",
|
||||
"common.inactive": "Неактивно",
|
||||
"common.all": "Все",
|
||||
"common.none": "Нет",
|
||||
"common.select": "Выбрать",
|
||||
"common.upload": "Загрузить",
|
||||
"common.processing": "Обработка",
|
||||
"common.completed": "Завершено",
|
||||
"common.failed": "Ошибка",
|
||||
"common.pending": "В ожидании",
|
||||
"common.retry": "Повторить",
|
||||
"common.view": "Просмотр",
|
||||
"common.copy": "Копировать",
|
||||
"common.copied": "Скопировано!",
|
||||
|
||||
"language.selector": "Язык",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "Язык изменён на {language}",
|
||||
|
||||
"dashboard.active_integrations": "Активные интеграции",
|
||||
"dashboard.files_this_month": "Файлы за месяц",
|
||||
"dashboard.files_today": "Файлы сегодня",
|
||||
"dashboard.ocr_processed": "OCR обработано",
|
||||
"dashboard.quick_actions": "Быстрые действия",
|
||||
"dashboard.recent_activity": "Последняя активность",
|
||||
"dashboard.storage_targets": "Хранилища",
|
||||
"dashboard.title": "Панель управления",
|
||||
"dashboard.total_files": "Всего файлов",
|
||||
"dashboard.files_today": "Файлы сегодня",
|
||||
"dashboard.files_this_month": "Файлы за месяц",
|
||||
"dashboard.ocr_processed": "OCR обработано",
|
||||
"dashboard.active_integrations": "Активные интеграции",
|
||||
"dashboard.storage_targets": "Хранилища",
|
||||
"dashboard.recent_activity": "Последняя активность",
|
||||
"dashboard.quick_actions": "Быстрые действия",
|
||||
"dashboard.welcome": "Добро пожаловать в DocuElevate",
|
||||
|
||||
"upload.title": "Загрузить документ",
|
||||
"upload.drag_drop": "Перетащите файлы сюда или нажмите для выбора",
|
||||
"upload.select_file": "Выбрать файл",
|
||||
"upload.uploading": "Загрузка...",
|
||||
"upload.success": "Файл успешно загружен",
|
||||
"upload.error": "Ошибка загрузки",
|
||||
"upload.max_size": "Максимальный размер файла: {size}",
|
||||
|
||||
"files.title": "Файлы",
|
||||
"files.no_files": "Файлы не найдены",
|
||||
"files.filename": "Имя файла",
|
||||
"files.document_title": "Название документа",
|
||||
"files.uploaded": "Загружено",
|
||||
"files.file_size": "Размер файла",
|
||||
"files.ocr_status": "Статус OCR",
|
||||
"files.tags": "Теги",
|
||||
|
||||
"search.title": "Поиск документов",
|
||||
"search.placeholder": "Поиск по имени, содержимому, тегам...",
|
||||
"search.no_results": "Результаты не найдены",
|
||||
"search.results_count": "Найдено результатов: {count}",
|
||||
|
||||
"settings.title": "Настройки",
|
||||
"settings.save_success": "Настройка сохранена",
|
||||
"settings.save_error": "Не удалось сохранить настройку",
|
||||
"settings.reset_confirm": "Вы уверены, что хотите сбросить эту настройку?",
|
||||
|
||||
"integrations.title": "Интеграции",
|
||||
"integrations.connect": "Подключить",
|
||||
"integrations.disconnect": "Отключить",
|
||||
"integrations.connected": "Подключено",
|
||||
"integrations.not_connected": "Не подключено",
|
||||
"integrations.configure": "Настроить",
|
||||
|
||||
"pipelines.title": "Конвейеры обработки",
|
||||
"pipelines.create": "Создать конвейер",
|
||||
"pipelines.edit": "Редактировать конвейер",
|
||||
|
||||
"help.title": "Центр помощи",
|
||||
"help.getting_started": "Начало работы",
|
||||
"help.faq": "Часто задаваемые вопросы",
|
||||
"help.documentation": "Документация",
|
||||
"help.support": "Поддержка",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Доступ запрещён",
|
||||
"error.forbidden_message": "У вас нет прав для доступа к этой странице.",
|
||||
"error.not_found": "Страница не найдена",
|
||||
"error.not_found_message": "Запрашиваемая страница не существует.",
|
||||
"error.server_error": "Внутренняя ошибка сервера",
|
||||
"error.server_error_message": "Что-то пошло не так. Пожалуйста, попробуйте позже.",
|
||||
"error.unauthorized": "Не авторизован",
|
||||
"error.unauthorized_message": "Для доступа к этой странице необходимо войти в систему.",
|
||||
"error.forbidden": "Доступ запрещён",
|
||||
"error.forbidden_message": "У вас нет прав для доступа к этой странице.",
|
||||
|
||||
"notifications.title": "Уведомления",
|
||||
"notifications.mark_read": "Отметить как прочитанное",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Название документа",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "Размер файла",
|
||||
"files.filename": "Имя файла",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "Файлы не найдены",
|
||||
"files.ocr_status": "Статус OCR",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Теги",
|
||||
"files.title": "Файлы",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Загружено",
|
||||
"footer.attributions": "Атрибуции",
|
||||
"footer.cookies": "Файлы cookie",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Выходные данные",
|
||||
"footer.license": "Лицензия",
|
||||
"footer.navigation": "Навигация подвала",
|
||||
"footer.privacy": "Конфиденциальность",
|
||||
"footer.terms": "Условия",
|
||||
"footer.version": "Версия {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Документация",
|
||||
"help.faq": "Часто задаваемые вопросы",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Начало работы",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Поддержка",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Центр помощи",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Настроить",
|
||||
"integrations.connect": "Подключить",
|
||||
"integrations.connected": "Подключено",
|
||||
"integrations.disconnect": "Отключить",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Не подключено",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Интеграции",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Язык изменён на {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Язык",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "О нас",
|
||||
"nav.admin": "Админ",
|
||||
"nav.admin_actions": "Действия администратора",
|
||||
"nav.admin_menu": "Меню администратора",
|
||||
"nav.api_docs": "Документация API",
|
||||
"nav.backup_restore": "Резервное копирование и восстановление",
|
||||
"nav.credentials": "Учётные данные",
|
||||
"nav.dark_mode": "Тёмная тема",
|
||||
"nav.dashboard": "Панель управления",
|
||||
"nav.developer_docs": "Документация для разработчиков",
|
||||
"nav.duplicates": "Дубликаты",
|
||||
"nav.file_manager": "Менеджер файлов",
|
||||
"nav.files": "Файлы",
|
||||
"nav.help": "Помощь",
|
||||
"nav.help_center": "Центр помощи",
|
||||
"nav.integrations": "Интеграции",
|
||||
"nav.light_mode": "Светлая тема",
|
||||
"nav.main_navigation": "Основная навигация",
|
||||
"nav.notifications": "Уведомления",
|
||||
"nav.open_main_menu": "Открыть главное меню",
|
||||
"nav.pipelines": "Конвейеры",
|
||||
"nav.plan_designer": "Конструктор планов",
|
||||
"nav.pricing": "Цены",
|
||||
"nav.queue_monitor": "Монитор очереди",
|
||||
"nav.scheduled_jobs": "Запланированные задачи",
|
||||
"nav.search": "Поиск",
|
||||
"nav.settings": "Настройки",
|
||||
"nav.similarity": "Сходство",
|
||||
"nav.skip_to_content": "Перейти к основному содержанию",
|
||||
"nav.status": "Статус",
|
||||
"nav.toggle_dark_mode": "Переключить тёмную тему",
|
||||
"nav.toggle_nav": "Переключить меню навигации",
|
||||
"nav.upload": "Загрузить",
|
||||
"nav.users": "Пользователи",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Отметить все как прочитанные",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Отметить как прочитанное",
|
||||
"notifications.no_notifications": "Нет уведомлений",
|
||||
"notifications.unread_count": "{count} непрочитанных уведомлений"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Уведомления",
|
||||
"notifications.unread_count": "{count} непрочитанных уведомлений",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Создать конвейер",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Редактировать конвейер",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Конвейеры обработки",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "Результаты не найдены",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Поиск по имени, содержимому, тегам...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "Найдено результатов: {count}",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Поиск документов",
|
||||
"settings.reset_confirm": "Вы уверены, что хотите сбросить эту настройку?",
|
||||
"settings.save_error": "Не удалось сохранить настройку",
|
||||
"settings.save_success": "Настройка сохранена",
|
||||
"settings.title": "Настройки",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Перетащите файлы сюда или нажмите для выбора",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Ошибка загрузки",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Максимальный размер файла: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Выбрать файл",
|
||||
"upload.success": "Файл успешно загружен",
|
||||
"upload.title": "Загрузить документ",
|
||||
"upload.uploading": "Загрузка...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Jazyk bol zmenený na {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Slovenčina",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Jezik je bil spremenjen na {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Slovenščina",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Språket ändrades till {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Svenska",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Dil {language} olarak değiştirildi",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Türkçe",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
@@ -0,0 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "Log In",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "Log Out",
|
||||
"auth.my_account": "My Account",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "Profile",
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "Sign Up",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "Actions",
|
||||
"common.active": "Active",
|
||||
"common.all": "All",
|
||||
"common.back": "Back",
|
||||
"common.cancel": "Cancel",
|
||||
"common.close": "Close",
|
||||
"common.completed": "Completed",
|
||||
"common.confirm": "Confirm",
|
||||
"common.copied": "Copied!",
|
||||
"common.copy": "Copy",
|
||||
"common.created": "Created",
|
||||
"common.date": "Date",
|
||||
"common.delete": "Delete",
|
||||
"common.description": "Description",
|
||||
"common.details": "Details",
|
||||
"common.disabled": "Disabled",
|
||||
"common.download": "Download",
|
||||
"common.edit": "Edit",
|
||||
"common.enabled": "Enabled",
|
||||
"common.error": "Error",
|
||||
"common.failed": "Failed",
|
||||
"common.filter": "Filter",
|
||||
"common.inactive": "Inactive",
|
||||
"common.info": "Info",
|
||||
"common.loading": "Loading...",
|
||||
"common.name": "Name",
|
||||
"common.next": "Next",
|
||||
"common.no": "No",
|
||||
"common.none": "None",
|
||||
"common.pending": "Pending",
|
||||
"common.processing": "Processing",
|
||||
"common.refresh": "Refresh",
|
||||
"common.reset": "Reset",
|
||||
"common.retry": "Retry",
|
||||
"common.save": "Save",
|
||||
"common.search": "Search",
|
||||
"common.select": "Select",
|
||||
"common.size": "Size",
|
||||
"common.status": "Status",
|
||||
"common.success": "Success",
|
||||
"common.type": "Type",
|
||||
"common.updated": "Updated",
|
||||
"common.upload": "Upload",
|
||||
"common.view": "View",
|
||||
"common.warning": "Warning",
|
||||
"common.yes": "Yes",
|
||||
"cookie.accept": "Got it",
|
||||
"cookie.notice": "DocuElevate uses only essential session cookies required for authentication and service operation. No tracking or analytics cookies are used.",
|
||||
"cookie.notice_label": "Cookie notice",
|
||||
"cookie.policy_link": "Cookie Policy",
|
||||
"cookie.privacy_link": "Privacy Notice",
|
||||
"dashboard.active_integrations": "Active Integrations",
|
||||
"dashboard.files_this_month": "Files This Month",
|
||||
"dashboard.files_today": "Files Today",
|
||||
"dashboard.ocr_processed": "OCR Processed",
|
||||
"dashboard.quick_actions": "Quick Actions",
|
||||
"dashboard.recent_activity": "Recent Activity",
|
||||
"dashboard.storage_targets": "Storage Targets",
|
||||
"dashboard.title": "Dashboard",
|
||||
"dashboard.total_files": "Total Files",
|
||||
"dashboard.welcome": "Welcome to DocuElevate",
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "Forbidden",
|
||||
"error.forbidden_message": "You do not have permission to access this page.",
|
||||
"error.not_found": "Page not found",
|
||||
"error.not_found_message": "The page you are looking for does not exist.",
|
||||
"error.server_error": "Internal Server Error",
|
||||
"error.server_error_message": "Something went wrong. Please try again later.",
|
||||
"error.unauthorized": "Unauthorized",
|
||||
"error.unauthorized_message": "You need to log in to access this page.",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "Document Title",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "File Size",
|
||||
"files.filename": "Filename",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "No files found",
|
||||
"files.ocr_status": "OCR Status",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "Tags",
|
||||
"files.title": "Files",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "Uploaded",
|
||||
"footer.attributions": "Attributions",
|
||||
"footer.cookies": "Cookies",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "Imprint",
|
||||
"footer.license": "License",
|
||||
"footer.navigation": "Footer navigation",
|
||||
"footer.privacy": "Privacy",
|
||||
"footer.terms": "Terms",
|
||||
"footer.version": "Version {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "Documentation",
|
||||
"help.faq": "Frequently Asked Questions",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "Getting Started",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "Support",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "Help Center",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "Configure",
|
||||
"integrations.connect": "Connect",
|
||||
"integrations.connected": "Connected",
|
||||
"integrations.disconnect": "Disconnect",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "Not Connected",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "Integrations",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "Мову змінено на {language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "Українська",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "About",
|
||||
"nav.admin": "Admin",
|
||||
"nav.admin_actions": "Admin actions",
|
||||
"nav.admin_menu": "Admin menu",
|
||||
"nav.api_docs": "API Docs",
|
||||
"nav.backup_restore": "Backup & Restore",
|
||||
"nav.credentials": "Credentials",
|
||||
"nav.dark_mode": "Dark Mode",
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.developer_docs": "Developer Docs",
|
||||
"nav.duplicates": "Duplicates",
|
||||
"nav.file_manager": "File Manager",
|
||||
"nav.files": "Files",
|
||||
"nav.help": "Help",
|
||||
"nav.help_center": "Help Center",
|
||||
"nav.integrations": "Integrations",
|
||||
"nav.light_mode": "Light Mode",
|
||||
"nav.main_navigation": "Main navigation",
|
||||
"nav.notifications": "Notifications",
|
||||
"nav.open_main_menu": "Open main menu",
|
||||
"nav.pipelines": "Pipelines",
|
||||
"nav.plan_designer": "Plan Designer",
|
||||
"nav.pricing": "Pricing",
|
||||
"nav.queue_monitor": "Queue Monitor",
|
||||
"nav.scheduled_jobs": "Scheduled Jobs",
|
||||
"nav.search": "Search",
|
||||
"nav.settings": "Settings",
|
||||
"nav.similarity": "Similarity",
|
||||
"nav.skip_to_content": "Skip to main content",
|
||||
"nav.status": "Status",
|
||||
"nav.toggle_dark_mode": "Toggle dark mode",
|
||||
"nav.toggle_nav": "Toggle navigation menu",
|
||||
"nav.upload": "Upload",
|
||||
"nav.users": "Users",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "Mark All as Read",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "Mark as Read",
|
||||
"notifications.no_notifications": "No notifications",
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "Notifications",
|
||||
"notifications.unread_count": "{count} unread notifications",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "Create Pipeline",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "Edit Pipeline",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "Processing Pipelines",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "No results found",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "Search by filename, content, tags...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "{count} results found",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "Search Documents",
|
||||
"settings.reset_confirm": "Are you sure you want to reset this setting?",
|
||||
"settings.save_error": "Failed to save setting",
|
||||
"settings.save_success": "Setting saved successfully",
|
||||
"settings.title": "Settings",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "Drag & drop files here or click to browse",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "Upload failed",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "Maximum file size: {size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "Select File",
|
||||
"upload.success": "File uploaded successfully",
|
||||
"upload.title": "Upload Document",
|
||||
"upload.uploading": "Uploading...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
+464
-169
@@ -1,190 +1,485 @@
|
||||
{
|
||||
"app.name": "DocuElevate",
|
||||
|
||||
"nav.dashboard": "仪表盘",
|
||||
"nav.upload": "上传",
|
||||
"nav.files": "文件",
|
||||
"nav.search": "搜索",
|
||||
"nav.pipelines": "处理流程",
|
||||
"nav.integrations": "集成",
|
||||
"nav.help": "帮助",
|
||||
"nav.notifications": "通知",
|
||||
"nav.pricing": "价格",
|
||||
"nav.about": "关于",
|
||||
"nav.admin": "管理",
|
||||
"nav.settings": "设置",
|
||||
"nav.users": "用户",
|
||||
"nav.plan_designer": "方案设计",
|
||||
"nav.credentials": "凭据",
|
||||
"nav.file_manager": "文件管理器",
|
||||
"nav.duplicates": "重复文件",
|
||||
"nav.similarity": "相似度",
|
||||
"nav.queue_monitor": "队列监控",
|
||||
"nav.scheduled_jobs": "计划任务",
|
||||
"nav.backup_restore": "备份与恢复",
|
||||
"nav.status": "状态",
|
||||
"nav.api_docs": "API 文档",
|
||||
"nav.developer_docs": "开发者文档",
|
||||
"nav.dark_mode": "深色模式",
|
||||
"nav.light_mode": "浅色模式",
|
||||
"nav.toggle_dark_mode": "切换深色模式",
|
||||
"nav.toggle_nav": "切换导航菜单",
|
||||
"nav.open_main_menu": "打开主菜单",
|
||||
"nav.skip_to_content": "跳至主要内容",
|
||||
"nav.main_navigation": "主导航",
|
||||
"nav.admin_menu": "管理菜单",
|
||||
"nav.admin_actions": "管理操作",
|
||||
"nav.help_center": "帮助中心",
|
||||
|
||||
"auth.confirm_password": "Confirm Password",
|
||||
"auth.display_name_label": "Display Name",
|
||||
"auth.email_label": "Email",
|
||||
"auth.forgot_password": "Forgot Password?",
|
||||
"auth.login": "登录",
|
||||
"auth.login_title": "Log In",
|
||||
"auth.logout": "退出",
|
||||
"auth.signup": "注册",
|
||||
"auth.my_account": "我的账户",
|
||||
"auth.password_label": "Password",
|
||||
"auth.profile": "个人资料",
|
||||
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.privacy": "隐私",
|
||||
"footer.imprint": "法律声明",
|
||||
"footer.terms": "条款",
|
||||
"footer.cookies": "Cookie",
|
||||
"footer.license": "许可",
|
||||
"footer.attributions": "致谢",
|
||||
"footer.version": "版本 {version}",
|
||||
"footer.navigation": "页脚导航",
|
||||
|
||||
"auth.remember_me": "Remember me",
|
||||
"auth.signup": "注册",
|
||||
"auth.signup_title": "Sign Up",
|
||||
"auth.username_label": "Username",
|
||||
"common.actions": "操作",
|
||||
"common.active": "活跃",
|
||||
"common.all": "全部",
|
||||
"common.back": "返回",
|
||||
"common.cancel": "取消",
|
||||
"common.close": "关闭",
|
||||
"common.completed": "已完成",
|
||||
"common.confirm": "确认",
|
||||
"common.copied": "已复制!",
|
||||
"common.copy": "复制",
|
||||
"common.created": "创建时间",
|
||||
"common.date": "日期",
|
||||
"common.delete": "删除",
|
||||
"common.description": "描述",
|
||||
"common.details": "详情",
|
||||
"common.disabled": "已禁用",
|
||||
"common.download": "下载",
|
||||
"common.edit": "编辑",
|
||||
"common.enabled": "已启用",
|
||||
"common.error": "错误",
|
||||
"common.failed": "失败",
|
||||
"common.filter": "筛选",
|
||||
"common.inactive": "不活跃",
|
||||
"common.info": "信息",
|
||||
"common.loading": "加载中...",
|
||||
"common.name": "名称",
|
||||
"common.next": "下一步",
|
||||
"common.no": "否",
|
||||
"common.none": "无",
|
||||
"common.pending": "待处理",
|
||||
"common.processing": "处理中",
|
||||
"common.refresh": "刷新",
|
||||
"common.reset": "重置",
|
||||
"common.retry": "重试",
|
||||
"common.save": "保存",
|
||||
"common.search": "搜索",
|
||||
"common.select": "选择",
|
||||
"common.size": "大小",
|
||||
"common.status": "状态",
|
||||
"common.success": "成功",
|
||||
"common.type": "类型",
|
||||
"common.updated": "更新时间",
|
||||
"common.upload": "上传",
|
||||
"common.view": "查看",
|
||||
"common.warning": "警告",
|
||||
"common.yes": "是",
|
||||
"cookie.accept": "我知道了",
|
||||
"cookie.notice": "DocuElevate 仅使用身份验证和服务运行所需的基本会话 Cookie。不使用任何跟踪或分析 Cookie。",
|
||||
"cookie.notice_label": "Cookie 通知",
|
||||
"cookie.policy_link": "Cookie 政策",
|
||||
"cookie.privacy_link": "隐私声明",
|
||||
"cookie.accept": "我知道了",
|
||||
"cookie.notice_label": "Cookie 通知",
|
||||
|
||||
"common.save": "保存",
|
||||
"common.cancel": "取消",
|
||||
"common.delete": "删除",
|
||||
"common.edit": "编辑",
|
||||
"common.close": "关闭",
|
||||
"common.confirm": "确认",
|
||||
"common.back": "返回",
|
||||
"common.next": "下一步",
|
||||
"common.loading": "加载中...",
|
||||
"common.error": "错误",
|
||||
"common.success": "成功",
|
||||
"common.warning": "警告",
|
||||
"common.info": "信息",
|
||||
"common.yes": "是",
|
||||
"common.no": "否",
|
||||
"common.search": "搜索",
|
||||
"common.filter": "筛选",
|
||||
"common.reset": "重置",
|
||||
"common.refresh": "刷新",
|
||||
"common.download": "下载",
|
||||
"common.actions": "操作",
|
||||
"common.details": "详情",
|
||||
"common.name": "名称",
|
||||
"common.description": "描述",
|
||||
"common.type": "类型",
|
||||
"common.status": "状态",
|
||||
"common.date": "日期",
|
||||
"common.size": "大小",
|
||||
"common.created": "创建时间",
|
||||
"common.updated": "更新时间",
|
||||
"common.enabled": "已启用",
|
||||
"common.disabled": "已禁用",
|
||||
"common.active": "活跃",
|
||||
"common.inactive": "不活跃",
|
||||
"common.all": "全部",
|
||||
"common.none": "无",
|
||||
"common.select": "选择",
|
||||
"common.upload": "上传",
|
||||
"common.processing": "处理中",
|
||||
"common.completed": "已完成",
|
||||
"common.failed": "失败",
|
||||
"common.pending": "待处理",
|
||||
"common.retry": "重试",
|
||||
"common.view": "查看",
|
||||
"common.copy": "复制",
|
||||
"common.copied": "已复制!",
|
||||
|
||||
"language.selector": "语言",
|
||||
"language.en": "English",
|
||||
"language.de": "Deutsch",
|
||||
"language.fr": "Français",
|
||||
"language.es": "Español",
|
||||
"language.it": "Italiano",
|
||||
"language.pt": "Português",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.zh": "中文",
|
||||
"language.ru": "Русский",
|
||||
"language.changed": "语言已更改为{language}",
|
||||
|
||||
"dashboard.active_integrations": "活跃集成",
|
||||
"dashboard.files_this_month": "本月文件",
|
||||
"dashboard.files_today": "今日文件",
|
||||
"dashboard.ocr_processed": "OCR 已处理",
|
||||
"dashboard.quick_actions": "快捷操作",
|
||||
"dashboard.recent_activity": "最近活动",
|
||||
"dashboard.storage_targets": "存储目标",
|
||||
"dashboard.title": "仪表盘",
|
||||
"dashboard.total_files": "文件总数",
|
||||
"dashboard.files_today": "今日文件",
|
||||
"dashboard.files_this_month": "本月文件",
|
||||
"dashboard.ocr_processed": "OCR 已处理",
|
||||
"dashboard.active_integrations": "活跃集成",
|
||||
"dashboard.storage_targets": "存储目标",
|
||||
"dashboard.recent_activity": "最近活动",
|
||||
"dashboard.quick_actions": "快捷操作",
|
||||
"dashboard.welcome": "欢迎使用 DocuElevate",
|
||||
|
||||
"upload.title": "上传文档",
|
||||
"upload.drag_drop": "将文件拖放到此处或点击浏览",
|
||||
"upload.select_file": "选择文件",
|
||||
"upload.uploading": "上传中...",
|
||||
"upload.success": "文件上传成功",
|
||||
"upload.error": "上传失败",
|
||||
"upload.max_size": "最大文件大小:{size}",
|
||||
|
||||
"files.title": "文件",
|
||||
"files.no_files": "未找到文件",
|
||||
"files.filename": "文件名",
|
||||
"files.document_title": "文档标题",
|
||||
"files.uploaded": "已上传",
|
||||
"files.file_size": "文件大小",
|
||||
"files.ocr_status": "OCR 状态",
|
||||
"files.tags": "标签",
|
||||
|
||||
"search.title": "搜索文档",
|
||||
"search.placeholder": "按文件名、内容、标签搜索...",
|
||||
"search.no_results": "未找到结果",
|
||||
"search.results_count": "找到 {count} 个结果",
|
||||
|
||||
"settings.title": "设置",
|
||||
"settings.save_success": "设置保存成功",
|
||||
"settings.save_error": "设置保存失败",
|
||||
"settings.reset_confirm": "确定要重置此设置吗?",
|
||||
|
||||
"integrations.title": "集成",
|
||||
"integrations.connect": "连接",
|
||||
"integrations.disconnect": "断开",
|
||||
"integrations.connected": "已连接",
|
||||
"integrations.not_connected": "未连接",
|
||||
"integrations.configure": "配置",
|
||||
|
||||
"pipelines.title": "处理流程",
|
||||
"pipelines.create": "创建流程",
|
||||
"pipelines.edit": "编辑流程",
|
||||
|
||||
"help.title": "帮助中心",
|
||||
"help.getting_started": "入门指南",
|
||||
"help.faq": "常见问题",
|
||||
"help.documentation": "文档",
|
||||
"help.support": "支持",
|
||||
|
||||
"error.404_code": "404",
|
||||
"error.404_heading": "Oops, we couldn’t find that page!",
|
||||
"error.404_home": "Return Home",
|
||||
"error.404_message": "It seems DocuElevate has misplaced the document you were looking for. Don’t worry – we’ve got your back.",
|
||||
"error.500_code": "500",
|
||||
"error.500_description": "Our servers encountered a mishap and need a moment.",
|
||||
"error.500_heading": "Oops! Something Went Wrong.",
|
||||
"error.500_home": "Go Home",
|
||||
"error.forbidden": "禁止访问",
|
||||
"error.forbidden_message": "您没有权限访问此页面。",
|
||||
"error.not_found": "页面未找到",
|
||||
"error.not_found_message": "您要查找的页面不存在。",
|
||||
"error.server_error": "服务器内部错误",
|
||||
"error.server_error_message": "出了点问题,请稍后再试。",
|
||||
"error.unauthorized": "未授权",
|
||||
"error.unauthorized_message": "您需要登录才能访问此页面。",
|
||||
"error.forbidden": "禁止访问",
|
||||
"error.forbidden_message": "您没有权限访问此页面。",
|
||||
|
||||
"notifications.title": "通知",
|
||||
"notifications.mark_read": "标记为已读",
|
||||
"files.action_delete": "Delete file",
|
||||
"files.action_details": "View details",
|
||||
"files.action_preview": "Quick preview",
|
||||
"files.bulk_clear_selection": "Clear Selection",
|
||||
"files.bulk_cloud_ocr": "Re-run Cloud OCR",
|
||||
"files.bulk_delete": "Delete Selected",
|
||||
"files.bulk_download": "Download as ZIP",
|
||||
"files.bulk_reprocess": "Reprocess Selected",
|
||||
"files.delete_modal_cancel": "Cancel",
|
||||
"files.delete_modal_confirm": "Delete",
|
||||
"files.delete_modal_message": "Are you sure you want to delete this file?",
|
||||
"files.delete_modal_title": "Confirm Deletion",
|
||||
"files.document_title": "文档标题",
|
||||
"files.drop_overlay_hint": "Supports PDF, Office docs, images, HTML, Markdown, and more",
|
||||
"files.drop_overlay_title": "Drop files or folders anywhere to upload",
|
||||
"files.file_size": "文件大小",
|
||||
"files.filename": "文件名",
|
||||
"files.filter_all_providers": "All Providers",
|
||||
"files.filter_all_statuses": "All Statuses",
|
||||
"files.filter_all_types": "All Types",
|
||||
"files.filter_apply": "Apply Filters",
|
||||
"files.filter_clear": "Clear",
|
||||
"files.filter_date_from": "Date From",
|
||||
"files.filter_date_to": "Date To",
|
||||
"files.filter_mime_type": "MIME Type",
|
||||
"files.filter_ocr_all": "All Files",
|
||||
"files.filter_ocr_good": "Good quality",
|
||||
"files.filter_ocr_poor": "Poor quality",
|
||||
"files.filter_ocr_quality": "OCR Quality",
|
||||
"files.filter_ocr_unchecked": "Not yet assessed",
|
||||
"files.filter_search_placeholder": "Enter filename...",
|
||||
"files.filter_storage_provider": "Storage Provider",
|
||||
"files.filter_tags_placeholder": "e.g. invoice,amazon",
|
||||
"files.fulltext_search_label": "Full-Text Search",
|
||||
"files.fulltext_search_placeholder": "Search document content, sender, tags, type...",
|
||||
"files.no_files": "未找到文件",
|
||||
"files.ocr_status": "OCR 状态",
|
||||
"files.page_title": "File Records",
|
||||
"files.pagination_first": "First",
|
||||
"files.pagination_last": "Last",
|
||||
"files.pagination_next": "Next",
|
||||
"files.pagination_previous": "Previous",
|
||||
"files.preview_modal_close": "Close preview",
|
||||
"files.preview_modal_title": "Preview",
|
||||
"files.queue_banner_link": "View Queue",
|
||||
"files.saved_searches_empty": "No saved searches yet",
|
||||
"files.saved_searches_error": "Could not load saved searches",
|
||||
"files.saved_searches_label": "Saved Searches",
|
||||
"files.saved_searches_save": "Save Current",
|
||||
"files.search_results_empty": "No results found.",
|
||||
"files.search_results_title": "Search Results",
|
||||
"files.table_actions": "Actions",
|
||||
"files.table_created_at": "Created At",
|
||||
"files.table_empty": "No files found",
|
||||
"files.table_id": "ID",
|
||||
"files.table_mime_type": "MIME Type",
|
||||
"files.table_original_filename": "Original Filename",
|
||||
"files.table_select_all": "Select all files on this page",
|
||||
"files.tags": "标签",
|
||||
"files.title": "文件",
|
||||
"files.upload_modal_header": "Uploading Files",
|
||||
"files.uploaded": "已上传",
|
||||
"footer.attributions": "致谢",
|
||||
"footer.cookies": "Cookie",
|
||||
"footer.copyright": "DocuElevate {year}",
|
||||
"footer.imprint": "法律声明",
|
||||
"footer.license": "许可",
|
||||
"footer.navigation": "页脚导航",
|
||||
"footer.privacy": "隐私",
|
||||
"footer.terms": "条款",
|
||||
"footer.version": "版本 {version}",
|
||||
"help.destinations_dropbox": "Dropbox",
|
||||
"help.destinations_dropbox_desc": "OAuth-linked. Files land in your chosen folder.",
|
||||
"help.destinations_email": "Email Forwarding",
|
||||
"help.destinations_email_desc": "Processed files sent as SMTP attachments.",
|
||||
"help.destinations_google_drive": "Google Drive",
|
||||
"help.destinations_google_drive_desc": "Service account or OAuth. Supports shared drives.",
|
||||
"help.destinations_heading": "Destinations – Where Documents Go",
|
||||
"help.destinations_nextcloud": "Nextcloud / WebDAV",
|
||||
"help.destinations_nextcloud_desc": "Self-hosted cloud storage via WebDAV.",
|
||||
"help.destinations_onedrive": "OneDrive",
|
||||
"help.destinations_onedrive_desc": "Microsoft Graph API integration.",
|
||||
"help.destinations_paperless": "Paperless-ngx",
|
||||
"help.destinations_paperless_desc": "Push documents straight into Paperless for archival.",
|
||||
"help.destinations_s3": "Amazon S3",
|
||||
"help.destinations_s3_desc": "Any S3-compatible bucket (AWS, MinIO, Wasabi).",
|
||||
"help.destinations_sftp": "SFTP / FTP",
|
||||
"help.destinations_sftp_desc": "Secure file transfer to any server.",
|
||||
"help.destinations_webhook": "Webhook",
|
||||
"help.destinations_webhook_desc": "POST metadata to any external endpoint.",
|
||||
"help.documentation": "文档",
|
||||
"help.faq": "常见问题",
|
||||
"help.faq_1_a": "Navigate to the Upload page, drag-and-drop your files or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.faq_1_q": "How do I upload documents?",
|
||||
"help.faq_2_a": "PDF, JPEG, PNG, TIFF, BMP, GIF, DOCX, XLSX, PPTX, ODT, ODS, TXT, RTF, and HTML. Non-PDF files are automatically converted to PDF before processing.",
|
||||
"help.faq_2_q": "Which file formats are supported?",
|
||||
"help.faq_3_a": "Yes. Go to Email Ingestion, add an IMAP account, and DocuElevate will poll for new messages and process attachments automatically.",
|
||||
"help.faq_3_q": "Can I ingest documents from email?",
|
||||
"help.faq_4_a": "Pipelines let you chain processing steps – OCR, AI extraction, format conversion – and route the result to one or more destinations. Create and manage them from the Pipelines page.",
|
||||
"help.faq_4_q": "How do processing pipelines work?",
|
||||
"help.faq_5_a": "DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents longer than necessary. See the Privacy Notice for full details.",
|
||||
"help.faq_5_q": "Is my data secure?",
|
||||
"help.faq_heading": "Frequently Asked Questions",
|
||||
"help.getting_started": "入门指南",
|
||||
"help.heading": "Help Center",
|
||||
"help.page_title": "Help Center",
|
||||
"help.quickstart_heading": "Quick Start",
|
||||
"help.quickstart_storage": "Connect Storage",
|
||||
"help.quickstart_storage_desc": "Head to Settings and link your cloud accounts. Processed documents are automatically routed to every destination you configure.",
|
||||
"help.quickstart_upload": "Upload Documents",
|
||||
"help.quickstart_upload_desc": "Drag & drop files onto the Upload page or click Choose File. DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.",
|
||||
"help.quickstart_workflows": "Automate Workflows",
|
||||
"help.quickstart_workflows_desc": "Create Pipelines to define multi-step processing and routing rules. Combine OCR, AI extraction, format conversion, and delivery in a single flow.",
|
||||
"help.sources_email_ingestion": "Email Ingestion (IMAP)",
|
||||
"help.sources_email_ingestion_desc": "Forward documents to a dedicated mailbox. Under Email Ingestion, add one or more IMAP accounts. DocuElevate polls for new messages and processes attachments automatically.",
|
||||
"help.sources_heading": "Sources – Getting Documents In",
|
||||
"help.sources_rest_api": "REST API",
|
||||
"help.sources_rest_api_desc": "Integrate programmatically by POST-ing files to /api/upload. Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.",
|
||||
"help.sources_scanner": "Scanner & Mobile",
|
||||
"help.sources_scanner_desc": "Point network scanners at DocuElevate's upload endpoint or use any mobile scanning app that supports custom HTTP destinations.",
|
||||
"help.sources_web_upload": "Web Upload",
|
||||
"help.sources_web_upload_desc": "The fastest way to get started. Open the Upload page, drop one or more files, and DocuElevate takes care of the rest. Supported formats include PDF, JPEG, PNG, TIFF, DOCX, XLSX, and more.",
|
||||
"help.subheading": "Everything you need to get the most out of DocuElevate. Browse topics below or search for what you need.",
|
||||
"help.support": "支持",
|
||||
"help.support_admin_message": "Contact your administrator for support information.",
|
||||
"help.support_description": "Can’t find what you’re looking for? Our support team is here to help.",
|
||||
"help.support_heading": "Contact Support",
|
||||
"help.title": "帮助中心",
|
||||
"help.workflows_creating": "Creating a Pipeline",
|
||||
"help.workflows_definition": "A Pipeline is a series of processing steps that run automatically whenever a document is ingested. Each step can transform, enrich, or route the document.",
|
||||
"help.workflows_heading": "Workflows & Pipelines",
|
||||
"help.workflows_step_1": "Convert to PDF",
|
||||
"help.workflows_step_1_create": "Go to Pipelines in the main menu.",
|
||||
"help.workflows_step_2": "OCR – extract text",
|
||||
"help.workflows_step_2_create": "Click New Pipeline and give it a name.",
|
||||
"help.workflows_step_3": "AI metadata extraction",
|
||||
"help.workflows_step_3_create": "Add the processing steps you need.",
|
||||
"help.workflows_step_4": "Deliver to one or more destinations",
|
||||
"help.workflows_step_4_create": "Choose one or more delivery destinations.",
|
||||
"help.workflows_step_5_create": "Save – new documents will be processed through this pipeline automatically.",
|
||||
"help.workflows_typical_steps": "Typical Steps",
|
||||
"help.workflows_what_is": "What is a Pipeline?",
|
||||
"index.badge_intelligent": "Intelligent Document Processing",
|
||||
"index.capabilities_cloud": "Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud",
|
||||
"index.capabilities_ingestion": "Email & URL-based document ingestion",
|
||||
"index.capabilities_ocr": "OCR & metadata extraction with AI",
|
||||
"index.capabilities_paperless": "Paperless-ngx integration for document management",
|
||||
"index.capabilities_title": "Capabilities",
|
||||
"index.capabilities_workflows": "Automated classification & routing workflows",
|
||||
"index.cta_description": "Join teams already automating their document processing with DocuElevate.",
|
||||
"index.cta_heading": "Ready to elevate your document workflow?",
|
||||
"index.cta_pricing": "See pricing",
|
||||
"index.cta_signup": "Create a free account",
|
||||
"index.dashboard_subtitle": "Intelligent document processing & management",
|
||||
"index.feature_ai": "AI Metadata Extraction",
|
||||
"index.feature_ai_desc": "OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.",
|
||||
"index.feature_cloud": "Multi-Cloud Storage",
|
||||
"index.feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.",
|
||||
"index.feature_email": "Email & IMAP Ingestion",
|
||||
"index.feature_email_desc": "Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.",
|
||||
"index.feature_ocr": "OCR & Text Extraction",
|
||||
"index.feature_ocr_desc": "Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.",
|
||||
"index.feature_pipelines": "Custom Pipelines",
|
||||
"index.feature_pipelines_desc": "Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.",
|
||||
"index.feature_search": "Full-Text Search",
|
||||
"index.feature_search_desc": "Instantly find any document by content, metadata, or tags across your entire archive.",
|
||||
"index.feature_section_title": "Everything you need for smart document workflows",
|
||||
"index.getting_started": "Getting Started",
|
||||
"index.getting_started_1": "Configure integrations via System Status",
|
||||
"index.getting_started_2": "Upload your first document",
|
||||
"index.getting_started_3": "Review results in Files",
|
||||
"index.getting_started_learn": "Learn more about DocuElevate",
|
||||
"index.hero_description": "DocuElevate ingests your documents, runs OCR, extracts metadata with AI, and routes files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more — all in one seamless pipeline.",
|
||||
"index.hero_heading": "From upload to insight — automatically.",
|
||||
"index.hero_login": "Log In",
|
||||
"index.hero_pricing": "View Plans & Pricing",
|
||||
"index.hero_signup": "Get Started — it’s free",
|
||||
"index.integrations_active": "Active integrations",
|
||||
"index.integrations_storage": "Storage targets",
|
||||
"index.integrations_title": "Integrations",
|
||||
"index.integrations_view_status": "View system status",
|
||||
"index.page_title_dashboard": "Dashboard",
|
||||
"index.page_title_public": "Intelligent Document Processing",
|
||||
"index.platform_overview": "Platform overview",
|
||||
"index.quick_actions": "Quick Actions",
|
||||
"index.quick_documents": "My Documents",
|
||||
"index.quick_documents_desc": "Browse your processed files",
|
||||
"index.quick_search": "Search",
|
||||
"index.quick_search_desc": "Full-text search across documents",
|
||||
"index.quick_subscription": "My Subscription",
|
||||
"index.quick_subscription_desc": "View plan & usage details",
|
||||
"index.quick_upload": "Upload Document",
|
||||
"index.quick_upload_desc": "Process a new file",
|
||||
"index.single_user_heading": "DocuElevate Dashboard",
|
||||
"index.single_user_subtitle": "Intelligent document processing & management",
|
||||
"index.stat_active_users": "Active users",
|
||||
"index.stat_files_month": "Files this month",
|
||||
"index.stat_files_today": "Files today",
|
||||
"index.stat_total_files": "Total files",
|
||||
"index.tier_plan": "Plan",
|
||||
"index.tier_upgrade": "Upgrade",
|
||||
"index.tier_view_details": "View full details",
|
||||
"index.upgrade_daily_limits": "Higher daily & monthly limits",
|
||||
"index.upgrade_description": "Unlock more documents, more destinations and priority support.",
|
||||
"index.upgrade_destinations": "More storage destinations",
|
||||
"index.upgrade_ocr_pages": "More OCR pages",
|
||||
"index.upgrade_plan": "Upgrade your plan",
|
||||
"index.upgrade_view_pricing": "View plans & pricing",
|
||||
"index.usage_lifetime": "Lifetime files",
|
||||
"index.usage_month": "Files this month",
|
||||
"index.usage_my_usage": "My usage",
|
||||
"index.usage_today": "Files today",
|
||||
"index.usage_unlimited": "Unlimited",
|
||||
"integrations.configure": "配置",
|
||||
"integrations.connect": "连接",
|
||||
"integrations.connected": "已连接",
|
||||
"integrations.disconnect": "断开",
|
||||
"integrations.empty_state": "No integrations configured",
|
||||
"integrations.folder_label": "Folder",
|
||||
"integrations.host_label": "Host",
|
||||
"integrations.imap_settings": "IMAP Settings",
|
||||
"integrations.not_connected": "未连接",
|
||||
"integrations.page_title": "Integrations",
|
||||
"integrations.password_label": "Password",
|
||||
"integrations.port_label": "Port",
|
||||
"integrations.title": "集成",
|
||||
"integrations.username_label": "Username",
|
||||
"language.bg": "Български",
|
||||
"language.ca": "Català",
|
||||
"language.changed": "语言已更改为{language}",
|
||||
"language.cs": "Čeština",
|
||||
"language.da": "Dansk",
|
||||
"language.de": "Deutsch",
|
||||
"language.el": "Ελληνικά",
|
||||
"language.en": "English",
|
||||
"language.es": "Español",
|
||||
"language.et": "Eesti",
|
||||
"language.fi": "Suomi",
|
||||
"language.fr": "Français",
|
||||
"language.ga": "Gaeilge",
|
||||
"language.hr": "Hrvatski",
|
||||
"language.hu": "Magyar",
|
||||
"language.is": "Íslenska",
|
||||
"language.it": "Italiano",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lv": "Latviešu",
|
||||
"language.nb": "Norsk",
|
||||
"language.nl": "Nederlands",
|
||||
"language.pl": "Polski",
|
||||
"language.pt": "Português",
|
||||
"language.ro": "Română",
|
||||
"language.ru": "Русский",
|
||||
"language.selector": "语言",
|
||||
"language.sk": "Slovenčina",
|
||||
"language.sl": "Slovenščina",
|
||||
"language.sv": "Svenska",
|
||||
"language.tr": "Türkçe",
|
||||
"language.uk": "Українська",
|
||||
"language.zh": "中文",
|
||||
"nav.about": "关于",
|
||||
"nav.admin": "管理",
|
||||
"nav.admin_actions": "管理操作",
|
||||
"nav.admin_menu": "管理菜单",
|
||||
"nav.api_docs": "API 文档",
|
||||
"nav.backup_restore": "备份与恢复",
|
||||
"nav.credentials": "凭据",
|
||||
"nav.dark_mode": "深色模式",
|
||||
"nav.dashboard": "仪表盘",
|
||||
"nav.developer_docs": "开发者文档",
|
||||
"nav.duplicates": "重复文件",
|
||||
"nav.file_manager": "文件管理器",
|
||||
"nav.files": "文件",
|
||||
"nav.help": "帮助",
|
||||
"nav.help_center": "帮助中心",
|
||||
"nav.integrations": "集成",
|
||||
"nav.light_mode": "浅色模式",
|
||||
"nav.main_navigation": "主导航",
|
||||
"nav.notifications": "通知",
|
||||
"nav.open_main_menu": "打开主菜单",
|
||||
"nav.pipelines": "处理流程",
|
||||
"nav.plan_designer": "方案设计",
|
||||
"nav.pricing": "价格",
|
||||
"nav.queue_monitor": "队列监控",
|
||||
"nav.scheduled_jobs": "计划任务",
|
||||
"nav.search": "搜索",
|
||||
"nav.settings": "设置",
|
||||
"nav.similarity": "相似度",
|
||||
"nav.skip_to_content": "跳至主要内容",
|
||||
"nav.status": "状态",
|
||||
"nav.toggle_dark_mode": "切换深色模式",
|
||||
"nav.toggle_nav": "切换导航菜单",
|
||||
"nav.upload": "上传",
|
||||
"nav.users": "用户",
|
||||
"notifications.filter_all": "All",
|
||||
"notifications.filter_read": "Read only",
|
||||
"notifications.filter_unread": "Unread only",
|
||||
"notifications.manage_desc": "Manage your notification inbox, targets, and event preferences",
|
||||
"notifications.mark_all_read": "全部标记为已读",
|
||||
"notifications.mark_all_read_btn": "Mark all read",
|
||||
"notifications.mark_read": "标记为已读",
|
||||
"notifications.no_notifications": "没有通知",
|
||||
"notifications.unread_count": "{count} 条未读通知"
|
||||
"notifications.page_title": "Notifications",
|
||||
"notifications.tab_inbox": "Inbox",
|
||||
"notifications.tab_settings": "Settings",
|
||||
"notifications.title": "通知",
|
||||
"notifications.unread_count": "{count} 条未读通知",
|
||||
"pipelines.active_label": "Active",
|
||||
"pipelines.create": "创建流程",
|
||||
"pipelines.default_label": "Default",
|
||||
"pipelines.description_label": "Description",
|
||||
"pipelines.disabled_label": "Disabled",
|
||||
"pipelines.edit": "编辑流程",
|
||||
"pipelines.empty_state": "No pipelines yet",
|
||||
"pipelines.enabled_label": "Enabled",
|
||||
"pipelines.inactive_label": "Inactive",
|
||||
"pipelines.page_title": "Processing Pipelines",
|
||||
"pipelines.set_default": "Set as my default pipeline",
|
||||
"pipelines.system_label": "System",
|
||||
"pipelines.title": "处理流程",
|
||||
"search.button": "Search",
|
||||
"search.error_message": "Search is temporarily unavailable. Please try again in a moment.",
|
||||
"search.filter_clear_button": "Clear Filters",
|
||||
"search.filter_date_from": "Date From",
|
||||
"search.filter_date_to": "Date To",
|
||||
"search.filter_document_type": "Document Type",
|
||||
"search.filter_document_type_placeholder": "e.g. Invoice",
|
||||
"search.filter_language": "Language",
|
||||
"search.filter_language_placeholder": "e.g. de",
|
||||
"search.filter_sender": "Sender",
|
||||
"search.filter_sender_placeholder": "e.g. ACME Corp",
|
||||
"search.filter_tags_placeholder": "e.g. amazon",
|
||||
"search.filter_text_quality": "Text Quality",
|
||||
"search.filter_text_quality_all": "All",
|
||||
"search.filter_text_quality_high": "High",
|
||||
"search.filter_text_quality_low": "Low",
|
||||
"search.filter_text_quality_medium": "Medium",
|
||||
"search.filter_text_quality_no_text": "No text",
|
||||
"search.heading": "Document Search",
|
||||
"search.input_placeholder": "Search documents by content, sender, tags, type...",
|
||||
"search.loading_indicator": "Searching…",
|
||||
"search.no_results": "未找到结果",
|
||||
"search.page_title": "Search Documents",
|
||||
"search.placeholder": "按文件名、内容、标签搜索...",
|
||||
"search.result_empty": "No documents found matching your query.",
|
||||
"search.results_count": "找到 {count} 个结果",
|
||||
"search.saved_button": "Save Current",
|
||||
"search.saved_empty": "No saved searches yet",
|
||||
"search.saved_error": "Could not load saved searches",
|
||||
"search.saved_label": "Saved Searches",
|
||||
"search.saved_loading": "Loading...",
|
||||
"search.title": "搜索文档",
|
||||
"settings.reset_confirm": "确定要重置此设置吗?",
|
||||
"settings.save_error": "设置保存失败",
|
||||
"settings.save_success": "设置保存成功",
|
||||
"settings.title": "设置",
|
||||
"status.app_version": "App Version",
|
||||
"status.build_date": "Build Date",
|
||||
"status.container_id": "Container ID",
|
||||
"status.git_commit": "Git Commit",
|
||||
"status.last_check": "Last Check",
|
||||
"status.page_title": "System Status",
|
||||
"status.setting_label": "Setting",
|
||||
"status.value_label": "Value",
|
||||
"upload.browse_button": "Browse Files",
|
||||
"upload.button_processing": "Processing...",
|
||||
"upload.camera_button": "Take Photo / Scan Document",
|
||||
"upload.download_button": "Download and Process",
|
||||
"upload.downloading": "Downloading file from URL...",
|
||||
"upload.drag_drop": "将文件拖放到此处或点击浏览",
|
||||
"upload.drop_hint_desktop": "Drag & drop files or folders here, or click to select files.",
|
||||
"upload.drop_hint_mobile": "Tap to select files or use the camera button below.",
|
||||
"upload.error": "上传失败",
|
||||
"upload.error_invalid_url": "Invalid URL format",
|
||||
"upload.error_url_required": "Please enter a URL",
|
||||
"upload.file_size_hint": "Maximum size: 500 MB per file",
|
||||
"upload.file_types": "Allowed types: PDF, Office documents (Word, Excel, PowerPoint, etc.), Images",
|
||||
"upload.filename_description": "Leave empty to use filename from URL",
|
||||
"upload.filename_label": "Filename (optional)",
|
||||
"upload.filename_placeholder": "my-document.pdf",
|
||||
"upload.max_size": "最大文件大小:{size}",
|
||||
"upload.page_title": "Upload Files",
|
||||
"upload.section_device": "Upload from Device",
|
||||
"upload.section_url": "Upload from URL",
|
||||
"upload.select_file": "选择文件",
|
||||
"upload.success": "文件上传成功",
|
||||
"upload.title": "上传文档",
|
||||
"upload.uploading": "上传中...",
|
||||
"upload.url_description": "Enter a direct link to a file (PDF, Office documents, or images)",
|
||||
"upload.url_label": "File URL",
|
||||
"upload.url_placeholder": "https://example.com/document.pdf"
|
||||
}
|
||||
|
||||
@@ -24,11 +24,14 @@ from app.models import ( # noqa: F401
|
||||
ApplicationSettings,
|
||||
AuditLog,
|
||||
BackupRecord,
|
||||
ComplianceTemplate,
|
||||
DocumentMetadata,
|
||||
FileProcessingStep,
|
||||
FileRecord,
|
||||
ImapIngestionProfile,
|
||||
InAppNotification,
|
||||
LocalUser,
|
||||
MobileDevice,
|
||||
Pipeline,
|
||||
PipelineStep,
|
||||
ProcessingLog,
|
||||
|
||||
@@ -17,12 +17,24 @@ depends_on: Union[str, None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Add preferred_language column to user_profiles table."""
|
||||
op.add_column(
|
||||
"user_profiles",
|
||||
sa.Column("preferred_language", sa.String(10), nullable=True, server_default=None),
|
||||
)
|
||||
conn = op.get_bind()
|
||||
inspector = sa.inspect(conn)
|
||||
if "user_profiles" not in inspector.get_table_names():
|
||||
return
|
||||
existing_columns = {col["name"] for col in inspector.get_columns("user_profiles")}
|
||||
if "preferred_language" not in existing_columns:
|
||||
op.add_column(
|
||||
"user_profiles",
|
||||
sa.Column("preferred_language", sa.String(10), nullable=True, server_default=None),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Remove preferred_language column from user_profiles table."""
|
||||
op.drop_column("user_profiles", "preferred_language")
|
||||
conn = op.get_bind()
|
||||
inspector = sa.inspect(conn)
|
||||
if "user_profiles" not in inspector.get_table_names():
|
||||
return
|
||||
existing_columns = {col["name"] for col in inspector.get_columns("user_profiles")}
|
||||
if "preferred_language" in existing_columns:
|
||||
op.drop_column("user_profiles", "preferred_language")
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
"""Add mobile_devices table for push notification device registration.
|
||||
|
||||
Revision ID: 030_add_mobile_devices
|
||||
Revises: 029_add_user_language_preference
|
||||
Create Date: 2026-03-10
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "030_add_mobile_devices"
|
||||
down_revision: Union[str, None] = "029_add_user_language_preference"
|
||||
depends_on: Union[str, None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Create mobile_devices table."""
|
||||
op.create_table(
|
||||
"mobile_devices",
|
||||
sa.Column("id", sa.Integer(), nullable=False),
|
||||
sa.Column("owner_id", sa.String(), nullable=False),
|
||||
sa.Column("device_name", sa.String(255), nullable=True),
|
||||
sa.Column("platform", sa.String(20), nullable=False, server_default="ios"),
|
||||
sa.Column("push_token", sa.String(512), nullable=False),
|
||||
sa.Column("is_active", sa.Boolean(), nullable=False, server_default="1"),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
|
||||
sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.PrimaryKeyConstraint("id"),
|
||||
sa.UniqueConstraint("owner_id", "push_token", name="uq_mobile_device_owner_token"),
|
||||
)
|
||||
op.create_index("ix_mobile_devices_id", "mobile_devices", ["id"])
|
||||
op.create_index("ix_mobile_devices_owner_id", "mobile_devices", ["owner_id"])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Drop mobile_devices table."""
|
||||
op.drop_index("ix_mobile_devices_owner_id", table_name="mobile_devices")
|
||||
op.drop_index("ix_mobile_devices_id", table_name="mobile_devices")
|
||||
op.drop_table("mobile_devices")
|
||||
@@ -0,0 +1,44 @@
|
||||
"""Add compliance_templates table for GDPR, HIPAA, SOC2 compliance templates.
|
||||
|
||||
Revision ID: 031_add_compliance_templates
|
||||
Revises: 030_add_mobile_devices
|
||||
Create Date: 2026-03-09
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "031_add_compliance_templates"
|
||||
down_revision: Union[str, None] = "030_add_mobile_devices"
|
||||
depends_on: Union[str, None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Create compliance_templates table."""
|
||||
op.create_table(
|
||||
"compliance_templates",
|
||||
sa.Column("id", sa.Integer(), nullable=False),
|
||||
sa.Column("name", sa.String(50), nullable=False),
|
||||
sa.Column("display_name", sa.String(100), nullable=False),
|
||||
sa.Column("description", sa.Text(), nullable=True),
|
||||
sa.Column("settings_json", sa.Text(), nullable=False, server_default="{}"),
|
||||
sa.Column("enabled", sa.Boolean(), nullable=False, server_default="0"),
|
||||
sa.Column("status", sa.String(20), nullable=False, server_default="not_applied"),
|
||||
sa.Column("applied_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("applied_by", sa.String(255), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
|
||||
sa.PrimaryKeyConstraint("id"),
|
||||
sa.UniqueConstraint("name", name="uq_compliance_templates_name"),
|
||||
)
|
||||
op.create_index("ix_compliance_templates_id", "compliance_templates", ["id"])
|
||||
op.create_index("ix_compliance_templates_name", "compliance_templates", ["name"])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Drop compliance_templates table."""
|
||||
op.drop_index("ix_compliance_templates_name", "compliance_templates")
|
||||
op.drop_index("ix_compliance_templates_id", "compliance_templates")
|
||||
op.drop_table("compliance_templates")
|
||||
@@ -0,0 +1,28 @@
|
||||
"""Add attachment_filter column to user_imap_accounts table.
|
||||
|
||||
Revision ID: 032_add_imap_attachment_filter
|
||||
Revises: 031_add_compliance_templates
|
||||
Create Date: 2026-03-12
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "032_add_imap_attachment_filter"
|
||||
down_revision: Union[str, None] = "031_add_compliance_templates"
|
||||
depends_on: Union[str, None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Add attachment_filter column to user_imap_accounts."""
|
||||
op.add_column(
|
||||
"user_imap_accounts",
|
||||
sa.Column("attachment_filter", sa.String(50), nullable=True),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Remove attachment_filter column from user_imap_accounts."""
|
||||
op.drop_column("user_imap_accounts", "attachment_filter")
|
||||
@@ -0,0 +1,146 @@
|
||||
"""Add imap_ingestion_profiles table and migrate user_imap_accounts.
|
||||
|
||||
Creates the ``imap_ingestion_profiles`` table, seeds the two built-in profiles
|
||||
("Documents Only" and "All Files"), and replaces the ``attachment_filter``
|
||||
string column on ``user_imap_accounts`` with a ``profile_id`` FK that references
|
||||
the new table.
|
||||
|
||||
Revision ID: 033_add_imap_ingestion_profiles
|
||||
Revises: 032_add_imap_attachment_filter
|
||||
Create Date: 2026-03-12
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "033_add_imap_ingestion_profiles"
|
||||
down_revision: Union[str, None] = "032_add_imap_attachment_filter"
|
||||
depends_on: Union[str, None] = None
|
||||
|
||||
# Fixed IDs for the built-in profiles so that the FK migration is reproducible.
|
||||
_BUILTIN_DOCUMENTS_ONLY_ID = 1
|
||||
_BUILTIN_ALL_FILES_ID = 2
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Create profiles table, seed built-ins, migrate accounts column."""
|
||||
# 1 — Create the imap_ingestion_profiles table
|
||||
op.create_table(
|
||||
"imap_ingestion_profiles",
|
||||
sa.Column("id", sa.Integer(), nullable=False),
|
||||
sa.Column("name", sa.String(255), nullable=False),
|
||||
sa.Column("description", sa.Text(), nullable=True),
|
||||
sa.Column("owner_id", sa.String(), nullable=True),
|
||||
sa.Column(
|
||||
"allowed_categories",
|
||||
sa.Text(),
|
||||
nullable=False,
|
||||
server_default='["pdf","office","opendocument","text","web"]',
|
||||
),
|
||||
sa.Column("is_builtin", sa.Boolean(), nullable=False, server_default="0"),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
|
||||
sa.PrimaryKeyConstraint("id"),
|
||||
)
|
||||
op.create_index("ix_imap_ingestion_profiles_id", "imap_ingestion_profiles", ["id"])
|
||||
op.create_index("ix_imap_ingestion_profiles_owner_id", "imap_ingestion_profiles", ["owner_id"])
|
||||
|
||||
# 2 — Seed the two built-in profiles
|
||||
bind = op.get_bind()
|
||||
bind.execute(
|
||||
sa.text(
|
||||
"INSERT INTO imap_ingestion_profiles "
|
||||
"(id, name, description, owner_id, allowed_categories, is_builtin) "
|
||||
"VALUES (:id, :name, :desc, NULL, :cats, 1)"
|
||||
),
|
||||
[
|
||||
{
|
||||
"id": _BUILTIN_DOCUMENTS_ONLY_ID,
|
||||
"name": "Documents Only",
|
||||
"desc": (
|
||||
"Ingest PDFs, Microsoft Office files, OpenDocument files, "
|
||||
"plain text, CSV, RTF, HTML and Markdown. Images are excluded."
|
||||
),
|
||||
"cats": '["pdf","office","opendocument","text","web"]',
|
||||
},
|
||||
{
|
||||
"id": _BUILTIN_ALL_FILES_ID,
|
||||
"name": "All Files",
|
||||
"desc": "Ingest all supported file types, including images.",
|
||||
"cats": '["pdf","office","opendocument","text","web","images"]',
|
||||
},
|
||||
],
|
||||
)
|
||||
|
||||
# 3 — Add profile_id column to user_imap_accounts
|
||||
op.add_column(
|
||||
"user_imap_accounts",
|
||||
sa.Column("profile_id", sa.Integer(), nullable=True),
|
||||
)
|
||||
|
||||
# 4 — Migrate existing attachment_filter values to profile_id
|
||||
bind.execute(
|
||||
sa.text(
|
||||
"UPDATE user_imap_accounts SET profile_id = :pid "
|
||||
"WHERE attachment_filter = 'all'"
|
||||
),
|
||||
{"pid": _BUILTIN_ALL_FILES_ID},
|
||||
)
|
||||
bind.execute(
|
||||
sa.text(
|
||||
"UPDATE user_imap_accounts SET profile_id = :pid "
|
||||
"WHERE attachment_filter = 'documents_only'"
|
||||
),
|
||||
{"pid": _BUILTIN_DOCUMENTS_ONLY_ID},
|
||||
)
|
||||
# Rows with NULL attachment_filter keep profile_id = NULL (use global default)
|
||||
|
||||
# 5 — Add FK constraint (skip for SQLite which does not enforce FKs at DDL time)
|
||||
# We use batch_alter_table so this works across SQLite and PostgreSQL
|
||||
with op.batch_alter_table("user_imap_accounts") as batch_op:
|
||||
batch_op.create_foreign_key(
|
||||
"fk_user_imap_accounts_profile_id",
|
||||
"imap_ingestion_profiles",
|
||||
["profile_id"],
|
||||
["id"],
|
||||
)
|
||||
|
||||
# 6 — Drop the now-redundant attachment_filter column
|
||||
with op.batch_alter_table("user_imap_accounts") as batch_op:
|
||||
batch_op.drop_column("attachment_filter")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Reverse the migration: restore attachment_filter, drop profiles table."""
|
||||
# 1 — Re-add attachment_filter column
|
||||
with op.batch_alter_table("user_imap_accounts") as batch_op:
|
||||
batch_op.add_column(sa.Column("attachment_filter", sa.String(50), nullable=True))
|
||||
|
||||
# 2 — Restore string values from profile_id
|
||||
bind = op.get_bind()
|
||||
bind.execute(
|
||||
sa.text(
|
||||
"UPDATE user_imap_accounts SET attachment_filter = 'all' "
|
||||
"WHERE profile_id = :pid"
|
||||
),
|
||||
{"pid": _BUILTIN_ALL_FILES_ID},
|
||||
)
|
||||
bind.execute(
|
||||
sa.text(
|
||||
"UPDATE user_imap_accounts SET attachment_filter = 'documents_only' "
|
||||
"WHERE profile_id = :pid"
|
||||
),
|
||||
{"pid": _BUILTIN_DOCUMENTS_ONLY_ID},
|
||||
)
|
||||
|
||||
# 3 — Drop the FK and profile_id column
|
||||
with op.batch_alter_table("user_imap_accounts") as batch_op:
|
||||
batch_op.drop_constraint("fk_user_imap_accounts_profile_id", type_="foreignkey")
|
||||
batch_op.drop_column("profile_id")
|
||||
|
||||
# 4 — Drop the profiles table
|
||||
op.drop_index("ix_imap_ingestion_profiles_owner_id", "imap_ingestion_profiles")
|
||||
op.drop_index("ix_imap_ingestion_profiles_id", "imap_ingestion_profiles")
|
||||
op.drop_table("imap_ingestion_profiles")
|
||||
@@ -0,0 +1,21 @@
|
||||
node_modules/
|
||||
.expo/
|
||||
dist/
|
||||
web-build/
|
||||
ios/
|
||||
android/
|
||||
.env
|
||||
google-services.json
|
||||
GoogleService-Info.plist
|
||||
*.jks
|
||||
*.p8
|
||||
*.p12
|
||||
*.key
|
||||
*.mobileprovision
|
||||
*.orig.*
|
||||
npm-debug.*
|
||||
yarn-debug.*
|
||||
yarn-error.*
|
||||
.idea/
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
/**
|
||||
* App.tsx – root component for the DocuElevate mobile app.
|
||||
*
|
||||
* Wraps the entire app in the AuthProvider and renders either the login
|
||||
* screen (unauthenticated) or the main tab navigator (authenticated).
|
||||
* Push notification registration is handled by the usePushNotifications hook.
|
||||
*/
|
||||
|
||||
import { NavigationContainer } from "@react-navigation/native";
|
||||
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
|
||||
import React from "react";
|
||||
import { ActivityIndicator, StyleSheet, Text, View } from "react-native";
|
||||
import { SafeAreaProvider } from "react-native-safe-area-context";
|
||||
import { AuthProvider, useAuth } from "./src/context/AuthContext";
|
||||
import { usePushNotifications } from "./src/hooks/usePushNotifications";
|
||||
import FilesScreen from "./src/screens/FilesScreen";
|
||||
import LoginScreen from "./src/screens/LoginScreen";
|
||||
import ProfileScreen from "./src/screens/ProfileScreen";
|
||||
import UploadScreen from "./src/screens/UploadScreen";
|
||||
|
||||
const Tab = createBottomTabNavigator();
|
||||
|
||||
function TabNavigator() {
|
||||
const { isAuthenticated } = useAuth();
|
||||
usePushNotifications(isAuthenticated);
|
||||
|
||||
return (
|
||||
<Tab.Navigator
|
||||
screenOptions={{
|
||||
tabBarActiveTintColor: "#1e40af",
|
||||
tabBarInactiveTintColor: "#9ca3af",
|
||||
tabBarStyle: {
|
||||
borderTopColor: "#e5e7eb",
|
||||
backgroundColor: "#ffffff",
|
||||
},
|
||||
headerStyle: {
|
||||
backgroundColor: "#1e40af",
|
||||
},
|
||||
headerTintColor: "#ffffff",
|
||||
headerTitleStyle: {
|
||||
fontWeight: "700",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<Tab.Screen
|
||||
name="Upload"
|
||||
component={UploadScreen}
|
||||
options={{
|
||||
title: "Upload",
|
||||
tabBarLabel: "Upload",
|
||||
tabBarIcon: ({ color }) => (
|
||||
<Text style={{ fontSize: 20, color }}>⬆️</Text>
|
||||
),
|
||||
headerTitle: "DocuElevate",
|
||||
}}
|
||||
/>
|
||||
<Tab.Screen
|
||||
name="Files"
|
||||
component={FilesScreen}
|
||||
options={{
|
||||
title: "Files",
|
||||
tabBarLabel: "Files",
|
||||
tabBarIcon: ({ color }) => (
|
||||
<Text style={{ fontSize: 20, color }}>📄</Text>
|
||||
),
|
||||
headerTitle: "My Documents",
|
||||
}}
|
||||
/>
|
||||
<Tab.Screen
|
||||
name="Profile"
|
||||
component={ProfileScreen}
|
||||
options={{
|
||||
title: "Profile",
|
||||
tabBarLabel: "Profile",
|
||||
tabBarIcon: ({ color }) => (
|
||||
<Text style={{ fontSize: 20, color }}>👤</Text>
|
||||
),
|
||||
headerTitle: "Profile",
|
||||
}}
|
||||
/>
|
||||
</Tab.Navigator>
|
||||
);
|
||||
}
|
||||
|
||||
function AppContent() {
|
||||
const { isLoading, isAuthenticated } = useAuth();
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<View style={styles.loading}>
|
||||
<ActivityIndicator size="large" color="#1e40af" />
|
||||
<Text style={styles.loadingText}>Loading…</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<NavigationContainer>
|
||||
{isAuthenticated ? <TabNavigator /> : <LoginScreen />}
|
||||
</NavigationContainer>
|
||||
);
|
||||
}
|
||||
|
||||
export default function App() {
|
||||
return (
|
||||
<SafeAreaProvider>
|
||||
<AuthProvider>
|
||||
<AppContent />
|
||||
</AuthProvider>
|
||||
</SafeAreaProvider>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
loading: {
|
||||
flex: 1,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
backgroundColor: "#f9fafb",
|
||||
gap: 12,
|
||||
},
|
||||
loadingText: {
|
||||
color: "#6b7280",
|
||||
fontSize: 15,
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,142 @@
|
||||
# DocuElevate Mobile App
|
||||
|
||||
Native mobile application for DocuElevate, built with **React Native** and **Expo** for both iOS (primary) and Android.
|
||||
|
||||
## Features
|
||||
|
||||
- 🔐 **SSO Login** – authenticate via your DocuElevate server's OAuth2/SSO provider; an API token is auto-generated and stored securely in the device keychain
|
||||
- 📷 **Camera Capture** – scan documents directly with the device camera
|
||||
- 📄 **File Picker** – upload PDFs, images, and Office documents from the device's Files app
|
||||
- 🔗 **Share Extension** – send files from any app directly to DocuElevate via the iOS/Android share sheet
|
||||
- 🔔 **Push Notifications** – receive real-time push notifications when documents finish processing (via Expo push notifications)
|
||||
- 📂 **Document List** – browse and search your processed documents
|
||||
- 👤 **Profile** – view account details and sign out
|
||||
|
||||
## Requirements
|
||||
|
||||
- Node.js 18+
|
||||
- Expo CLI (`npm install -g @expo/cli`)
|
||||
- Expo Go app on device (for development) **or** Expo Application Services (EAS) for production builds
|
||||
- An Expo account: <https://expo.dev/>
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
# 1. Install dependencies
|
||||
cd mobile
|
||||
npm install
|
||||
|
||||
# 2. Start the development server
|
||||
npx expo start
|
||||
```
|
||||
|
||||
Scan the QR code with **Expo Go** on your iOS or Android device.
|
||||
|
||||
## Building
|
||||
|
||||
DocuElevate uses **EAS Build** for production binaries.
|
||||
|
||||
```bash
|
||||
# Install EAS CLI
|
||||
npm install -g eas-cli
|
||||
|
||||
# Log in to Expo
|
||||
eas login
|
||||
|
||||
# Configure your project (one-time) – updates app.json with the EAS project ID
|
||||
eas init
|
||||
|
||||
# Build for iOS
|
||||
eas build --platform ios
|
||||
|
||||
# Build for Android
|
||||
eas build --platform android
|
||||
|
||||
# Build for both
|
||||
eas build --platform all
|
||||
```
|
||||
|
||||
> **After running `eas init`:** update the `extra.eas.projectId` field in `app.json` with the value printed by the command.
|
||||
|
||||
### iOS-specific
|
||||
|
||||
- An Apple Developer account is required for TestFlight and App Store distribution
|
||||
- Update `eas.json` → `submit.production.ios` with:
|
||||
- `appleId`: your Apple ID email address
|
||||
- `ascAppId`: App Store Connect → App Information → Apple ID
|
||||
- `appleTeamId`: Apple Developer portal → Membership → Team ID
|
||||
- Camera, photo library, and push notification usage descriptions are configured in `app.json`
|
||||
|
||||
### Android-specific
|
||||
|
||||
- Add a `google-services.json` file (from Firebase Console) to the `mobile/` directory for push notification support
|
||||
- For Play Store submission: create a service account in Google Play Console, download the JSON key as `google-play-service-account.json`, and update `eas.json`
|
||||
|
||||
## Configuration
|
||||
|
||||
No code changes are needed to point the app at a different server. The server URL is entered by the user on the login screen and stored in the device's secure store.
|
||||
|
||||
## Authentication Flow
|
||||
|
||||
1. User enters the DocuElevate server URL on the login screen
|
||||
2. The app opens the server's `/login?mobile=1&redirect_uri=docuelevate://callback` URL in the system browser
|
||||
3. The user authenticates (SSO / local login)
|
||||
4. The server redirects back to `docuelevate://callback`
|
||||
5. The app exchanges the browser session for a permanent API token via `POST /api/mobile/generate-token`
|
||||
6. The token is stored in the device's secure keychain (`expo-secure-store`)
|
||||
|
||||
## Push Notifications
|
||||
|
||||
The app uses **Expo Push Notifications** which route through Expo's servers to APNs (iOS) and FCM (Android) – no server-side APNs/FCM credentials are needed.
|
||||
|
||||
The Expo push token is sent to the backend after login via `POST /api/mobile/register-device` and the server uses it to deliver notifications when documents are processed.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
mobile/
|
||||
├── App.tsx # Root component
|
||||
├── app.json # Expo configuration
|
||||
├── eas.json # EAS Build configuration
|
||||
├── package.json
|
||||
├── tsconfig.json
|
||||
└── src/
|
||||
├── context/
|
||||
│ └── AuthContext.tsx # Authentication state management
|
||||
├── hooks/
|
||||
│ └── usePushNotifications.ts # Push notification registration
|
||||
├── screens/
|
||||
│ ├── LoginScreen.tsx # SSO login
|
||||
│ ├── UploadScreen.tsx # Camera capture + file picker
|
||||
│ ├── FilesScreen.tsx # Document list
|
||||
│ └── ProfileScreen.tsx # User profile + sign out
|
||||
└── services/
|
||||
└── api.ts # DocuElevate API client
|
||||
```
|
||||
|
||||
## Share Extension (iOS)
|
||||
|
||||
The app registers the `docuelevate://` URL scheme and the `com.docuelevate.app` bundle identifier. To enable the share sheet:
|
||||
|
||||
1. Ensure the app is installed on the device
|
||||
2. Open any file in Files, Mail, Safari, etc.
|
||||
3. Tap the share icon → find **DocuElevate** in the share sheet
|
||||
4. The file is uploaded immediately
|
||||
|
||||
Android uses a similar intent filter configured in `app.json`.
|
||||
|
||||
## Backend API
|
||||
|
||||
The mobile app uses the following backend endpoints:
|
||||
|
||||
| Method | Endpoint | Description |
|
||||
|----------|-------------------------------------|---------------------------------------|
|
||||
| `POST` | `/api/mobile/generate-token` | Exchange SSO session for API token |
|
||||
| `POST` | `/api/mobile/register-device` | Register Expo push token |
|
||||
| `GET` | `/api/mobile/devices` | List registered devices |
|
||||
| `DELETE` | `/api/mobile/devices/{id}` | Deactivate device registration |
|
||||
| `GET` | `/api/mobile/whoami` | Get current user profile |
|
||||
| `POST` | `/api/ui-upload` | Upload file for processing |
|
||||
| `GET` | `/api/files` | List processed documents |
|
||||
|
||||
Authentication uses `Authorization: Bearer <api_token>` on all requests.
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"name": "DocuElevate",
|
||||
"slug": "docuelevate",
|
||||
"version": "1.0.0",
|
||||
"orientation": "portrait",
|
||||
"icon": "./assets/icon.png",
|
||||
"userInterfaceStyle": "automatic",
|
||||
"splash": {
|
||||
"image": "./assets/splash.png",
|
||||
"resizeMode": "contain",
|
||||
"backgroundColor": "#1e40af"
|
||||
},
|
||||
"assetBundlePatterns": ["**/*"],
|
||||
"ios": {
|
||||
"supportsTablet": true,
|
||||
"bundleIdentifier": "com.docuelevate.app",
|
||||
"infoPlist": {
|
||||
"NSCameraUsageDescription": "DocuElevate uses the camera to capture documents for upload.",
|
||||
"NSPhotoLibraryUsageDescription": "DocuElevate accesses your photo library to select documents for upload.",
|
||||
"NSPhotoLibraryAddUsageDescription": "DocuElevate saves scanned documents to your photo library.",
|
||||
"UIBackgroundModes": ["fetch", "remote-notification"]
|
||||
},
|
||||
"buildNumber": "1"
|
||||
},
|
||||
"android": {
|
||||
"adaptiveIcon": {
|
||||
"foregroundImage": "./assets/adaptive-icon.png",
|
||||
"backgroundColor": "#1e40af"
|
||||
},
|
||||
"package": "com.docuelevate.app",
|
||||
"permissions": [
|
||||
"CAMERA",
|
||||
"READ_EXTERNAL_STORAGE",
|
||||
"WRITE_EXTERNAL_STORAGE",
|
||||
"RECEIVE_BOOT_COMPLETED",
|
||||
"VIBRATE"
|
||||
],
|
||||
"versionCode": 1,
|
||||
"googleServicesFile": "./google-services.json"
|
||||
},
|
||||
"web": {
|
||||
"favicon": "./assets/favicon.png"
|
||||
},
|
||||
"plugins": [
|
||||
"expo-router",
|
||||
[
|
||||
"expo-notifications",
|
||||
{
|
||||
"icon": "./assets/notification-icon.png",
|
||||
"color": "#1e40af",
|
||||
"sounds": ["./assets/notification-sound.wav"]
|
||||
}
|
||||
],
|
||||
[
|
||||
"expo-camera",
|
||||
{
|
||||
"cameraPermission": "DocuElevate uses the camera to capture documents for upload."
|
||||
}
|
||||
],
|
||||
"expo-document-picker",
|
||||
"expo-secure-store",
|
||||
"expo-sharing"
|
||||
],
|
||||
"scheme": "docuelevate",
|
||||
"extra": {
|
||||
"eas": {
|
||||
"projectId": "YOUR_EAS_PROJECT_ID"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
module.exports = function (api) {
|
||||
api.cache(true);
|
||||
return {
|
||||
presets: ["babel-preset-expo"],
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"cli": {
|
||||
"version": ">= 5.9.0"
|
||||
},
|
||||
"build": {
|
||||
"development": {
|
||||
"developmentClient": true,
|
||||
"distribution": "internal"
|
||||
},
|
||||
"preview": {
|
||||
"distribution": "internal",
|
||||
"ios": {
|
||||
"simulator": false
|
||||
}
|
||||
},
|
||||
"production": {
|
||||
"autoIncrement": true
|
||||
}
|
||||
},
|
||||
"submit": {
|
||||
"production": {
|
||||
"ios": {
|
||||
"appleId": "YOUR_APPLE_ID",
|
||||
"ascAppId": "YOUR_APP_STORE_CONNECT_APP_ID",
|
||||
"appleTeamId": "YOUR_APPLE_TEAM_ID"
|
||||
},
|
||||
"android": {
|
||||
"serviceAccountKeyPath": "./google-play-service-account.json",
|
||||
"track": "production"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"name": "docuelevate-mobile",
|
||||
"version": "1.0.0",
|
||||
"description": "DocuElevate native mobile app (iOS and Android)",
|
||||
"main": "expo-router/entry",
|
||||
"scripts": {
|
||||
"start": "expo start",
|
||||
"android": "expo start --android",
|
||||
"ios": "expo start --ios",
|
||||
"web": "expo start --web",
|
||||
"lint": "eslint src --ext .ts,.tsx",
|
||||
"type-check": "tsc --noEmit",
|
||||
"build:ios": "eas build --platform ios",
|
||||
"build:android": "eas build --platform android",
|
||||
"build:all": "eas build --platform all",
|
||||
"submit:ios": "eas submit --platform ios",
|
||||
"submit:android": "eas submit --platform android"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/vector-icons": "^14.0.0",
|
||||
"@react-native-async-storage/async-storage": "1.23.1",
|
||||
"@react-navigation/bottom-tabs": "^6.6.1",
|
||||
"@react-navigation/native": "^6.1.18",
|
||||
"@react-navigation/native-stack": "^6.11.0",
|
||||
"expo": "~51.0.0",
|
||||
"expo-auth-session": "~5.5.2",
|
||||
"expo-camera": "~15.0.16",
|
||||
"expo-constants": "~16.0.2",
|
||||
"expo-crypto": "~13.0.2",
|
||||
"expo-document-picker": "~12.0.2",
|
||||
"expo-file-system": "~17.0.1",
|
||||
"expo-image-manipulator": "~12.0.5",
|
||||
"expo-image-picker": "~15.0.7",
|
||||
"expo-linking": "~6.3.1",
|
||||
"expo-notifications": "~0.28.15",
|
||||
"expo-router": "~3.5.23",
|
||||
"expo-secure-store": "~13.0.2",
|
||||
"expo-sharing": "~12.0.1",
|
||||
"expo-splash-screen": "~0.27.5",
|
||||
"expo-status-bar": "~1.12.1",
|
||||
"expo-web-browser": "~13.0.3",
|
||||
"react": "18.2.0",
|
||||
"react-native": "0.74.5",
|
||||
"react-native-safe-area-context": "4.10.5",
|
||||
"react-native-screens": "3.31.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.24.0",
|
||||
"@types/react": "~18.2.79",
|
||||
"@types/react-native": "^0.73.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-expo": "~7.0.0",
|
||||
"typescript": "^5.3.0"
|
||||
},
|
||||
"private": true,
|
||||
"expo": {
|
||||
"doctor": {
|
||||
"reactNativeDirectoryCheck": {
|
||||
"exclude": ["@react-navigation/bottom-tabs"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
/**
|
||||
* Authentication context for the DocuElevate mobile app.
|
||||
*
|
||||
* Manages the lifecycle of the stored API token and user profile. The SSO
|
||||
* login flow uses expo-auth-session to open the server's OAuth page in the
|
||||
* system browser; on return the redirect URL carries a one-time code that is
|
||||
* exchanged for a session cookie, which is then traded for a permanent API
|
||||
* token via POST /api/mobile/generate-token.
|
||||
*/
|
||||
|
||||
import * as SecureStore from "expo-secure-store";
|
||||
import * as WebBrowser from "expo-web-browser";
|
||||
import React, {
|
||||
createContext,
|
||||
useCallback,
|
||||
useContext,
|
||||
useEffect,
|
||||
useState,
|
||||
} from "react";
|
||||
import {
|
||||
SECURE_STORE_API_TOKEN_KEY,
|
||||
SECURE_STORE_BASE_URL_KEY,
|
||||
SECURE_STORE_OWNER_ID_KEY,
|
||||
api,
|
||||
type WhoAmIResponse,
|
||||
} from "../services/api";
|
||||
|
||||
WebBrowser.maybeCompleteAuthSession();
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Types
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface AuthState {
|
||||
isLoading: boolean;
|
||||
isAuthenticated: boolean;
|
||||
user: WhoAmIResponse | null;
|
||||
baseUrl: string;
|
||||
signIn: (serverUrl: string) => Promise<void>;
|
||||
signOut: () => Promise<void>;
|
||||
setToken: (token: string) => Promise<void>;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Context
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const AuthContext = createContext<AuthState>({
|
||||
isLoading: true,
|
||||
isAuthenticated: false,
|
||||
user: null,
|
||||
baseUrl: "",
|
||||
signIn: async () => {},
|
||||
signOut: async () => {},
|
||||
setToken: async () => {},
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Provider
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
||||
const [user, setUser] = useState<WhoAmIResponse | null>(null);
|
||||
const [baseUrl, setBaseUrl] = useState("");
|
||||
|
||||
// On mount: restore persisted session
|
||||
useEffect(() => {
|
||||
(async () => {
|
||||
try {
|
||||
const storedUrl = await SecureStore.getItemAsync(SECURE_STORE_BASE_URL_KEY);
|
||||
const storedToken = await SecureStore.getItemAsync(SECURE_STORE_API_TOKEN_KEY);
|
||||
|
||||
if (storedUrl && storedToken) {
|
||||
await api.init(storedUrl);
|
||||
setBaseUrl(storedUrl);
|
||||
// Verify token is still valid
|
||||
const profile = await api.whoAmI();
|
||||
setUser(profile);
|
||||
setIsAuthenticated(true);
|
||||
}
|
||||
} catch {
|
||||
// Token expired or server unavailable – clear stored credentials
|
||||
await SecureStore.deleteItemAsync(SECURE_STORE_API_TOKEN_KEY);
|
||||
await SecureStore.deleteItemAsync(SECURE_STORE_OWNER_ID_KEY);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
})();
|
||||
}, []);
|
||||
|
||||
const setToken = useCallback(async (token: string) => {
|
||||
await SecureStore.setItemAsync(SECURE_STORE_API_TOKEN_KEY, token);
|
||||
const profile = await api.whoAmI();
|
||||
setUser(profile);
|
||||
await SecureStore.setItemAsync(SECURE_STORE_OWNER_ID_KEY, profile.owner_id);
|
||||
setIsAuthenticated(true);
|
||||
}, []);
|
||||
|
||||
const signIn = useCallback(
|
||||
async (serverUrl: string) => {
|
||||
const cleanUrl = serverUrl.replace(/\/$/, "");
|
||||
await api.init(cleanUrl);
|
||||
setBaseUrl(cleanUrl);
|
||||
|
||||
// Open the web login page in the system browser. The user authenticates
|
||||
// via SSO or local credentials, then the app deep-link (docuelevate://callback)
|
||||
// is triggered. The WebBrowser.openAuthSessionAsync handles the redirect
|
||||
// back to the app.
|
||||
const result = await WebBrowser.openAuthSessionAsync(
|
||||
`${cleanUrl}/login?mobile=1&redirect_uri=docuelevate://callback`,
|
||||
"docuelevate://callback"
|
||||
);
|
||||
|
||||
if (result.type !== "success") {
|
||||
throw new Error("Authentication was cancelled or failed");
|
||||
}
|
||||
|
||||
// Parse the token from the redirect URL if the server appended it,
|
||||
// otherwise hit the generate-token endpoint (session cookie is carried
|
||||
// by the WebBrowser).
|
||||
const url = new URL(result.url);
|
||||
const inlineToken = url.searchParams.get("token");
|
||||
|
||||
if (inlineToken) {
|
||||
await setToken(inlineToken);
|
||||
} else {
|
||||
// The server set a session cookie during the browser session; exchange
|
||||
// it for a persistent API token.
|
||||
const deviceInfo = await _getDeviceName();
|
||||
const tokenResp = await api.generateMobileToken(deviceInfo);
|
||||
await setToken(tokenResp.token);
|
||||
}
|
||||
},
|
||||
[setToken]
|
||||
);
|
||||
|
||||
const signOut = useCallback(async () => {
|
||||
await SecureStore.deleteItemAsync(SECURE_STORE_API_TOKEN_KEY);
|
||||
await SecureStore.deleteItemAsync(SECURE_STORE_OWNER_ID_KEY);
|
||||
setUser(null);
|
||||
setIsAuthenticated(false);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<AuthContext.Provider
|
||||
value={{
|
||||
isLoading,
|
||||
isAuthenticated,
|
||||
user,
|
||||
baseUrl,
|
||||
signIn,
|
||||
signOut,
|
||||
setToken,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</AuthContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Hook
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export function useAuth(): AuthState {
|
||||
return useContext(AuthContext);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async function _getDeviceName(): Promise<string> {
|
||||
try {
|
||||
const Constants = await import("expo-constants");
|
||||
return (
|
||||
Constants.default.deviceName ||
|
||||
Constants.default.expoConfig?.name ||
|
||||
"Mobile App"
|
||||
);
|
||||
} catch {
|
||||
return "Mobile App";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
/**
|
||||
* usePushNotifications – register the device for push notifications.
|
||||
*
|
||||
* Requests the user's permission for notifications, obtains an Expo push
|
||||
* token, and registers it with the DocuElevate backend via
|
||||
* POST /api/mobile/register-device.
|
||||
*
|
||||
* This hook should be called once from the root component after the user has
|
||||
* successfully authenticated.
|
||||
*/
|
||||
|
||||
import Constants from "expo-constants";
|
||||
import * as Device from "expo-device";
|
||||
import * as Notifications from "expo-notifications";
|
||||
import { useCallback, useEffect, useRef } from "react";
|
||||
import { Platform } from "react-native";
|
||||
import api from "../services/api";
|
||||
|
||||
Notifications.setNotificationHandler({
|
||||
handleNotification: async () => ({
|
||||
shouldShowAlert: true,
|
||||
shouldPlaySound: true,
|
||||
shouldSetBadge: true,
|
||||
}),
|
||||
});
|
||||
|
||||
export function usePushNotifications(isAuthenticated: boolean) {
|
||||
const notificationListener = useRef<Notifications.Subscription | null>(null);
|
||||
const responseListener = useRef<Notifications.Subscription | null>(null);
|
||||
|
||||
const registerForPushNotifications = useCallback(async () => {
|
||||
if (!Device.isDevice) {
|
||||
// Push tokens are not available in simulators.
|
||||
return;
|
||||
}
|
||||
|
||||
if (Platform.OS === "android") {
|
||||
await Notifications.setNotificationChannelAsync("default", {
|
||||
name: "DocuElevate",
|
||||
importance: Notifications.AndroidImportance.MAX,
|
||||
vibrationPattern: [0, 250, 250, 250],
|
||||
lightColor: "#1e40af",
|
||||
});
|
||||
}
|
||||
|
||||
const { status: existingStatus } = await Notifications.getPermissionsAsync();
|
||||
let finalStatus = existingStatus;
|
||||
|
||||
if (existingStatus !== "granted") {
|
||||
const { status } = await Notifications.requestPermissionsAsync();
|
||||
finalStatus = status;
|
||||
}
|
||||
|
||||
if (finalStatus !== "granted") {
|
||||
// User declined – no push notifications
|
||||
return;
|
||||
}
|
||||
|
||||
let projectId: string | undefined;
|
||||
try {
|
||||
projectId =
|
||||
Constants.expoConfig?.extra?.eas?.projectId ??
|
||||
Constants.easConfig?.projectId;
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
const tokenData = await Notifications.getExpoPushTokenAsync(
|
||||
projectId ? { projectId } : undefined
|
||||
);
|
||||
|
||||
const pushToken = tokenData.data;
|
||||
const platform = Platform.OS as "ios" | "android" | "web";
|
||||
|
||||
let deviceName = "Mobile App";
|
||||
try {
|
||||
deviceName = Device.modelName ?? Device.deviceName ?? "Mobile App";
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
try {
|
||||
await api.registerDevice({ push_token: pushToken, device_name: deviceName, platform });
|
||||
} catch {
|
||||
// Registration failure is non-fatal – the app still works without push.
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isAuthenticated) return;
|
||||
|
||||
registerForPushNotifications();
|
||||
|
||||
// Listen for incoming notifications while app is foregrounded
|
||||
notificationListener.current = Notifications.addNotificationReceivedListener((notification) => {
|
||||
console.log("Notification received:", notification.request.content.title);
|
||||
});
|
||||
|
||||
// Listen for user taps on notifications
|
||||
responseListener.current = Notifications.addNotificationResponseReceivedListener((response) => {
|
||||
const data = response.notification.request.content.data as Record<string, unknown>;
|
||||
// Navigate to file detail if file_id is present
|
||||
if (data?.file_id) {
|
||||
console.log("User tapped notification for file:", data.file_id);
|
||||
// Navigation would be wired up by the caller via a callback prop
|
||||
}
|
||||
});
|
||||
|
||||
return () => {
|
||||
notificationListener.current?.remove();
|
||||
responseListener.current?.remove();
|
||||
};
|
||||
}, [isAuthenticated, registerForPushNotifications]);
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
/**
|
||||
* FilesScreen – list of documents processed by DocuElevate.
|
||||
*/
|
||||
|
||||
import React, { useCallback, useEffect, useState } from "react";
|
||||
import {
|
||||
ActivityIndicator,
|
||||
FlatList,
|
||||
Pressable,
|
||||
RefreshControl,
|
||||
StyleSheet,
|
||||
Text,
|
||||
View,
|
||||
} from "react-native";
|
||||
import type { FileRecord } from "../services/api";
|
||||
import api from "../services/api";
|
||||
|
||||
function formatBytes(bytes: number | null): string {
|
||||
if (bytes === null || bytes === undefined) return "–";
|
||||
if (bytes < 1024) return `${bytes} B`;
|
||||
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
||||
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
||||
}
|
||||
|
||||
function formatDate(iso: string): string {
|
||||
try {
|
||||
return new Date(iso).toLocaleDateString(undefined, {
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
});
|
||||
} catch {
|
||||
return iso;
|
||||
}
|
||||
}
|
||||
|
||||
function statusEmoji(status: string): string {
|
||||
const map: Record<string, string> = {
|
||||
processed: "✅",
|
||||
processing: "⚙️",
|
||||
queued: "⏳",
|
||||
failed: "❌",
|
||||
uploaded: "⬆️",
|
||||
};
|
||||
return map[status?.toLowerCase()] ?? "📄";
|
||||
}
|
||||
|
||||
export default function FilesScreen() {
|
||||
const [files, setFiles] = useState<FileRecord[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [refreshing, setRefreshing] = useState(false);
|
||||
const [page, setPage] = useState(1);
|
||||
const [hasMore, setHasMore] = useState(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
const fetchFiles = useCallback(
|
||||
async (pageNum: number, replace: boolean) => {
|
||||
try {
|
||||
const data = await api.listFiles(pageNum, 20);
|
||||
if (replace) {
|
||||
setFiles(data);
|
||||
} else {
|
||||
setFiles((prev) => [...prev, ...data]);
|
||||
}
|
||||
setHasMore(data.length === 20);
|
||||
setError(null);
|
||||
} catch (err: unknown) {
|
||||
setError(err instanceof Error ? err.message : "Failed to load files");
|
||||
}
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
(async () => {
|
||||
setLoading(true);
|
||||
await fetchFiles(1, true);
|
||||
setLoading(false);
|
||||
})();
|
||||
}, [fetchFiles]);
|
||||
|
||||
const handleRefresh = useCallback(async () => {
|
||||
setRefreshing(true);
|
||||
setPage(1);
|
||||
await fetchFiles(1, true);
|
||||
setRefreshing(false);
|
||||
}, [fetchFiles]);
|
||||
|
||||
const handleLoadMore = useCallback(async () => {
|
||||
if (!hasMore || loading || refreshing) return;
|
||||
const next = page + 1;
|
||||
setPage(next);
|
||||
await fetchFiles(next, false);
|
||||
}, [fetchFiles, hasMore, loading, page, refreshing]);
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<View style={styles.center}>
|
||||
<ActivityIndicator size="large" color="#1e40af" />
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
if (error) {
|
||||
return (
|
||||
<View style={styles.center}>
|
||||
<Text style={styles.errorText}>{error}</Text>
|
||||
<Pressable style={styles.retryButton} onPress={handleRefresh}>
|
||||
<Text style={styles.retryText}>Retry</Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<FlatList
|
||||
style={styles.list}
|
||||
data={files}
|
||||
keyExtractor={(item) => String(item.id)}
|
||||
contentContainerStyle={styles.listContent}
|
||||
renderItem={({ item }) => <FileRow file={item} />}
|
||||
refreshControl={
|
||||
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />
|
||||
}
|
||||
onEndReached={handleLoadMore}
|
||||
onEndReachedThreshold={0.4}
|
||||
ListEmptyComponent={
|
||||
<View style={styles.emptyState}>
|
||||
<Text style={styles.emptyEmoji}>📂</Text>
|
||||
<Text style={styles.emptyText}>No documents yet.</Text>
|
||||
<Text style={styles.emptyHint}>
|
||||
Upload a document from the Upload tab to get started.
|
||||
</Text>
|
||||
</View>
|
||||
}
|
||||
ListFooterComponent={
|
||||
hasMore && files.length > 0 ? (
|
||||
<ActivityIndicator color="#1e40af" style={{ marginVertical: 16 }} />
|
||||
) : null
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
function FileRow({ file }: { file: FileRecord }) {
|
||||
return (
|
||||
<View style={rowStyles.row}>
|
||||
<Text style={rowStyles.icon}>{statusEmoji(file.status)}</Text>
|
||||
<View style={rowStyles.info}>
|
||||
<Text style={rowStyles.filename} numberOfLines={1}>
|
||||
{file.filename}
|
||||
</Text>
|
||||
<Text style={rowStyles.meta}>
|
||||
{formatDate(file.created_at)} · {formatBytes(file.file_size)}
|
||||
</Text>
|
||||
</View>
|
||||
<Text style={rowStyles.status}>{file.status}</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
list: { flex: 1, backgroundColor: "#f9fafb" },
|
||||
listContent: { padding: 16 },
|
||||
center: {
|
||||
flex: 1,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
backgroundColor: "#f9fafb",
|
||||
padding: 24,
|
||||
},
|
||||
errorText: { color: "#dc2626", fontSize: 15, textAlign: "center", marginBottom: 16 },
|
||||
retryButton: {
|
||||
backgroundColor: "#1e40af",
|
||||
borderRadius: 8,
|
||||
paddingHorizontal: 24,
|
||||
paddingVertical: 10,
|
||||
},
|
||||
retryText: { color: "#fff", fontWeight: "600" },
|
||||
emptyState: { alignItems: "center", paddingTop: 60 },
|
||||
emptyEmoji: { fontSize: 48, marginBottom: 12 },
|
||||
emptyText: { fontSize: 16, color: "#374151", marginBottom: 8 },
|
||||
emptyHint: {
|
||||
fontSize: 13,
|
||||
color: "#6b7280",
|
||||
textAlign: "center",
|
||||
paddingHorizontal: 32,
|
||||
},
|
||||
});
|
||||
|
||||
const rowStyles = StyleSheet.create({
|
||||
row: {
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
backgroundColor: "#fff",
|
||||
borderRadius: 10,
|
||||
padding: 14,
|
||||
marginBottom: 10,
|
||||
shadowColor: "#000",
|
||||
shadowOpacity: 0.04,
|
||||
shadowOffset: { width: 0, height: 2 },
|
||||
shadowRadius: 4,
|
||||
elevation: 2,
|
||||
},
|
||||
icon: { fontSize: 22, marginRight: 12 },
|
||||
info: { flex: 1 },
|
||||
filename: {
|
||||
fontSize: 14,
|
||||
fontWeight: "600",
|
||||
color: "#111827",
|
||||
marginBottom: 4,
|
||||
},
|
||||
meta: { fontSize: 12, color: "#6b7280" },
|
||||
status: {
|
||||
fontSize: 11,
|
||||
color: "#6b7280",
|
||||
fontWeight: "500",
|
||||
textTransform: "capitalize",
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
* LoginScreen – entry point for unauthenticated users.
|
||||
*
|
||||
* Renders a server URL input and a "Sign in with SSO" button that opens the
|
||||
* DocuElevate web login page in the system browser. On success the
|
||||
* AuthContext stores the API token and navigates to the main app.
|
||||
*/
|
||||
|
||||
import React, { useState } from "react";
|
||||
import {
|
||||
ActivityIndicator,
|
||||
Alert,
|
||||
KeyboardAvoidingView,
|
||||
Platform,
|
||||
Pressable,
|
||||
StyleSheet,
|
||||
Text,
|
||||
TextInput,
|
||||
View,
|
||||
} from "react-native";
|
||||
import { useAuth } from "../context/AuthContext";
|
||||
|
||||
export default function LoginScreen() {
|
||||
const { signIn } = useAuth();
|
||||
const [serverUrl, setServerUrl] = useState("");
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
async function handleSignIn() {
|
||||
const url = serverUrl.trim();
|
||||
if (!url) {
|
||||
Alert.alert("Server URL required", "Please enter the URL of your DocuElevate server.");
|
||||
return;
|
||||
}
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
Alert.alert("Invalid URL", "The server URL must start with http:// or https://");
|
||||
return;
|
||||
}
|
||||
|
||||
setLoading(true);
|
||||
try {
|
||||
await signIn(url);
|
||||
} catch (err: unknown) {
|
||||
const message = err instanceof Error ? err.message : "Sign-in failed";
|
||||
Alert.alert("Sign-in failed", message);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<KeyboardAvoidingView
|
||||
style={styles.container}
|
||||
behavior={Platform.OS === "ios" ? "padding" : undefined}
|
||||
>
|
||||
<View style={styles.card}>
|
||||
<Text style={styles.logo}>DocuElevate</Text>
|
||||
<Text style={styles.tagline}>Intelligent Document Processing</Text>
|
||||
|
||||
<Text style={styles.label}>Server URL</Text>
|
||||
<TextInput
|
||||
style={styles.input}
|
||||
placeholder="https://your-docuelevate-server.com"
|
||||
placeholderTextColor="#9ca3af"
|
||||
value={serverUrl}
|
||||
onChangeText={setServerUrl}
|
||||
autoCapitalize="none"
|
||||
autoCorrect={false}
|
||||
keyboardType="url"
|
||||
returnKeyType="go"
|
||||
onSubmitEditing={handleSignIn}
|
||||
accessibilityLabel="Server URL"
|
||||
/>
|
||||
|
||||
<Pressable
|
||||
style={[styles.button, loading && styles.buttonDisabled]}
|
||||
onPress={handleSignIn}
|
||||
disabled={loading}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel="Sign in with SSO"
|
||||
>
|
||||
{loading ? (
|
||||
<ActivityIndicator color="#fff" />
|
||||
) : (
|
||||
<Text style={styles.buttonText}>Sign in with SSO</Text>
|
||||
)}
|
||||
</Pressable>
|
||||
|
||||
<Text style={styles.hint}>
|
||||
You will be redirected to your organisation's sign-in page.
|
||||
</Text>
|
||||
</View>
|
||||
</KeyboardAvoidingView>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: "#f3f4f6",
|
||||
justifyContent: "center",
|
||||
padding: 24,
|
||||
},
|
||||
card: {
|
||||
backgroundColor: "#ffffff",
|
||||
borderRadius: 16,
|
||||
padding: 28,
|
||||
shadowColor: "#000",
|
||||
shadowOpacity: 0.08,
|
||||
shadowOffset: { width: 0, height: 4 },
|
||||
shadowRadius: 12,
|
||||
elevation: 4,
|
||||
},
|
||||
logo: {
|
||||
fontSize: 28,
|
||||
fontWeight: "700",
|
||||
color: "#1e40af",
|
||||
textAlign: "center",
|
||||
marginBottom: 4,
|
||||
},
|
||||
tagline: {
|
||||
fontSize: 14,
|
||||
color: "#6b7280",
|
||||
textAlign: "center",
|
||||
marginBottom: 32,
|
||||
},
|
||||
label: {
|
||||
fontSize: 14,
|
||||
fontWeight: "600",
|
||||
color: "#374151",
|
||||
marginBottom: 6,
|
||||
},
|
||||
input: {
|
||||
borderWidth: 1,
|
||||
borderColor: "#d1d5db",
|
||||
borderRadius: 8,
|
||||
paddingHorizontal: 12,
|
||||
paddingVertical: 12,
|
||||
fontSize: 15,
|
||||
color: "#111827",
|
||||
marginBottom: 20,
|
||||
backgroundColor: "#f9fafb",
|
||||
},
|
||||
button: {
|
||||
backgroundColor: "#1e40af",
|
||||
borderRadius: 8,
|
||||
paddingVertical: 14,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
minHeight: 48,
|
||||
},
|
||||
buttonDisabled: {
|
||||
opacity: 0.6,
|
||||
},
|
||||
buttonText: {
|
||||
color: "#ffffff",
|
||||
fontSize: 16,
|
||||
fontWeight: "600",
|
||||
},
|
||||
hint: {
|
||||
marginTop: 16,
|
||||
fontSize: 12,
|
||||
color: "#9ca3af",
|
||||
textAlign: "center",
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,195 @@
|
||||
/**
|
||||
* ProfileScreen – authenticated user profile and settings.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
import {
|
||||
Alert,
|
||||
Image,
|
||||
Pressable,
|
||||
ScrollView,
|
||||
StyleSheet,
|
||||
Switch,
|
||||
Text,
|
||||
View,
|
||||
} from "react-native";
|
||||
import { useAuth } from "../context/AuthContext";
|
||||
|
||||
export default function ProfileScreen() {
|
||||
const { user, signOut, baseUrl } = useAuth();
|
||||
|
||||
function handleSignOut() {
|
||||
Alert.alert("Sign out", "Are you sure you want to sign out?", [
|
||||
{ text: "Cancel", style: "cancel" },
|
||||
{
|
||||
text: "Sign out",
|
||||
style: "destructive",
|
||||
onPress: signOut,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return (
|
||||
<View style={styles.center}>
|
||||
<Text style={styles.emptyText}>Not signed in</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<ScrollView style={styles.scroll} contentContainerStyle={styles.content}>
|
||||
{/* Avatar + name */}
|
||||
<View style={styles.profileCard}>
|
||||
{user.avatar_url ? (
|
||||
<Image
|
||||
source={{ uri: user.avatar_url }}
|
||||
style={styles.avatar}
|
||||
accessibilityLabel={`Avatar for ${user.display_name ?? user.owner_id}`}
|
||||
/>
|
||||
) : (
|
||||
<View style={[styles.avatar, styles.avatarPlaceholder]}>
|
||||
<Text style={styles.avatarInitial}>
|
||||
{(user.display_name ?? user.owner_id).charAt(0).toUpperCase()}
|
||||
</Text>
|
||||
</View>
|
||||
)}
|
||||
<Text style={styles.displayName}>{user.display_name ?? user.owner_id}</Text>
|
||||
{user.email && <Text style={styles.email}>{user.email}</Text>}
|
||||
{user.is_admin && <Text style={styles.adminBadge}>Admin</Text>}
|
||||
</View>
|
||||
|
||||
{/* Server info */}
|
||||
<View style={styles.section}>
|
||||
<Text style={styles.sectionTitle}>Connection</Text>
|
||||
<View style={styles.row}>
|
||||
<Text style={styles.rowLabel}>Server</Text>
|
||||
<Text style={styles.rowValue} numberOfLines={1}>
|
||||
{baseUrl || "–"}
|
||||
</Text>
|
||||
</View>
|
||||
<View style={styles.row}>
|
||||
<Text style={styles.rowLabel}>User ID</Text>
|
||||
<Text style={styles.rowValue} numberOfLines={1}>
|
||||
{user.owner_id}
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
{/* Danger zone */}
|
||||
<View style={styles.section}>
|
||||
<Pressable
|
||||
style={styles.signOutButton}
|
||||
onPress={handleSignOut}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel="Sign out"
|
||||
>
|
||||
<Text style={styles.signOutText}>Sign out</Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
</ScrollView>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
scroll: { flex: 1, backgroundColor: "#f9fafb" },
|
||||
content: { padding: 20 },
|
||||
center: {
|
||||
flex: 1,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
backgroundColor: "#f9fafb",
|
||||
},
|
||||
emptyText: { color: "#6b7280", fontSize: 16 },
|
||||
profileCard: {
|
||||
alignItems: "center",
|
||||
backgroundColor: "#fff",
|
||||
borderRadius: 16,
|
||||
padding: 24,
|
||||
marginBottom: 20,
|
||||
shadowColor: "#000",
|
||||
shadowOpacity: 0.06,
|
||||
shadowOffset: { width: 0, height: 4 },
|
||||
shadowRadius: 12,
|
||||
elevation: 3,
|
||||
},
|
||||
avatar: {
|
||||
width: 80,
|
||||
height: 80,
|
||||
borderRadius: 40,
|
||||
marginBottom: 14,
|
||||
},
|
||||
avatarPlaceholder: {
|
||||
backgroundColor: "#1e40af",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
},
|
||||
avatarInitial: {
|
||||
color: "#fff",
|
||||
fontSize: 32,
|
||||
fontWeight: "700",
|
||||
},
|
||||
displayName: {
|
||||
fontSize: 20,
|
||||
fontWeight: "700",
|
||||
color: "#111827",
|
||||
marginBottom: 4,
|
||||
},
|
||||
email: { fontSize: 14, color: "#6b7280", marginBottom: 6 },
|
||||
adminBadge: {
|
||||
backgroundColor: "#dbeafe",
|
||||
color: "#1e40af",
|
||||
fontSize: 11,
|
||||
fontWeight: "700",
|
||||
paddingHorizontal: 10,
|
||||
paddingVertical: 3,
|
||||
borderRadius: 12,
|
||||
overflow: "hidden",
|
||||
},
|
||||
section: {
|
||||
backgroundColor: "#fff",
|
||||
borderRadius: 12,
|
||||
padding: 16,
|
||||
marginBottom: 16,
|
||||
shadowColor: "#000",
|
||||
shadowOpacity: 0.04,
|
||||
shadowOffset: { width: 0, height: 2 },
|
||||
shadowRadius: 6,
|
||||
elevation: 2,
|
||||
},
|
||||
sectionTitle: {
|
||||
fontSize: 13,
|
||||
fontWeight: "700",
|
||||
color: "#6b7280",
|
||||
textTransform: "uppercase",
|
||||
letterSpacing: 0.5,
|
||||
marginBottom: 12,
|
||||
},
|
||||
row: {
|
||||
flexDirection: "row",
|
||||
justifyContent: "space-between",
|
||||
alignItems: "center",
|
||||
paddingVertical: 8,
|
||||
borderBottomWidth: 1,
|
||||
borderBottomColor: "#f3f4f6",
|
||||
},
|
||||
rowLabel: { fontSize: 14, color: "#374151" },
|
||||
rowValue: {
|
||||
fontSize: 14,
|
||||
color: "#6b7280",
|
||||
maxWidth: "60%",
|
||||
textAlign: "right",
|
||||
},
|
||||
signOutButton: {
|
||||
backgroundColor: "#fee2e2",
|
||||
borderRadius: 10,
|
||||
paddingVertical: 14,
|
||||
alignItems: "center",
|
||||
minHeight: 48,
|
||||
},
|
||||
signOutText: {
|
||||
color: "#dc2626",
|
||||
fontWeight: "700",
|
||||
fontSize: 15,
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,258 @@
|
||||
/**
|
||||
* UploadScreen – document upload via camera or file picker.
|
||||
*
|
||||
* Users can:
|
||||
* 1. Take a photo of a document with the device camera.
|
||||
* 2. Pick an existing file (PDF, image, Office document) from the Files app.
|
||||
* 3. Receive files shared from other apps via the iOS Share Sheet / Android
|
||||
* Share Intent (handled by the expo-sharing + deep-link integration).
|
||||
*/
|
||||
|
||||
import * as DocumentPicker from "expo-document-picker";
|
||||
import * as ImagePicker from "expo-image-picker";
|
||||
import React, { useState } from "react";
|
||||
import {
|
||||
ActivityIndicator,
|
||||
Alert,
|
||||
Pressable,
|
||||
ScrollView,
|
||||
StyleSheet,
|
||||
Text,
|
||||
View,
|
||||
} from "react-native";
|
||||
import { useAuth } from "../context/AuthContext";
|
||||
import api from "../services/api";
|
||||
|
||||
interface UploadItem {
|
||||
id: string;
|
||||
filename: string;
|
||||
status: "pending" | "uploading" | "done" | "error";
|
||||
error?: string;
|
||||
taskId?: string;
|
||||
}
|
||||
|
||||
export default function UploadScreen() {
|
||||
const { isAuthenticated } = useAuth();
|
||||
const [uploads, setUploads] = useState<UploadItem[]>([]);
|
||||
|
||||
function updateItem(id: string, patch: Partial<UploadItem>) {
|
||||
setUploads((prev) =>
|
||||
prev.map((item) => (item.id === id ? { ...item, ...patch } : item))
|
||||
);
|
||||
}
|
||||
|
||||
async function uploadFile(uri: string, filename: string, mimeType?: string) {
|
||||
const id = `${Date.now()}-${filename}`;
|
||||
setUploads((prev) => [
|
||||
{ id, filename, status: "uploading" },
|
||||
...prev,
|
||||
]);
|
||||
|
||||
try {
|
||||
const resp = await api.uploadFile(uri, filename, mimeType);
|
||||
updateItem(id, { status: "done", taskId: resp.task_id });
|
||||
} catch (err: unknown) {
|
||||
const msg = err instanceof Error ? err.message : "Upload failed";
|
||||
updateItem(id, { status: "error", error: msg });
|
||||
}
|
||||
}
|
||||
|
||||
async function handleCamera() {
|
||||
const { status } = await ImagePicker.requestCameraPermissionsAsync();
|
||||
if (status !== "granted") {
|
||||
Alert.alert(
|
||||
"Camera access required",
|
||||
"Please grant camera access in Settings to capture documents."
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await ImagePicker.launchCameraAsync({
|
||||
mediaTypes: ImagePicker.MediaTypeOptions.Images,
|
||||
quality: 0.9,
|
||||
allowsEditing: false,
|
||||
});
|
||||
|
||||
if (!result.canceled && result.assets.length > 0) {
|
||||
const asset = result.assets[0];
|
||||
const filename = `scan_${Date.now()}.jpg`;
|
||||
await uploadFile(asset.uri, filename, "image/jpeg");
|
||||
}
|
||||
}
|
||||
|
||||
async function handleFilePicker() {
|
||||
try {
|
||||
const result = await DocumentPicker.getDocumentAsync({
|
||||
type: "*/*",
|
||||
multiple: true,
|
||||
copyToCacheDirectory: true,
|
||||
});
|
||||
|
||||
if (!result.canceled) {
|
||||
for (const asset of result.assets) {
|
||||
await uploadFile(asset.uri, asset.name, asset.mimeType ?? undefined);
|
||||
}
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
Alert.alert("File picker error", err instanceof Error ? err.message : "Could not open file picker");
|
||||
}
|
||||
}
|
||||
|
||||
if (!isAuthenticated) {
|
||||
return (
|
||||
<View style={styles.center}>
|
||||
<Text style={styles.emptyText}>Please sign in to upload documents.</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
{/* Action buttons */}
|
||||
<View style={styles.actions}>
|
||||
<Pressable
|
||||
style={[styles.actionButton, styles.cameraButton]}
|
||||
onPress={handleCamera}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel="Capture document with camera"
|
||||
>
|
||||
<Text style={styles.actionIcon}>📷</Text>
|
||||
<Text style={styles.actionLabel}>Camera</Text>
|
||||
</Pressable>
|
||||
|
||||
<Pressable
|
||||
style={[styles.actionButton, styles.fileButton]}
|
||||
onPress={handleFilePicker}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel="Pick file from device"
|
||||
>
|
||||
<Text style={styles.actionIcon}>📄</Text>
|
||||
<Text style={styles.actionLabel}>File Picker</Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
|
||||
{/* Upload list */}
|
||||
<ScrollView style={styles.list} contentContainerStyle={styles.listContent}>
|
||||
{uploads.length === 0 ? (
|
||||
<View style={styles.emptyState}>
|
||||
<Text style={styles.emptyEmoji}>☁️</Text>
|
||||
<Text style={styles.emptyText}>
|
||||
Tap Camera or File Picker to upload a document.
|
||||
</Text>
|
||||
<Text style={styles.emptyHint}>
|
||||
You can also share files from other apps directly to DocuElevate.
|
||||
</Text>
|
||||
</View>
|
||||
) : (
|
||||
uploads.map((item) => (
|
||||
<UploadRow key={item.id} item={item} />
|
||||
))
|
||||
)}
|
||||
</ScrollView>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
function UploadRow({ item }: { item: UploadItem }) {
|
||||
const icons: Record<UploadItem["status"], string> = {
|
||||
pending: "⏳",
|
||||
uploading: "⬆️",
|
||||
done: "✅",
|
||||
error: "❌",
|
||||
};
|
||||
|
||||
return (
|
||||
<View style={rowStyles.row}>
|
||||
<Text style={rowStyles.icon}>{icons[item.status]}</Text>
|
||||
<View style={rowStyles.info}>
|
||||
<Text style={rowStyles.filename} numberOfLines={1}>
|
||||
{item.filename}
|
||||
</Text>
|
||||
{item.status === "uploading" && (
|
||||
<ActivityIndicator size="small" color="#1e40af" />
|
||||
)}
|
||||
{item.status === "done" && (
|
||||
<Text style={rowStyles.statusDone}>Queued for processing</Text>
|
||||
)}
|
||||
{item.status === "error" && (
|
||||
<Text style={rowStyles.statusError}>{item.error}</Text>
|
||||
)}
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: { flex: 1, backgroundColor: "#f9fafb" },
|
||||
actions: {
|
||||
flexDirection: "row",
|
||||
padding: 16,
|
||||
gap: 12,
|
||||
},
|
||||
actionButton: {
|
||||
flex: 1,
|
||||
borderRadius: 12,
|
||||
paddingVertical: 20,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
minHeight: 80,
|
||||
},
|
||||
cameraButton: { backgroundColor: "#1e40af" },
|
||||
fileButton: { backgroundColor: "#059669" },
|
||||
actionIcon: { fontSize: 28, marginBottom: 6 },
|
||||
actionLabel: {
|
||||
color: "#fff",
|
||||
fontSize: 14,
|
||||
fontWeight: "600",
|
||||
},
|
||||
list: { flex: 1 },
|
||||
listContent: { padding: 16 },
|
||||
emptyState: {
|
||||
alignItems: "center",
|
||||
paddingTop: 60,
|
||||
},
|
||||
emptyEmoji: { fontSize: 48, marginBottom: 12 },
|
||||
emptyText: {
|
||||
fontSize: 16,
|
||||
color: "#374151",
|
||||
textAlign: "center",
|
||||
marginBottom: 8,
|
||||
},
|
||||
emptyHint: {
|
||||
fontSize: 13,
|
||||
color: "#6b7280",
|
||||
textAlign: "center",
|
||||
paddingHorizontal: 32,
|
||||
},
|
||||
center: {
|
||||
flex: 1,
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
},
|
||||
});
|
||||
|
||||
const rowStyles = StyleSheet.create({
|
||||
row: {
|
||||
flexDirection: "row",
|
||||
alignItems: "center",
|
||||
backgroundColor: "#fff",
|
||||
borderRadius: 10,
|
||||
padding: 14,
|
||||
marginBottom: 10,
|
||||
shadowColor: "#000",
|
||||
shadowOpacity: 0.04,
|
||||
shadowOffset: { width: 0, height: 2 },
|
||||
shadowRadius: 4,
|
||||
elevation: 2,
|
||||
},
|
||||
icon: { fontSize: 22, marginRight: 12 },
|
||||
info: { flex: 1 },
|
||||
filename: {
|
||||
fontSize: 14,
|
||||
fontWeight: "600",
|
||||
color: "#111827",
|
||||
marginBottom: 4,
|
||||
},
|
||||
statusDone: { fontSize: 12, color: "#059669" },
|
||||
statusError: { fontSize: 12, color: "#dc2626" },
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user