feat(i18n): replace hardcoded English text with translation keys in help, index, search templates
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
+84
-102
@@ -1,16 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Help Center – DocuElevate{% endblock %}
|
||||
{% block title %}{{ _("help.page_title") }} – DocuElevate{% endblock %}
|
||||
|
||||
{% block head_extra %}
|
||||
<!-- SEO meta tags -->
|
||||
<meta name="description" content="DocuElevate Help Center – learn how to upload, process, and route your documents automatically. Get started with sources, destinations, workflows, and integrations.">
|
||||
<meta name="description" content="{{ _('help.meta_description') }}">
|
||||
<meta name="keywords" content="DocuElevate, help, support, document processing, OCR, cloud storage, workflow automation, SaaS">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://{{ external_hostname }}/help">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:title" content="Help Center – DocuElevate">
|
||||
<meta property="og:description" content="Everything you need to get started with DocuElevate: upload documents, automate workflows, and connect your favourite cloud storage.">
|
||||
<meta property="og:title" content="{{ _('help.page_title') }} – DocuElevate">
|
||||
<meta property="og:description" content="{{ _('help.og_description') }}">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://{{ external_hostname }}/help">
|
||||
|
||||
@@ -63,18 +63,17 @@
|
||||
<!-- ═══════════════════════ Hero Section ═══════════════════════ -->
|
||||
<header class="text-center mb-14">
|
||||
<h1 class="text-4xl md:text-5xl font-extrabold text-gray-900 mb-4">
|
||||
<i class="fas fa-life-ring text-blue-500 mr-2" aria-hidden="true"></i>Help Center
|
||||
<i class="fas fa-life-ring text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.heading") }}
|
||||
</h1>
|
||||
<p class="text-lg md:text-xl text-gray-600 max-w-2xl mx-auto leading-relaxed">
|
||||
Everything you need to get the most out of DocuElevate.
|
||||
Browse topics below or search for what you need.
|
||||
{{ _("help.subheading") }}
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<!-- ═══════════════════════ Quick-start Cards ═══════════════════════ -->
|
||||
<section aria-labelledby="quickstart-heading" class="mb-16">
|
||||
<h2 id="quickstart-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-rocket text-blue-500 mr-2" aria-hidden="true"></i>Quick Start
|
||||
<i class="fas fa-rocket text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.quickstart_heading") }}
|
||||
</h2>
|
||||
<div class="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
||||
|
||||
@@ -84,11 +83,10 @@
|
||||
<span class="flex items-center justify-center w-10 h-10 rounded-full bg-blue-100 text-blue-600 mr-3" aria-hidden="true">
|
||||
<i class="fas fa-cloud-arrow-up"></i>
|
||||
</span>
|
||||
<h3 class="text-lg font-semibold text-gray-800">Upload Documents</h3>
|
||||
<h3 class="text-lg font-semibold text-gray-800">{{ _("help.quickstart_upload") }}</h3>
|
||||
</div>
|
||||
<p class="text-gray-600 text-sm leading-relaxed">
|
||||
Drag & drop files onto the <strong>Upload</strong> page or click <em>Choose File</em>.
|
||||
DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.
|
||||
{{ _("help.quickstart_upload_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -98,11 +96,10 @@
|
||||
<span class="flex items-center justify-center w-10 h-10 rounded-full bg-green-100 text-green-600 mr-3" aria-hidden="true">
|
||||
<i class="fas fa-plug"></i>
|
||||
</span>
|
||||
<h3 class="text-lg font-semibold text-gray-800">Connect Storage</h3>
|
||||
<h3 class="text-lg font-semibold text-gray-800">{{ _("help.quickstart_storage") }}</h3>
|
||||
</div>
|
||||
<p class="text-gray-600 text-sm leading-relaxed">
|
||||
Head to <strong>Settings → Integrations</strong> and link your cloud accounts.
|
||||
Processed documents are automatically routed to every destination you configure.
|
||||
{{ _("help.quickstart_storage_desc_full") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -112,11 +109,10 @@
|
||||
<span class="flex items-center justify-center w-10 h-10 rounded-full bg-purple-100 text-purple-600 mr-3" aria-hidden="true">
|
||||
<i class="fas fa-wand-magic-sparkles"></i>
|
||||
</span>
|
||||
<h3 class="text-lg font-semibold text-gray-800">Automate Workflows</h3>
|
||||
<h3 class="text-lg font-semibold text-gray-800">{{ _("help.quickstart_workflows") }}</h3>
|
||||
</div>
|
||||
<p class="text-gray-600 text-sm leading-relaxed">
|
||||
Create <strong>Pipelines</strong> to define multi-step processing and routing rules.
|
||||
Combine OCR, AI extraction, format conversion, and delivery in a single flow.
|
||||
{{ _("help.quickstart_workflows_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -126,39 +122,35 @@
|
||||
<!-- ═══════════════════════ Sources ═══════════════════════ -->
|
||||
<section aria-labelledby="sources-heading" class="mb-16">
|
||||
<h2 id="sources-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-arrow-right-to-bracket text-blue-500 mr-2" aria-hidden="true"></i>Sources – Getting Documents In
|
||||
<i class="fas fa-arrow-right-to-bracket text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.sources_heading") }}
|
||||
</h2>
|
||||
<div class="grid gap-6 sm:grid-cols-2">
|
||||
|
||||
<article class="bg-white shadow rounded-lg p-6">
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-upload mr-2 text-gray-400" aria-hidden="true"></i>Web Upload</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-upload mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.sources_web_upload") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
The fastest way to get started. Open the <strong>Upload</strong> 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.sources_web_upload_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="bg-white shadow rounded-lg p-6">
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-envelope-open-text mr-2 text-gray-400" aria-hidden="true"></i>Email Ingestion (IMAP)</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-envelope-open-text mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.sources_email_ingestion") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Forward documents to a dedicated mailbox. Under <strong>Email Ingestion</strong>, add one or more IMAP accounts.
|
||||
DocuElevate polls for new messages and processes attachments automatically.
|
||||
{{ _("help.sources_email_ingestion_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="bg-white shadow rounded-lg p-6">
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-code mr-2 text-gray-400" aria-hidden="true"></i>REST API</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-code mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.sources_rest_api") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Integrate programmatically by <code class="bg-gray-100 px-1 rounded text-xs">POST</code>-ing files to <code class="bg-gray-100 px-1 rounded text-xs">/api/upload</code>.
|
||||
Ideal for scripts, watched folders, scanners, or third-party tools like Zapier and n8n.
|
||||
{{ _("help.sources_rest_api_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="bg-white shadow rounded-lg p-6">
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-print mr-2 text-gray-400" aria-hidden="true"></i>Scanner & Mobile</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2"><i class="fas fa-print mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.sources_scanner") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Point network scanners (HP, Fujitsu ScanSnap, Brother) at DocuElevate's upload endpoint or
|
||||
use any mobile scanning app that supports custom HTTP destinations.
|
||||
{{ _("help.sources_scanner_desc_full") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -168,79 +160,79 @@
|
||||
<!-- ═══════════════════════ Destinations ═══════════════════════ -->
|
||||
<section aria-labelledby="destinations-heading" class="mb-16">
|
||||
<h2 id="destinations-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-arrow-right-from-bracket text-blue-500 mr-2" aria-hidden="true"></i>Destinations – Where Documents Go
|
||||
<i class="fas fa-arrow-right-from-bracket text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.destinations_heading") }}
|
||||
</h2>
|
||||
<div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fab fa-dropbox text-blue-500 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Dropbox</h3>
|
||||
<p class="text-gray-500 text-xs">OAuth-linked. Files land in your chosen folder.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_dropbox") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_dropbox_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fab fa-google-drive text-green-500 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Google Drive</h3>
|
||||
<p class="text-gray-500 text-xs">Service account or OAuth. Supports shared drives.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_google_drive") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_google_drive_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fab fa-microsoft text-blue-600 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">OneDrive</h3>
|
||||
<p class="text-gray-500 text-xs">Microsoft Graph API integration.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_onedrive") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_onedrive_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fab fa-aws text-yellow-600 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Amazon S3</h3>
|
||||
<p class="text-gray-500 text-xs">Any S3-compatible bucket (AWS, MinIO, Wasabi).</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_s3") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_s3_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fas fa-cloud text-blue-400 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Nextcloud / WebDAV</h3>
|
||||
<p class="text-gray-500 text-xs">Self-hosted cloud storage via WebDAV.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_nextcloud") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_nextcloud_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fas fa-leaf text-green-600 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Paperless-ngx</h3>
|
||||
<p class="text-gray-500 text-xs">Push documents straight into Paperless for archival.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_paperless") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_paperless_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fas fa-server text-gray-500 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">SFTP / FTP</h3>
|
||||
<p class="text-gray-500 text-xs">Secure file transfer to any server.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_sftp") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_sftp_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fas fa-envelope text-red-400 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Email Forwarding</h3>
|
||||
<p class="text-gray-500 text-xs">Processed files sent as SMTP attachments.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_email") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_email_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start bg-white shadow rounded-lg p-5">
|
||||
<i class="fas fa-link text-indigo-500 text-xl mr-3 mt-0.5" aria-hidden="true"></i>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">Webhook</h3>
|
||||
<p class="text-gray-500 text-xs">POST metadata to any external endpoint.</p>
|
||||
<h3 class="font-semibold text-gray-800 text-sm">{{ _("help.destinations_webhook") }}</h3>
|
||||
<p class="text-gray-500 text-xs">{{ _("help.destinations_webhook_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -250,32 +242,31 @@
|
||||
<!-- ═══════════════════════ Workflows / Pipelines ═══════════════════════ -->
|
||||
<section aria-labelledby="workflows-heading" class="mb-16">
|
||||
<h2 id="workflows-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-diagram-project text-blue-500 mr-2" aria-hidden="true"></i>Workflows & Pipelines
|
||||
<i class="fas fa-diagram-project text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.workflows_heading") }}
|
||||
</h2>
|
||||
<div class="bg-white shadow rounded-lg p-6">
|
||||
<div class="grid gap-6 md:grid-cols-2">
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">What is a Pipeline?</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">{{ _("help.workflows_what_is") }}</h3>
|
||||
<p class="text-gray-600 text-sm leading-relaxed mb-4">
|
||||
A <strong>Pipeline</strong> 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_definition") }}
|
||||
</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">Typical Steps</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">{{ _("help.workflows_typical_steps") }}</h3>
|
||||
<ol class="list-decimal list-inside text-gray-600 text-sm space-y-1">
|
||||
<li>Convert to PDF (Gotenberg)</li>
|
||||
<li>OCR – extract text (Azure, Tesseract, Mistral …)</li>
|
||||
<li>AI metadata extraction (OpenAI, Claude, Gemini …)</li>
|
||||
<li>Deliver to one or more destinations</li>
|
||||
<li>{{ _("help.workflows_step_1_full") }}</li>
|
||||
<li>{{ _("help.workflows_step_2_full") }}</li>
|
||||
<li>{{ _("help.workflows_step_3_full") }}</li>
|
||||
<li>{{ _("help.workflows_step_4") }}</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">Creating a Pipeline</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-2">{{ _("help.workflows_creating") }}</h3>
|
||||
<ol class="list-decimal list-inside text-gray-600 text-sm space-y-2 leading-relaxed">
|
||||
<li>Go to <strong>Pipelines</strong> in the main menu.</li>
|
||||
<li>Click <em>New Pipeline</em> and give it a name.</li>
|
||||
<li>Add the processing steps you need.</li>
|
||||
<li>Choose one or more delivery destinations.</li>
|
||||
<li>Save – new documents will be processed through this pipeline automatically.</li>
|
||||
<li>{{ _("help.workflows_step_1_create") }}</li>
|
||||
<li>{{ _("help.workflows_step_2_create") }}</li>
|
||||
<li>{{ _("help.workflows_step_3_create") }}</li>
|
||||
<li>{{ _("help.workflows_step_4_create") }}</li>
|
||||
<li>{{ _("help.workflows_step_5_create") }}</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
@@ -285,47 +276,43 @@
|
||||
<!-- ═══════════════════════ Data Ingestion Tools ═══════════════════════ -->
|
||||
<section aria-labelledby="ingestion-heading" class="mb-16">
|
||||
<h2 id="ingestion-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-toolbox text-blue-500 mr-2" aria-hidden="true"></i>Ingesting Data with Standard Tools
|
||||
<i class="fas fa-toolbox text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.ingestion_heading") }}
|
||||
</h2>
|
||||
<div class="bg-white shadow rounded-lg p-6 space-y-6">
|
||||
|
||||
<article>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-terminal mr-2 text-gray-400" aria-hidden="true"></i>cURL</h3>
|
||||
<p class="text-gray-600 text-sm mb-2">Upload a file from any terminal:</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-terminal mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.ingestion_curl") }}</h3>
|
||||
<p class="text-gray-600 text-sm mb-2">{{ _("help.ingestion_curl_desc") }}</p>
|
||||
<pre class="bg-gray-50 text-sm rounded p-3 overflow-x-auto"><code>curl -X POST https://your-instance/api/upload \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-F "file=@/path/to/document.pdf"</code></pre>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-folder-open mr-2 text-gray-400" aria-hidden="true"></i>Watched Folders</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-folder-open mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.ingestion_watched_folders") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Use <strong>inotifywait</strong> (Linux), <strong>fswatch</strong> (macOS), or any file-watcher script to
|
||||
<code class="bg-gray-100 px-1 rounded text-xs">POST</code> new files as soon as they appear in a local directory.
|
||||
{{ _("help.ingestion_watched_folders_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-print mr-2 text-gray-400" aria-hidden="true"></i>Network Scanners</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-print mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.ingestion_scanners") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Configure your HP, Fujitsu ScanSnap, or Brother scanner to use DocuElevate's upload URL as a
|
||||
<em>Scan-to-Network</em> destination. Scans are processed the moment they arrive.
|
||||
{{ _("help.ingestion_scanners_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-mobile-screen-button mr-2 text-gray-400" aria-hidden="true"></i>Mobile Scanning Apps</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-mobile-screen-button mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.ingestion_mobile") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Apps like <strong>Adobe Scan</strong>, <strong>Microsoft Lens</strong>, or <strong>Genius Scan</strong>
|
||||
can export to a custom HTTP endpoint. Point them at <code class="bg-gray-100 px-1 rounded text-xs">/api/upload</code>.
|
||||
{{ _("help.ingestion_mobile_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-shuffle mr-2 text-gray-400" aria-hidden="true"></i>Zapier / n8n / Make</h3>
|
||||
<h3 class="font-semibold text-gray-800 mb-1"><i class="fas fa-shuffle mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.ingestion_zapier") }}</h3>
|
||||
<p class="text-gray-600 text-sm">
|
||||
Connect DocuElevate to thousands of other apps via integration platforms.
|
||||
Use the HTTP/Webhook module to <code class="bg-gray-100 px-1 rounded text-xs">POST</code> files to the upload API.
|
||||
{{ _("help.ingestion_zapier_desc") }}
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -335,7 +322,7 @@
|
||||
<!-- ═══════════════════════ FAQ ═══════════════════════ -->
|
||||
<section aria-labelledby="faq-heading" class="mb-16">
|
||||
<h2 id="faq-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-circle-question text-blue-500 mr-2" aria-hidden="true"></i>Frequently Asked Questions
|
||||
<i class="fas fa-circle-question text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.faq_heading") }}
|
||||
</h2>
|
||||
<div class="space-y-4" x-data="{ open: null }">
|
||||
|
||||
@@ -345,12 +332,11 @@
|
||||
@click="open = open === 1 ? null : 1"
|
||||
:aria-expanded="open === 1 ? 'true' : 'false'"
|
||||
aria-controls="faq-1">
|
||||
<span>How do I upload documents?</span>
|
||||
<span>{{ _("help.faq_1_q") }}</span>
|
||||
<i class="fas fa-chevron-down text-gray-400 transition-transform" :class="{ 'rotate-180': open === 1 }" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div id="faq-1" x-show="open === 1" x-collapse class="px-6 pb-4 text-gray-600 text-sm leading-relaxed">
|
||||
Navigate to the <strong>Upload</strong> page, drag-and-drop your files or click <em>Choose File</em>.
|
||||
DocuElevate converts images and office documents to PDF, runs OCR, and extracts metadata automatically.
|
||||
{{ _("help.faq_1_a") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -360,12 +346,11 @@
|
||||
@click="open = open === 2 ? null : 2"
|
||||
:aria-expanded="open === 2 ? 'true' : 'false'"
|
||||
aria-controls="faq-2">
|
||||
<span>Which file formats are supported?</span>
|
||||
<span>{{ _("help.faq_2_q") }}</span>
|
||||
<i class="fas fa-chevron-down text-gray-400 transition-transform" :class="{ 'rotate-180': open === 2 }" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div id="faq-2" x-show="open === 2" x-collapse class="px-6 pb-4 text-gray-600 text-sm leading-relaxed">
|
||||
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_a") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -375,12 +360,11 @@
|
||||
@click="open = open === 3 ? null : 3"
|
||||
:aria-expanded="open === 3 ? 'true' : 'false'"
|
||||
aria-controls="faq-3">
|
||||
<span>Can I ingest documents from email?</span>
|
||||
<span>{{ _("help.faq_3_q") }}</span>
|
||||
<i class="fas fa-chevron-down text-gray-400 transition-transform" :class="{ 'rotate-180': open === 3 }" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div id="faq-3" x-show="open === 3" x-collapse class="px-6 pb-4 text-gray-600 text-sm leading-relaxed">
|
||||
Yes. Go to <strong>Email Ingestion</strong>, add an IMAP account, and DocuElevate will poll for new
|
||||
messages and process attachments automatically.
|
||||
{{ _("help.faq_3_a") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -390,12 +374,11 @@
|
||||
@click="open = open === 4 ? null : 4"
|
||||
:aria-expanded="open === 4 ? 'true' : 'false'"
|
||||
aria-controls="faq-4">
|
||||
<span>How do processing pipelines work?</span>
|
||||
<span>{{ _("help.faq_4_q") }}</span>
|
||||
<i class="fas fa-chevron-down text-gray-400 transition-transform" :class="{ 'rotate-180': open === 4 }" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div id="faq-4" x-show="open === 4" x-collapse class="px-6 pb-4 text-gray-600 text-sm leading-relaxed">
|
||||
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 <strong>Pipelines</strong> page.
|
||||
{{ _("help.faq_4_a") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -405,12 +388,11 @@
|
||||
@click="open = open === 5 ? null : 5"
|
||||
:aria-expanded="open === 5 ? 'true' : 'false'"
|
||||
aria-controls="faq-5">
|
||||
<span>Is my data secure?</span>
|
||||
<span>{{ _("help.faq_5_q") }}</span>
|
||||
<i class="fas fa-chevron-down text-gray-400 transition-transform" :class="{ 'rotate-180': open === 5 }" aria-hidden="true"></i>
|
||||
</button>
|
||||
<div id="faq-5" x-show="open === 5" x-collapse class="px-6 pb-4 text-gray-600 text-sm leading-relaxed">
|
||||
DocuElevate encrypts credentials at rest, communicates over TLS, and never stores your documents
|
||||
longer than necessary. See the <a href="/privacy" class="text-blue-600 hover:underline">Privacy Notice</a> for full details.
|
||||
{{ _("help.faq_5_a_pre") }}<a href="/privacy" class="text-blue-600 hover:underline">{{ _("help.privacy_notice") }}</a>{{ _("help.faq_5_a_post") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -420,7 +402,7 @@
|
||||
<!-- ═══════════════════════ Contact / Support ═══════════════════════ -->
|
||||
<section aria-labelledby="support-heading" class="mb-10">
|
||||
<h2 id="support-heading" class="text-2xl font-bold text-gray-800 mb-6">
|
||||
<i class="fas fa-headset text-blue-500 mr-2" aria-hidden="true"></i>Contact Support
|
||||
<i class="fas fa-headset text-blue-500 mr-2" aria-hidden="true"></i>{{ _("help.support_heading") }}
|
||||
</h2>
|
||||
|
||||
<div class="grid gap-6 md:grid-cols-2">
|
||||
@@ -428,7 +410,7 @@
|
||||
<!-- Left column: info -->
|
||||
<div class="bg-white shadow rounded-lg p-6 space-y-4">
|
||||
<p class="text-gray-600 text-sm leading-relaxed">
|
||||
Can't find what you're looking for? Our support team is here to help.
|
||||
{{ _("help.support_description") }}
|
||||
</p>
|
||||
|
||||
{% if support_email %}
|
||||
@@ -441,7 +423,7 @@
|
||||
{% if zammad_chat_enabled and zammad_url %}
|
||||
<div class="flex items-center text-sm text-gray-700">
|
||||
<i class="fas fa-comments text-blue-500 mr-2" aria-hidden="true"></i>
|
||||
<span>Live chat available – look for the chat bubble in the bottom-right corner.</span>
|
||||
<span>{{ _("help.support_live_chat") }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -450,22 +432,22 @@
|
||||
{% if zammad_form_enabled and zammad_url %}
|
||||
<div class="bg-white shadow rounded-lg p-6">
|
||||
<h3 class="font-semibold text-gray-800 mb-3">
|
||||
<i class="fas fa-ticket mr-2 text-gray-400" aria-hidden="true"></i>Open a Support Ticket
|
||||
<i class="fas fa-ticket mr-2 text-gray-400" aria-hidden="true"></i>{{ _("help.support_ticket_heading") }}
|
||||
</h3>
|
||||
<p class="text-gray-600 text-sm mb-4">
|
||||
Describe your issue below and we'll get back to you as soon as possible.
|
||||
{{ _("help.support_ticket_desc") }}
|
||||
</p>
|
||||
<button id="zammad-feedback-form"
|
||||
type="button"
|
||||
class="inline-flex items-center bg-blue-600 hover:bg-blue-700 text-white font-semibold py-2 px-5 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-blue-400 min-h-[44px]">
|
||||
<i class="fas fa-paper-plane mr-2" aria-hidden="true"></i>Submit a Ticket
|
||||
<i class="fas fa-paper-plane mr-2" aria-hidden="true"></i>{{ _("help.support_ticket_button") }}
|
||||
</button>
|
||||
</div>
|
||||
{% elif not zammad_form_enabled and not support_email and not zammad_chat_enabled %}
|
||||
<div class="bg-white shadow rounded-lg p-6 flex flex-col items-center justify-center text-center">
|
||||
<i class="fas fa-info-circle text-blue-400 text-2xl mb-2" aria-hidden="true"></i>
|
||||
<p class="text-gray-500 text-sm">
|
||||
Contact your administrator for support information.
|
||||
{{ _("help.support_admin_message") }}
|
||||
</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{% if multi_user_enabled and not is_logged_in %}DocuElevate – Intelligent Document Processing{% else %}Dashboard – DocuElevate{% endif %}{% endblock %}
|
||||
{% block title %}{% if multi_user_enabled and not is_logged_in %}{{ _("index.page_title_public") }}{% else %}{{ _("index.page_title_dashboard") }}{% endif %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="{% if multi_user_enabled and not is_logged_in %}bg-gray-50 min-h-screen{% else %}container mx-auto px-4 py-8{% endif %}">
|
||||
@@ -13,30 +13,29 @@
|
||||
<div class="bg-gradient-to-br from-blue-700 via-indigo-700 to-purple-700 text-white py-20 px-4">
|
||||
<div class="max-w-4xl mx-auto text-center">
|
||||
<span class="inline-block bg-white/20 text-white text-xs font-semibold uppercase tracking-widest px-3 py-1 rounded-full mb-4">
|
||||
Intelligent Document Processing
|
||||
{{ _("index.badge_intelligent") }}
|
||||
</span>
|
||||
<h1 class="text-4xl sm:text-5xl font-extrabold mb-4 leading-tight">
|
||||
From upload to insight — automatically.
|
||||
{{ _("index.hero_heading") }}
|
||||
</h1>
|
||||
<p class="text-indigo-100 text-lg max-w-2xl mx-auto mb-8">
|
||||
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_description") }}
|
||||
</p>
|
||||
<div class="flex flex-wrap justify-center gap-4">
|
||||
{% if allow_signup %}
|
||||
<a href="/signup"
|
||||
class="bg-white text-indigo-700 hover:bg-indigo-50 font-bold py-3 px-8 rounded-xl shadow-lg transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-user-plus mr-2" aria-hidden="true"></i> Get Started — it's free
|
||||
<i class="fas fa-user-plus mr-2" aria-hidden="true"></i> {{ _("index.hero_signup") }}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/login"
|
||||
class="bg-white text-indigo-700 hover:bg-indigo-50 font-bold py-3 px-8 rounded-xl shadow-lg transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-sign-in-alt mr-2" aria-hidden="true"></i> Log In
|
||||
<i class="fas fa-sign-in-alt mr-2" aria-hidden="true"></i> {{ _("index.hero_login") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="/pricing"
|
||||
class="bg-transparent border-2 border-white text-white hover:bg-white hover:text-indigo-700 font-bold py-3 px-8 rounded-xl transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-tags mr-2" aria-hidden="true"></i> View Plans & Pricing
|
||||
<i class="fas fa-tags mr-2" aria-hidden="true"></i> {{ _("index.hero_pricing") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -44,7 +43,7 @@
|
||||
|
||||
<!-- Feature grid -->
|
||||
<div class="max-w-6xl mx-auto px-4 py-16">
|
||||
<h2 class="text-2xl font-bold text-center text-gray-800 mb-10">Everything you need for smart document workflows</h2>
|
||||
<h2 class="text-2xl font-bold text-center text-gray-800 mb-10">{{ _("index.feature_section_title") }}</h2>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
|
||||
<div class="bg-white rounded-2xl shadow p-6 flex gap-4">
|
||||
@@ -52,8 +51,8 @@
|
||||
<i class="fas fa-file-alt text-blue-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">OCR & Text Extraction</h3>
|
||||
<p class="text-gray-500 text-sm">Azure Document Intelligence converts scanned PDFs and images into fully searchable text automatically.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_ocr") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_ocr_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -62,8 +61,8 @@
|
||||
<i class="fas fa-brain text-indigo-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">AI Metadata Extraction</h3>
|
||||
<p class="text-gray-500 text-sm">OpenAI, Claude, Gemini, and other pluggable AI providers classify documents and pull out key fields like dates, amounts, and subjects.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_ai") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_ai_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -72,8 +71,8 @@
|
||||
<i class="fas fa-cloud-upload-alt text-green-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">Multi-Cloud Storage</h3>
|
||||
<p class="text-gray-500 text-sm">Route processed files to Dropbox, Google Drive, OneDrive, Amazon S3, Nextcloud, Paperless NGX, WebDAV, FTP/SFTP, and more.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_cloud") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_cloud_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -82,8 +81,8 @@
|
||||
<i class="fas fa-mail-bulk text-yellow-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">Email & IMAP Ingestion</h3>
|
||||
<p class="text-gray-500 text-sm">Automatically pull documents from Gmail or any IMAP mailbox — no manual uploads needed.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_email") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_email_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -92,8 +91,8 @@
|
||||
<i class="fas fa-search text-purple-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">Full-Text Search</h3>
|
||||
<p class="text-gray-500 text-sm">Instantly find any document by content, metadata, or tags across your entire archive.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_search") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_search_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -102,8 +101,8 @@
|
||||
<i class="fas fa-project-diagram text-pink-600 text-xl" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">Custom Pipelines</h3>
|
||||
<p class="text-gray-500 text-sm">Build processing pipelines with configurable steps — OCR, AI extraction, format conversion, and storage routing in any order.</p>
|
||||
<h3 class="font-semibold text-gray-800 mb-1">{{ _("index.feature_pipelines") }}</h3>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.feature_pipelines_desc") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -113,23 +112,23 @@
|
||||
<!-- CTA banner -->
|
||||
<div class="bg-indigo-700 text-white py-14 px-4">
|
||||
<div class="max-w-2xl mx-auto text-center">
|
||||
<h2 class="text-3xl font-extrabold mb-4">Ready to elevate your document workflow?</h2>
|
||||
<p class="text-indigo-200 mb-8">Join teams already automating their document processing with DocuElevate.</p>
|
||||
<h2 class="text-3xl font-extrabold mb-4">{{ _("index.cta_heading") }}</h2>
|
||||
<p class="text-indigo-200 mb-8">{{ _("index.cta_description") }}</p>
|
||||
<div class="flex flex-wrap justify-center gap-4">
|
||||
{% if allow_signup %}
|
||||
<a href="/signup"
|
||||
class="bg-white text-indigo-700 hover:bg-indigo-50 font-bold py-3 px-8 rounded-xl shadow-lg transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-rocket mr-2" aria-hidden="true"></i> Create a free account
|
||||
<i class="fas fa-rocket mr-2" aria-hidden="true"></i> {{ _("index.cta_signup") }}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/login"
|
||||
class="bg-white text-indigo-700 hover:bg-indigo-50 font-bold py-3 px-8 rounded-xl shadow-lg transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-sign-in-alt mr-2" aria-hidden="true"></i> Log In
|
||||
<i class="fas fa-sign-in-alt mr-2" aria-hidden="true"></i> {{ _("index.hero_login") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="/pricing"
|
||||
class="bg-transparent border-2 border-white text-white hover:bg-white hover:text-indigo-700 font-bold py-3 px-8 rounded-xl transition duration-200 flex items-center min-h-[44px]">
|
||||
<i class="fas fa-tags mr-2" aria-hidden="true"></i> See pricing
|
||||
<i class="fas fa-tags mr-2" aria-hidden="true"></i> {{ _("index.cta_pricing") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -145,16 +144,16 @@
|
||||
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold mb-1">DocuElevate</h1>
|
||||
<p class="text-blue-100 text-sm">Intelligent document processing & management — built for teams</p>
|
||||
<p class="text-blue-100 text-sm">{{ _("index.dashboard_subtitle_teams") }}</p>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<a href="/upload"
|
||||
class="bg-white text-blue-700 hover:bg-blue-50 font-semibold py-2 px-5 rounded-lg transition duration-200 flex items-center shadow-sm">
|
||||
<i class="fas fa-upload mr-2" aria-hidden="true"></i> Upload
|
||||
<i class="fas fa-upload mr-2" aria-hidden="true"></i> {{ _("index.button_upload") }}
|
||||
</a>
|
||||
<a href="/files"
|
||||
class="bg-transparent border border-white text-white hover:bg-white hover:text-blue-700 font-semibold py-2 px-5 rounded-lg transition duration-200 flex items-center">
|
||||
<i class="fas fa-list mr-2" aria-hidden="true"></i> Browse Files
|
||||
<i class="fas fa-list mr-2" aria-hidden="true"></i> {{ _("index.button_browse_files") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -162,7 +161,7 @@
|
||||
|
||||
<!-- Platform stats row (admin only) -->
|
||||
{% if is_admin %}
|
||||
<h2 class="text-sm font-semibold text-gray-400 uppercase tracking-widest mb-3">Platform overview</h2>
|
||||
<h2 class="text-sm font-semibold text-gray-400 uppercase tracking-widest mb-3">{{ _("index.platform_overview") }}</h2>
|
||||
<div class="grid grid-cols-2 sm:grid-cols-4 gap-4 mb-8">
|
||||
<div class="bg-white rounded-xl shadow p-5 flex items-center gap-3">
|
||||
<div class="h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center flex-shrink-0">
|
||||
@@ -170,7 +169,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-2xl font-extrabold text-blue-600">{{ stats.processed_files | default(0) }}</p>
|
||||
<p class="text-gray-500 text-xs">Total files</p>
|
||||
<p class="text-gray-500 text-xs">{{ _("index.stat_total_files") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl shadow p-5 flex items-center gap-3">
|
||||
@@ -179,7 +178,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-2xl font-extrabold text-green-600">{{ stats.files_today | default(0) }}</p>
|
||||
<p class="text-gray-500 text-xs">Files today</p>
|
||||
<p class="text-gray-500 text-xs">{{ _("index.stat_files_today") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl shadow p-5 flex items-center gap-3">
|
||||
@@ -188,7 +187,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-2xl font-extrabold text-indigo-600">{{ stats.files_month | default(0) }}</p>
|
||||
<p class="text-gray-500 text-xs">Files this month</p>
|
||||
<p class="text-gray-500 text-xs">{{ _("index.stat_files_month") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl shadow p-5 flex items-center gap-3">
|
||||
@@ -197,7 +196,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-2xl font-extrabold text-purple-600">{{ stats.unique_users | default(0) }}</p>
|
||||
<p class="text-gray-500 text-xs">Active users</p>
|
||||
<p class="text-gray-500 text-xs">{{ _("index.stat_active_users") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -205,7 +204,7 @@
|
||||
|
||||
<!-- My usage / subscription widget -->
|
||||
{% if user_tier and user_usage %}
|
||||
<h2 class="text-sm font-semibold text-gray-400 uppercase tracking-widest mb-3">My usage</h2>
|
||||
<h2 class="text-sm font-semibold text-gray-400 uppercase tracking-widest mb-3">{{ _("index.usage_my_usage") }}</h2>
|
||||
<div class="bg-white rounded-xl shadow p-6 mb-8">
|
||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-4">
|
||||
<div class="flex items-center gap-3">
|
||||
@@ -220,16 +219,16 @@
|
||||
{% elif user_tier.id == 'professional' %}fa-star
|
||||
{% else %}fa-building{% endif %}
|
||||
mr-1" aria-hidden="true"></i>
|
||||
{{ user_tier.name }} Plan
|
||||
{{ user_tier.name }} {{ _("index.tier_plan") }}
|
||||
</span>
|
||||
{% if user_tier.id != 'business' %}
|
||||
<a href="/pricing" class="text-xs text-indigo-600 hover:text-indigo-800 font-medium">
|
||||
Upgrade <i class="fas fa-arrow-up-right-from-square ml-0.5 text-xs" aria-hidden="true"></i>
|
||||
{{ _("index.tier_upgrade") }} <i class="fas fa-arrow-up-right-from-square ml-0.5 text-xs" aria-hidden="true"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<a href="/subscription" class="text-xs text-gray-500 hover:text-gray-700">
|
||||
View full details →
|
||||
{{ _("index.tier_view_details") }} →
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -237,7 +236,7 @@
|
||||
<!-- Lifetime -->
|
||||
<div>
|
||||
<div class="flex justify-between text-xs mb-1">
|
||||
<span class="text-gray-500">Lifetime files</span>
|
||||
<span class="text-gray-500">{{ _("index.usage_lifetime") }}</span>
|
||||
<span class="font-semibold text-gray-700">
|
||||
{{ user_usage.lifetime }}{% if user_tier.lifetime_file_limit > 0 %} / {{ user_tier.lifetime_file_limit }}{% endif %}
|
||||
</span>
|
||||
@@ -250,13 +249,13 @@
|
||||
style="width: {{ pct }}%"></div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-xs text-green-600">Unlimited</div>
|
||||
<div class="text-xs text-green-600">{{ _("index.usage_unlimited") }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- Today -->
|
||||
<div>
|
||||
<div class="flex justify-between text-xs mb-1">
|
||||
<span class="text-gray-500">Files today</span>
|
||||
<span class="text-gray-500">{{ _("index.usage_today") }}</span>
|
||||
<span class="font-semibold text-gray-700">
|
||||
{{ user_usage.today }}{% if user_tier.daily_upload_limit > 0 %} / {{ user_tier.daily_upload_limit }}{% endif %}
|
||||
</span>
|
||||
@@ -269,13 +268,13 @@
|
||||
style="width: {{ pct }}%"></div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-xs text-green-600">Unlimited</div>
|
||||
<div class="text-xs text-green-600">{{ _("index.usage_unlimited") }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- This month -->
|
||||
<div>
|
||||
<div class="flex justify-between text-xs mb-1">
|
||||
<span class="text-gray-500">Files this month</span>
|
||||
<span class="text-gray-500">{{ _("index.usage_month") }}</span>
|
||||
<span class="font-semibold text-gray-700">
|
||||
{{ user_usage.month }}{% if user_tier.monthly_upload_limit > 0 %} / {{ user_tier.monthly_upload_limit }}{% endif %}
|
||||
</span>
|
||||
@@ -288,7 +287,7 @@
|
||||
style="width: {{ pct }}%"></div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-xs text-green-600">Unlimited</div>
|
||||
<div class="text-xs text-green-600">{{ _("index.usage_unlimited") }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -300,7 +299,7 @@
|
||||
<!-- Quick Actions -->
|
||||
<div class="bg-white rounded-xl shadow p-6">
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-bolt text-yellow-500" aria-hidden="true"></i> Quick Actions
|
||||
<i class="fas fa-bolt text-yellow-500" aria-hidden="true"></i> {{ _("index.quick_actions") }}
|
||||
</h2>
|
||||
<ul class="space-y-2">
|
||||
<li>
|
||||
@@ -309,8 +308,8 @@
|
||||
<i class="fas fa-upload text-blue-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">Upload Document</p>
|
||||
<p class="text-xs text-gray-400">Process a new file</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_upload") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_upload_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -320,8 +319,8 @@
|
||||
<i class="fas fa-list text-indigo-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">My Documents</p>
|
||||
<p class="text-xs text-gray-400">Browse your processed files</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_documents") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_documents_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -331,8 +330,8 @@
|
||||
<i class="fas fa-layer-group text-purple-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">My Subscription</p>
|
||||
<p class="text-xs text-gray-400">View plan & usage details</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_subscription") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_subscription_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -342,8 +341,8 @@
|
||||
<i class="fas fa-search text-green-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">Search</p>
|
||||
<p class="text-xs text-gray-400">Full-text search across documents</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_search") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_search_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -353,30 +352,30 @@
|
||||
<!-- Processing stats -->
|
||||
<div class="bg-white rounded-xl shadow p-6">
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-chart-bar text-blue-500" aria-hidden="true"></i> Processing Stats
|
||||
<i class="fas fa-chart-bar text-blue-500" aria-hidden="true"></i> {{ _("index.processing_stats") }}
|
||||
</h2>
|
||||
<ul class="space-y-3 text-sm">
|
||||
<li class="flex items-center justify-between py-2 border-b border-gray-100">
|
||||
<span class="text-gray-600 flex items-center gap-2">
|
||||
<i class="fas fa-file-alt text-blue-400 w-4" aria-hidden="true"></i> Total processed
|
||||
<i class="fas fa-file-alt text-blue-400 w-4" aria-hidden="true"></i> {{ _("index.stat_total_processed") }}
|
||||
</span>
|
||||
<span class="font-bold text-gray-900">{{ stats.processed_files | default(0) }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between py-2 border-b border-gray-100">
|
||||
<span class="text-gray-600 flex items-center gap-2">
|
||||
<i class="fas fa-eye text-indigo-400 w-4" aria-hidden="true"></i> Files with OCR
|
||||
<i class="fas fa-eye text-indigo-400 w-4" aria-hidden="true"></i> {{ _("index.stat_files_ocr") }}
|
||||
</span>
|
||||
<span class="font-bold text-gray-900">{{ stats.files_with_ocr | default(0) }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between py-2 border-b border-gray-100">
|
||||
<span class="text-gray-600 flex items-center gap-2">
|
||||
<i class="fas fa-calendar-day text-green-400 w-4" aria-hidden="true"></i> Today
|
||||
<i class="fas fa-calendar-day text-green-400 w-4" aria-hidden="true"></i> {{ _("index.stat_today") }}
|
||||
</span>
|
||||
<span class="font-bold text-gray-900">{{ stats.files_today | default(0) }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between py-2">
|
||||
<span class="text-gray-600 flex items-center gap-2">
|
||||
<i class="fas fa-calendar-alt text-orange-400 w-4" aria-hidden="true"></i> This month
|
||||
<i class="fas fa-calendar-alt text-orange-400 w-4" aria-hidden="true"></i> {{ _("index.stat_this_month") }}
|
||||
</span>
|
||||
<span class="font-bold text-gray-900">{{ stats.files_month | default(0) }}</span>
|
||||
</li>
|
||||
@@ -388,39 +387,39 @@
|
||||
<div class="bg-gradient-to-br from-indigo-600 to-purple-700 rounded-xl shadow p-6 text-white flex flex-col justify-between">
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold mb-2 flex items-center gap-2">
|
||||
<i class="fas fa-arrow-up-right-dots" aria-hidden="true"></i> Upgrade your plan
|
||||
<i class="fas fa-arrow-up-right-dots" aria-hidden="true"></i> {{ _("index.upgrade_plan") }}
|
||||
</h2>
|
||||
<p class="text-indigo-100 text-sm mb-4">
|
||||
Unlock more documents, more destinations and priority support.
|
||||
{{ _("index.upgrade_description") }}
|
||||
</p>
|
||||
<ul class="space-y-1.5 text-sm text-indigo-100">
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> Higher daily & monthly limits</li>
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> More storage destinations</li>
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> More OCR pages</li>
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> {{ _("index.upgrade_daily_limits") }}</li>
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> {{ _("index.upgrade_destinations") }}</li>
|
||||
<li class="flex items-center gap-2"><i class="fas fa-check-circle text-indigo-300" aria-hidden="true"></i> {{ _("index.upgrade_ocr_pages") }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="/pricing"
|
||||
class="mt-6 inline-flex items-center justify-center bg-white text-indigo-700 font-semibold px-5 py-2.5 rounded-lg hover:bg-indigo-50 transition shadow">
|
||||
View plans & pricing <i class="fas fa-arrow-right ml-2 text-xs" aria-hidden="true"></i>
|
||||
{{ _("index.upgrade_view_pricing") }} <i class="fas fa-arrow-right ml-2 text-xs" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="bg-white rounded-xl shadow p-6">
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-plug text-green-500" aria-hidden="true"></i> Integrations
|
||||
<i class="fas fa-plug text-green-500" aria-hidden="true"></i> {{ _("index.integrations_title") }}
|
||||
</h2>
|
||||
<div class="space-y-3 text-sm text-gray-600">
|
||||
<div class="flex items-center justify-between">
|
||||
<span>Active integrations</span>
|
||||
<span>{{ _("index.integrations_active") }}</span>
|
||||
<span class="font-bold text-green-600">{{ stats.active_integrations | default(0) }}</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between">
|
||||
<span>Storage targets</span>
|
||||
<span>{{ _("index.integrations_storage") }}</span>
|
||||
<span class="font-bold text-indigo-600">{{ stats.storage_targets | default(0) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<a href="/status" class="mt-4 inline-flex items-center text-xs text-indigo-600 hover:text-indigo-800">
|
||||
View system status <i class="fas fa-arrow-right ml-1" aria-hidden="true"></i>
|
||||
{{ _("index.integrations_view_status") }} <i class="fas fa-arrow-right ml-1" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -435,15 +434,15 @@
|
||||
<div class="bg-gradient-to-r from-blue-600 to-indigo-700 rounded-xl shadow-lg text-white p-8 mb-8">
|
||||
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold mb-1">DocuElevate Dashboard</h1>
|
||||
<p class="text-blue-100 text-sm">Intelligent document processing & management</p>
|
||||
<h1 class="text-3xl font-bold mb-1">{{ _("index.single_user_heading") }}</h1>
|
||||
<p class="text-blue-100 text-sm">{{ _("index.dashboard_subtitle") }}</p>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<a href="/upload" class="bg-white text-blue-700 hover:bg-blue-50 font-semibold py-2 px-5 rounded-lg transition duration-200 flex items-center shadow-sm">
|
||||
<i class="fas fa-upload mr-2" aria-hidden="true"></i> Upload
|
||||
<i class="fas fa-upload mr-2" aria-hidden="true"></i> {{ _("index.button_upload") }}
|
||||
</a>
|
||||
<a href="/files" class="bg-transparent border border-white text-white hover:bg-white hover:text-blue-700 font-semibold py-2 px-5 rounded-lg transition duration-200 flex items-center">
|
||||
<i class="fas fa-list mr-2" aria-hidden="true"></i> Browse Files
|
||||
<i class="fas fa-list mr-2" aria-hidden="true"></i> {{ _("index.button_browse_files") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -457,7 +456,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-3xl font-bold text-blue-600">{{ stats.processed_files | default(0) }}</p>
|
||||
<p class="text-gray-500 text-sm">Documents Processed</p>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.stat_documents_processed") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl shadow p-6 flex items-center gap-4">
|
||||
@@ -466,7 +465,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-3xl font-bold text-green-600">{{ stats.active_integrations | default(0) }}</p>
|
||||
<p class="text-gray-500 text-sm">Active Integrations</p>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.stat_active_integrations") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white rounded-xl shadow p-6 flex items-center gap-4">
|
||||
@@ -475,7 +474,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-3xl font-bold text-indigo-600">{{ stats.storage_targets | default(0) }}</p>
|
||||
<p class="text-gray-500 text-sm">Storage Targets</p>
|
||||
<p class="text-gray-500 text-sm">{{ _("index.stat_storage_targets") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -486,7 +485,7 @@
|
||||
<!-- Quick Actions Widget -->
|
||||
<div class="bg-white rounded-xl shadow p-6">
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-bolt text-yellow-500" aria-hidden="true"></i> Quick Actions
|
||||
<i class="fas fa-bolt text-yellow-500" aria-hidden="true"></i> {{ _("index.quick_actions") }}
|
||||
</h2>
|
||||
<ul class="space-y-2">
|
||||
<li>
|
||||
@@ -495,8 +494,8 @@
|
||||
<i class="fas fa-upload text-blue-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">Upload Document</p>
|
||||
<p class="text-xs text-gray-400">Process a new file</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_upload") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_upload_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -506,8 +505,8 @@
|
||||
<i class="fas fa-list text-indigo-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">View All Files</p>
|
||||
<p class="text-xs text-gray-400">Browse processed documents</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_view_files") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_view_files_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -517,8 +516,8 @@
|
||||
<i class="fas fa-heartbeat text-green-600 text-sm" aria-hidden="true"></i>
|
||||
</span>
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-800">System Status</p>
|
||||
<p class="text-xs text-gray-400">Check integration health</p>
|
||||
<p class="text-sm font-medium text-gray-800">{{ _("index.quick_system_status") }}</p>
|
||||
<p class="text-xs text-gray-400">{{ _("index.quick_system_status_desc") }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@@ -528,28 +527,28 @@
|
||||
<!-- Capabilities Widget -->
|
||||
<div class="bg-white rounded-xl shadow p-6">
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-cubes text-blue-500" aria-hidden="true"></i> Capabilities
|
||||
<i class="fas fa-cubes text-blue-500" aria-hidden="true"></i> {{ _("index.capabilities_title") }}
|
||||
</h2>
|
||||
<ul class="space-y-3 text-sm text-gray-600">
|
||||
<li class="flex items-start gap-2">
|
||||
<i class="fas fa-check-circle text-green-500 mt-0.5 flex-shrink-0" aria-hidden="true"></i>
|
||||
<span>OCR & metadata extraction with AI</span>
|
||||
<span>{{ _("index.capabilities_ocr") }}</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<i class="fas fa-check-circle text-green-500 mt-0.5 flex-shrink-0" aria-hidden="true"></i>
|
||||
<span>Cloud storage: Dropbox, OneDrive, Google Drive, NextCloud</span>
|
||||
<span>{{ _("index.capabilities_cloud") }}</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<i class="fas fa-check-circle text-green-500 mt-0.5 flex-shrink-0" aria-hidden="true"></i>
|
||||
<span>Paperless-ngx integration for document management</span>
|
||||
<span>{{ _("index.capabilities_paperless") }}</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<i class="fas fa-check-circle text-green-500 mt-0.5 flex-shrink-0" aria-hidden="true"></i>
|
||||
<span>Email & URL-based document ingestion</span>
|
||||
<span>{{ _("index.capabilities_ingestion") }}</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<i class="fas fa-check-circle text-green-500 mt-0.5 flex-shrink-0" aria-hidden="true"></i>
|
||||
<span>Automated classification & routing workflows</span>
|
||||
<span>{{ _("index.capabilities_workflows") }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -558,25 +557,25 @@
|
||||
<div class="bg-white rounded-xl shadow p-6 flex flex-col justify-between">
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2">
|
||||
<i class="fas fa-compass text-indigo-500" aria-hidden="true"></i> Getting Started
|
||||
<i class="fas fa-compass text-indigo-500" aria-hidden="true"></i> {{ _("index.getting_started") }}
|
||||
</h2>
|
||||
<ol class="space-y-3 text-sm text-gray-600 list-none">
|
||||
<li class="flex items-start gap-2">
|
||||
<span class="h-5 w-5 rounded-full bg-blue-600 text-white text-xs flex items-center justify-center flex-shrink-0 font-bold mt-0.5">1</span>
|
||||
Configure integrations via <a href="/status" class="text-blue-600 hover:underline">System Status</a>
|
||||
{{ _("index.getting_started_1_pre") }}<a href="/status" class="text-blue-600 hover:underline">{{ _("index.quick_system_status") }}</a>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<span class="h-5 w-5 rounded-full bg-blue-600 text-white text-xs flex items-center justify-center flex-shrink-0 font-bold mt-0.5">2</span>
|
||||
<a href="/upload" class="text-blue-600 hover:underline">Upload</a> your first document
|
||||
<a href="/upload" class="text-blue-600 hover:underline">{{ _("index.button_upload") }}</a>{{ _("index.getting_started_2_post") }}
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<span class="h-5 w-5 rounded-full bg-blue-600 text-white text-xs flex items-center justify-center flex-shrink-0 font-bold mt-0.5">3</span>
|
||||
Review results in <a href="/files" class="text-blue-600 hover:underline">Files</a>
|
||||
{{ _("index.getting_started_3_pre") }}<a href="/files" class="text-blue-600 hover:underline">{{ _("index.link_files") }}</a>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
<a href="/about" class="mt-6 inline-flex items-center text-sm text-indigo-600 hover:text-indigo-800 font-medium">
|
||||
Learn more about DocuElevate <i class="fas fa-arrow-right ml-1 text-xs" aria-hidden="true"></i>
|
||||
{{ _("index.getting_started_learn") }} <i class="fas fa-arrow-right ml-1 text-xs" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Search Documents - DocuElevate{% endblock %}
|
||||
{% block title %}{{ _("search.page_title") }} - DocuElevate{% endblock %}
|
||||
|
||||
{% block head_extra %}
|
||||
<script src="/static/js/common.js"></script>
|
||||
@@ -121,74 +121,74 @@
|
||||
{% block content %}
|
||||
<div class="container mx-auto px-4 py-8">
|
||||
<div class="search-container">
|
||||
<h1 class="text-3xl font-bold mb-6"><i class="fas fa-search text-blue-500" aria-hidden="true"></i> Document Search</h1>
|
||||
<h1 class="text-3xl font-bold mb-6"><i class="fas fa-search text-blue-500" aria-hidden="true"></i> {{ _("search.heading") }}</h1>
|
||||
|
||||
<!-- Search box -->
|
||||
<div class="search-box" role="search">
|
||||
<label for="search-input" class="sr-only">Search documents</label>
|
||||
<label for="search-input" class="sr-only">{{ _("search.input_aria_label") }}</label>
|
||||
<input
|
||||
type="search"
|
||||
id="search-input"
|
||||
placeholder="Search documents by content, sender, tags, type..."
|
||||
placeholder="{{ _('search.input_placeholder') }}"
|
||||
value="{{ query }}"
|
||||
autofocus
|
||||
>
|
||||
<button type="button" id="search-btn" aria-label="Search documents">
|
||||
<i class="fas fa-search" aria-hidden="true"></i> Search
|
||||
<button type="button" id="search-btn" aria-label="{{ _('search.input_aria_label') }}">
|
||||
<i class="fas fa-search" aria-hidden="true"></i> {{ _("search.button") }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Content-finding filters -->
|
||||
<div class="search-filters" id="search-filters">
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-document-type">Document Type</label>
|
||||
<input type="text" id="filter-document-type" placeholder="e.g. Invoice" aria-label="Filter by document type">
|
||||
<label for="filter-document-type">{{ _("search.filter_document_type") }}</label>
|
||||
<input type="text" id="filter-document-type" placeholder="{{ _('search.filter_document_type_placeholder') }}" aria-label="{{ _('search.filter_aria_document_type') }}">
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-tags">Tags</label>
|
||||
<input type="text" id="filter-tags" placeholder="e.g. amazon" aria-label="Filter by tag">
|
||||
<label for="filter-tags">{{ _("search.filter_tags") }}</label>
|
||||
<input type="text" id="filter-tags" placeholder="{{ _('search.filter_tags_placeholder') }}" aria-label="{{ _('search.filter_aria_tag') }}">
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-sender">Sender</label>
|
||||
<input type="text" id="filter-sender" placeholder="e.g. ACME Corp" aria-label="Filter by sender">
|
||||
<label for="filter-sender">{{ _("search.filter_sender") }}</label>
|
||||
<input type="text" id="filter-sender" placeholder="{{ _('search.filter_sender_placeholder') }}" aria-label="{{ _('search.filter_aria_sender') }}">
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-language">Language</label>
|
||||
<input type="text" id="filter-language" placeholder="e.g. de" aria-label="Filter by language code">
|
||||
<label for="filter-language">{{ _("search.filter_language") }}</label>
|
||||
<input type="text" id="filter-language" placeholder="{{ _('search.filter_language_placeholder') }}" aria-label="{{ _('search.filter_aria_language') }}">
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-text-quality">Text Quality</label>
|
||||
<select id="filter-text-quality" aria-label="Filter by OCR text quality">
|
||||
<option value="">All</option>
|
||||
<option value="high">High</option>
|
||||
<option value="medium">Medium</option>
|
||||
<option value="low">Low</option>
|
||||
<option value="no_text">No text</option>
|
||||
<label for="filter-text-quality">{{ _("search.filter_text_quality") }}</label>
|
||||
<select id="filter-text-quality" aria-label="{{ _('search.filter_aria_text_quality') }}">
|
||||
<option value="">{{ _("search.filter_text_quality_all") }}</option>
|
||||
<option value="high">{{ _("search.filter_text_quality_high") }}</option>
|
||||
<option value="medium">{{ _("search.filter_text_quality_medium") }}</option>
|
||||
<option value="low">{{ _("search.filter_text_quality_low") }}</option>
|
||||
<option value="no_text">{{ _("search.filter_text_quality_no_text") }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-date-from">Date From</label>
|
||||
<input type="date" id="filter-date-from" aria-label="Filter from date">
|
||||
<label for="filter-date-from">{{ _("search.filter_date_from") }}</label>
|
||||
<input type="date" id="filter-date-from" aria-label="{{ _('search.filter_aria_date_from') }}">
|
||||
</div>
|
||||
<div class="search-filter-item">
|
||||
<label for="filter-date-to">Date To</label>
|
||||
<input type="date" id="filter-date-to" aria-label="Filter to date">
|
||||
<label for="filter-date-to">{{ _("search.filter_date_to") }}</label>
|
||||
<input type="date" id="filter-date-to" aria-label="{{ _('search.filter_aria_date_to') }}">
|
||||
</div>
|
||||
<div class="search-filter-item" style="align-self: flex-end;">
|
||||
<button type="button" id="clear-filters-btn" style="padding: 0.4rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.375rem; font-size: 0.8rem; cursor: pointer; background: white; color: #374151;" aria-label="Clear all filters">
|
||||
Clear Filters
|
||||
<button type="button" id="clear-filters-btn" style="padding: 0.4rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.375rem; font-size: 0.8rem; cursor: pointer; background: white; color: #374151;" aria-label="{{ _('search.filter_aria_clear') }}">
|
||||
{{ _("search.filter_clear_button") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Saved Searches -->
|
||||
<div class="search-saved-bar" id="saved-searches-bar">
|
||||
<span class="saved-label"><i class="fas fa-bookmark" aria-hidden="true"></i> Saved Searches:</span>
|
||||
<span class="saved-label"><i class="fas fa-bookmark" aria-hidden="true"></i> {{ _("search.saved_label") }}:</span>
|
||||
<span id="saved-searches-list" aria-live="polite" style="display: flex; gap: 0.25rem; flex-wrap: wrap;">
|
||||
<span style="color: #9ca3af; font-size: 0.85rem;">Loading...</span>
|
||||
<span style="color: #9ca3af; font-size: 0.85rem;">{{ _("search.saved_loading") }}</span>
|
||||
</span>
|
||||
<button type="button" id="save-search-btn" class="btn-save-search" aria-label="Save current search and filters as a saved search">
|
||||
<i class="fas fa-plus" aria-hidden="true"></i> Save Current
|
||||
<button type="button" id="save-search-btn" class="btn-save-search" aria-label="{{ _('search.saved_aria_save') }}">
|
||||
<i class="fas fa-plus" aria-hidden="true"></i> {{ _("search.saved_button") }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -481,5 +481,278 @@
|
||||
"language.lv": "Latviešu",
|
||||
"language.lt": "Lietuvių",
|
||||
"language.lb": "Lëtzebuergesch",
|
||||
"language.ca": "Català"
|
||||
"language.ca": "Català",
|
||||
"auth.logo_alt": "DocuElevate Logo",
|
||||
"auth.sign_in_with_username": "Sign in with username",
|
||||
"auth.username_or_email": "Username or Email",
|
||||
"auth.sign_in": "Sign in",
|
||||
"auth.forgot_username": "Forgot username?",
|
||||
"auth.or_continue_with": "Or continue with",
|
||||
"auth.sign_in_sso": "Sign in with SSO",
|
||||
"auth.return_home": "Return to Home",
|
||||
"auth.no_account": "Don't have an account?",
|
||||
"auth.create_account": "Create account",
|
||||
"upload.drop_zone_aria": "File upload area. Drag and drop files here, or press Enter to browse files.",
|
||||
"credentials.page_title": "Credential Audit - DocuElevate",
|
||||
"credentials.title": "Credential Audit",
|
||||
"credentials.subtitle": "Overview of all sensitive credentials used by DocuElevate. No secret values are shown here — only whether each credential is configured and where it comes from.",
|
||||
"credentials.total_credentials": "Total Credentials",
|
||||
"credentials.configured": "Configured",
|
||||
"credentials.not_configured": "Not Configured",
|
||||
"credentials.legend_title": "Legend",
|
||||
"credentials.legend_db": "Value stored in the database (encrypted at rest; overrides environment variable)",
|
||||
"credentials.legend_env_before": "Value from environment variable or ",
|
||||
"credentials.legend_env_after": " file",
|
||||
"credentials.legend_missing": "Credential not set — integration will not work",
|
||||
"credentials.legend_restart": "Restart required when this credential is rotated",
|
||||
"credentials.col_credential": "Credential",
|
||||
"credentials.col_source": "Source",
|
||||
"credentials.col_action": "Action",
|
||||
"credentials.table_for": "Credentials for",
|
||||
"credentials.restart_title": "Restart required after rotating this credential",
|
||||
"credentials.status_missing": "Missing",
|
||||
"credentials.source_db_title": "Stored in database (encrypted)",
|
||||
"credentials.source_env_title": "From environment variable",
|
||||
"credentials.edit_in_settings": "Edit in Settings",
|
||||
"credentials.manage_settings": "Manage Settings",
|
||||
"credentials.raw_json": "Raw JSON (API)",
|
||||
"audit.page_title": "Audit Logs - DocuElevate",
|
||||
"audit.title": "Audit Logs",
|
||||
"audit.subtitle": "Comprehensive, append-only record of all significant actions.",
|
||||
"audit.siem_enabled_title": "Events are being forwarded to ",
|
||||
"audit.siem_off": "SIEM: Off",
|
||||
"audit.siem_disabled_title": "SIEM forwarding is disabled",
|
||||
"audit.refresh_label": "Refresh audit logs",
|
||||
"audit.filter_action": "Action",
|
||||
"audit.filter_all_actions": "All actions",
|
||||
"audit.filter_user": "User",
|
||||
"audit.filter_all_users": "All users",
|
||||
"audit.filter_severity": "Severity",
|
||||
"audit.filter_resource_type": "Resource Type",
|
||||
"audit.filter_resource_placeholder": "e.g. document, user",
|
||||
"audit.filters_section_label": "Audit log filters",
|
||||
"audit.col_timestamp": "Timestamp",
|
||||
"audit.col_resource": "Resource",
|
||||
"audit.col_ip": "IP",
|
||||
"audit.table_label": "Audit log events",
|
||||
"audit.no_events": "No audit events recorded yet.",
|
||||
"audit.no_events_hint": "Significant actions (logins, document operations, settings changes) will appear here.",
|
||||
"audit.pagination_label": "Audit log pagination",
|
||||
"audit.prev_label": "Previous page",
|
||||
"audit.prev": "Prev",
|
||||
"audit.next_label": "Next page",
|
||||
"audit.next": "Next",
|
||||
"audit.critical": "Critical",
|
||||
"queue.page_title": "Queue Monitor",
|
||||
"queue.heading": "Queue Monitor",
|
||||
"queue.subtitle": "Real-time view of the document processing pipeline and Celery task queues.",
|
||||
"queue.loading_stats": "Loading queue statistics…",
|
||||
"queue.queued_tasks": "Queued Tasks",
|
||||
"queue.active_tasks": "Active Tasks",
|
||||
"queue.files_processing": "Files Processing",
|
||||
"queue.workers_online": "Workers Online",
|
||||
"queue.redis_queues": "Redis Queues",
|
||||
"queue.col_queue": "Queue",
|
||||
"queue.no_data": "No data",
|
||||
"queue.processing_pipeline": "Processing Pipeline",
|
||||
"queue.col_state": "State",
|
||||
"queue.col_files": "Files",
|
||||
"queue.col_task": "Task",
|
||||
"queue.col_arguments": "Arguments",
|
||||
"queue.col_task_id": "Task ID",
|
||||
"queue.no_active_tasks": "No active tasks",
|
||||
"queue.recently_processing": "Recently Processing Files",
|
||||
"queue.col_file": "File",
|
||||
"queue.col_current_step": "Current Step",
|
||||
"queue.no_files_processing": "No files currently processing",
|
||||
"queue.auto_refresh_1": "Auto-refreshes every",
|
||||
"queue.auto_refresh_2": "seconds",
|
||||
"queue.last_updated": "Last updated:",
|
||||
"api_tokens.page_title": "API Tokens – DocuElevate",
|
||||
"api_tokens.heading": "API Tokens",
|
||||
"api_tokens.intro": "Create personal API tokens to interact with the DocuElevate API programmatically. Use tokens for webhook uploads, CI/CD pipelines, or any script that needs to upload or retrieve documents.",
|
||||
"api_tokens.create_heading": "Create New Token",
|
||||
"api_tokens.token_name_label": "Token name",
|
||||
"api_tokens.token_name_placeholder": "e.g. CI Pipeline, Webhook Upload, My Script",
|
||||
"api_tokens.creating": "Creating…",
|
||||
"api_tokens.create_token": "Create Token",
|
||||
"api_tokens.token_created": "Token created successfully!",
|
||||
"api_tokens.copy_warning_1": "Copy this token now — it will",
|
||||
"api_tokens.copy_warning_2": "not be shown again",
|
||||
"api_tokens.copy_to_clipboard": "Copy token to clipboard",
|
||||
"api_tokens.usage_heading": "Usage Example",
|
||||
"api_tokens.usage_intro_pre": "Use your API token in the",
|
||||
"api_tokens.usage_intro_post": "header with any API request:",
|
||||
"api_tokens.copy_upload_example": "Copy upload example to clipboard",
|
||||
"api_tokens.your_tokens": "Your Tokens",
|
||||
"api_tokens.loading_tokens": "Loading tokens…",
|
||||
"api_tokens.no_tokens_heading": "No API tokens yet",
|
||||
"api_tokens.no_tokens_help": "Create your first token above to get started.",
|
||||
"api_tokens.table_aria": "API Tokens",
|
||||
"api_tokens.col_name": "Name",
|
||||
"api_tokens.col_prefix": "Token Prefix",
|
||||
"api_tokens.col_created": "Created",
|
||||
"api_tokens.col_last_used": "Last Used",
|
||||
"api_tokens.col_last_ip": "Last IP",
|
||||
"api_tokens.never": "Never",
|
||||
"api_tokens.status_active": "Active",
|
||||
"api_tokens.status_revoked": "Revoked",
|
||||
"api_tokens.revoke_prefix": "Revoke token",
|
||||
"api_tokens.revoke": "Revoke",
|
||||
"similarity.page_title": "Document Similarity - DocuElevate",
|
||||
"similarity.heading": "Document Similarity",
|
||||
"similarity.subtitle": "Pairs of documents with high semantic similarity, ranked by score.",
|
||||
"similarity.stat_total_files": "Total Files",
|
||||
"similarity.stat_with_embedding": "With Embedding",
|
||||
"similarity.stat_missing_embedding": "Missing Embedding",
|
||||
"similarity.stat_embedding_model": "Embedding Model",
|
||||
"similarity.files_missing_text": "file(s) have OCR text but no embedding yet.",
|
||||
"similarity.backfill_auto": "The background task will compute them automatically every 5 minutes, or you can",
|
||||
"similarity.trigger_now": "trigger it now",
|
||||
"similarity.trigger_aria": "Trigger embedding computation for all files missing embeddings",
|
||||
"similarity.min_similarity_label": "Min. similarity",
|
||||
"similarity.per_page_label": "Per page",
|
||||
"similarity.find_pairs_btn": "Find Pairs",
|
||||
"similarity.scanning": "Scanning for similar document pairs…",
|
||||
"similarity.no_pairs_heading": "No similar pairs found",
|
||||
"similarity.no_pairs_detail": "No document pairs exceed the similarity threshold.",
|
||||
"similarity.load_error": "Failed to load pairs.",
|
||||
"similarity.pagination_aria": "Similarity pairs pagination",
|
||||
"backup.page_title": "Backup Management",
|
||||
"backup.heading": "Backup Management",
|
||||
"backup.subtitle": "Database backups are created automatically: hourly (4 days), daily (3 weeks), weekly (13 weeks).",
|
||||
"backup.trigger_hourly": "Backup Now (Hourly)",
|
||||
"backup.trigger_daily": "Backup Now (Daily)",
|
||||
"backup.trigger_weekly": "Backup Now (Weekly)",
|
||||
"backup.clean_up": "Clean Up",
|
||||
"backup.cleanup_title": "Run retention cleanup now",
|
||||
"backup.confirm_title": "Confirm action",
|
||||
"backup.confirm_btn": "Confirm",
|
||||
"backup.config_auto_backup": "Auto-backup",
|
||||
"backup.config_remote_dest": "Remote destination",
|
||||
"backup.local_only": "Local only",
|
||||
"backup.config_retention": "Retention",
|
||||
"backup.config_total_size": "Total local size",
|
||||
"backup.type_hourly": "Hourly",
|
||||
"backup.type_daily": "Daily",
|
||||
"backup.type_weekly": "Weekly",
|
||||
"backup.restore_heading": "Restore from File",
|
||||
"backup.restore_desc_pre": "Upload a",
|
||||
"backup.restore_desc_mid": "backup archive to restore the database.",
|
||||
"backup.restore_desc_warning": "This will overwrite all current data.",
|
||||
"backup.restore_file_label": "Backup archive (.db.gz)",
|
||||
"backup.restoring": "Restoring…",
|
||||
"backup.restore_btn": "Restore",
|
||||
"backup.archives_heading": "Backup Archives",
|
||||
"backup.records_label": "records",
|
||||
"backup.table_aria": "Backup archives",
|
||||
"backup.col_filename": "Filename",
|
||||
"backup.col_type": "Type",
|
||||
"backup.col_created": "Created",
|
||||
"backup.col_size": "Size",
|
||||
"backup.col_storage": "Storage",
|
||||
"backup.status_ok": "ok",
|
||||
"backup.storage_local": "local",
|
||||
"backup.no_backups": "No backups yet.",
|
||||
"backup.backup_now": "Backup Now",
|
||||
"backup.no_backups_hint": "Click Backup Now to create your first backup.",
|
||||
"backup.retention_heading": "Retention policy",
|
||||
"backup.retention_hourly_detail": "– kept for 4 days",
|
||||
"backup.retention_daily_detail": "– kept for 3 weeks",
|
||||
"backup.retention_weekly_detail": "– kept for ~3 months",
|
||||
"backup.snapshots": "snapshots",
|
||||
"backup.retention_note": "Backups beyond these limits are automatically pruned after each new backup is created.",
|
||||
"shared.page_title": "Shared Links – DocuElevate",
|
||||
"shared.heading": "Shared Links",
|
||||
"shared.subtitle": "Share documents with anyone via a time-limited or view-limited link. Recipients do not need a DocuElevate account. Links can be password-protected and revoked at any time.",
|
||||
"shared.create_heading": "Create New Shared Link",
|
||||
"shared.file_id_label": "File ID",
|
||||
"shared.file_id_placeholder": "e.g. 42",
|
||||
"shared.file_id_help_pre": "Find the file ID on the",
|
||||
"shared.files_link": "Files",
|
||||
"shared.file_id_help_post": "page or in the document detail URL.",
|
||||
"shared.label_label": "Label",
|
||||
"shared.optional": "(optional)",
|
||||
"shared.label_placeholder": "e.g. Shared with Bob",
|
||||
"shared.expiry_label": "Expiry",
|
||||
"shared.expiry_never": "Never",
|
||||
"shared.expiry_1h": "1 hour",
|
||||
"shared.expiry_6h": "6 hours",
|
||||
"shared.expiry_12h": "12 hours",
|
||||
"shared.expiry_24h": "24 hours (1 day)",
|
||||
"shared.expiry_3d": "3 days",
|
||||
"shared.expiry_7d": "7 days",
|
||||
"shared.expiry_14d": "14 days",
|
||||
"shared.expiry_30d": "30 days",
|
||||
"shared.max_downloads_label": "Max downloads",
|
||||
"shared.unlimited_placeholder": "Unlimited",
|
||||
"shared.password_label": "Password",
|
||||
"shared.password_placeholder": "Leave blank for no password",
|
||||
"shared.creating": "Creating…",
|
||||
"shared.create_btn": "Create Link",
|
||||
"shared.link_created": "Shared link created!",
|
||||
"shared.link_created_help": "Copy and send this link to the recipient.",
|
||||
"shared.copy_link_aria": "Copy link to clipboard",
|
||||
"shared.your_links": "Your Shared Links",
|
||||
"shared.links_count_aria": "number of links",
|
||||
"shared.refresh_aria": "Refresh shared links list",
|
||||
"shared.no_links": "No shared links yet. Create one above to get started.",
|
||||
"shared.table_aria": "Shared links",
|
||||
"shared.col_file_label": "File / Label",
|
||||
"shared.col_link": "Link",
|
||||
"shared.col_expiry": "Expiry",
|
||||
"shared.col_views": "Views",
|
||||
"shared.password_protected": "Password protected",
|
||||
"shared.copy_link_title": "Copy link",
|
||||
"shared.open_link_aria": "Open shared link",
|
||||
"shared.open_in_new_tab": "Open in new tab",
|
||||
"shared.status_revoked": "Revoked",
|
||||
"shared.status_expired": "Expired",
|
||||
"shared.status_limit_reached": "Limit reached",
|
||||
"shared.status_active": "Active",
|
||||
"shared.revoke_aria_prefix": "Revoke shared link for",
|
||||
"shared.revoke_btn": "Revoke",
|
||||
"duplicates.page_title": "Duplicate Documents - DocuElevate",
|
||||
"duplicates.heading": "Duplicate Documents",
|
||||
"duplicates.tabs_aria": "Duplicate detection tabs",
|
||||
"duplicates.tab_exact": "Exact Duplicates",
|
||||
"duplicates.tab_near": "Near-Duplicate Finder",
|
||||
"duplicates.found_prefix": "Found",
|
||||
"duplicates.found_groups": "duplicate group(s) with",
|
||||
"duplicates.found_files": "duplicate file(s) total.",
|
||||
"duplicates.group_aria": "Duplicate group",
|
||||
"duplicates.role_original": "Original",
|
||||
"duplicates.role_duplicate": "Duplicate",
|
||||
"duplicates.view_original_aria": "View original file",
|
||||
"duplicates.view_dup_aria": "View duplicate file",
|
||||
"duplicates.pagination_aria": "Pagination",
|
||||
"duplicates.no_exact_heading": "No exact duplicates found",
|
||||
"duplicates.near_dup_heading": "Find Near-Duplicates for a Document",
|
||||
"duplicates.near_dup_desc": "Select a document to check whether any other files contain the same (or very similar) content — even if they were scanned at different times and have different SHA-256 hashes.",
|
||||
"duplicates.file_id_label": "File ID",
|
||||
"duplicates.file_id_placeholder": "e.g. 42",
|
||||
"duplicates.threshold_label": "Similarity threshold",
|
||||
"duplicates.max_results_label": "Max results",
|
||||
"duplicates.find_btn": "Find",
|
||||
"duplicates.how_it_works_heading": "How near-duplicate detection works",
|
||||
"search.input_aria_label": "Search documents",
|
||||
"search.filter_tags": "Tags",
|
||||
"search.filter_aria_clear": "Clear all filters",
|
||||
"search.saved_aria_save": "Save current search",
|
||||
"help.privacy_notice": "Privacy Notice",
|
||||
"help.support_ticket_heading": "Open a Support Ticket",
|
||||
"help.support_ticket_button": "Submit a Ticket",
|
||||
"index.dashboard_subtitle_teams": "Intelligent document processing & management — built for teams",
|
||||
"index.button_upload": "Upload",
|
||||
"index.button_browse_files": "Browse Files",
|
||||
"index.stat_active_integrations": "Active Integrations",
|
||||
"index.stat_storage_targets": "Storage Targets",
|
||||
"index.quick_view_files": "View All Files",
|
||||
"index.quick_view_files_desc": "Browse processed documents",
|
||||
"index.quick_system_status": "System Status",
|
||||
"index.quick_system_status_desc": "Check integration health",
|
||||
"common.prev_page": "Previous page",
|
||||
"common.next_page": "Next page",
|
||||
"common.page": "Page",
|
||||
"common.col_pending": "Pending"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user