- Profile Settings
+ {{ _("profile.heading") }}
- Manage your display name, avatar, language, and theme preferences.
+ {{ _("profile.subtitle") }}
@@ -36,7 +36,7 @@
type="button"
@click="banner.visible = false"
class="ml-auto"
- aria-label="Dismiss"
+ aria-label="{{ _('profile.dismiss') }}"
style="min-height:44px; min-width:44px;"
>
@@ -49,7 +49,7 @@
aria-labelledby="avatar-heading"
>
- Profile Picture
+ {{ _("profile.avatar_heading") }}
@@ -57,7 +57,7 @@
@@ -66,8 +66,8 @@
@click="removeAvatar()"
:disabled="saving"
class="absolute -top-1 -right-1 bg-red-500 hover:bg-red-600 text-white rounded-full w-6 h-6 flex items-center justify-center shadow focus:outline-none focus:ring-2 focus:ring-red-400"
- aria-label="Remove custom avatar"
- title="Remove custom avatar"
+ aria-label="{{ _('profile.avatar_remove') }}"
+ title="{{ _('profile.avatar_remove') }}"
>
@@ -77,8 +77,7 @@
@@ -256,13 +255,13 @@
aria-labelledby="password-heading"
>
- Change Password
+ {{ _("profile.password_heading") }}
diff --git a/frontend/templates/subscription.html b/frontend/templates/subscription.html
index 09143224..76bc39a1 100644
--- a/frontend/templates/subscription.html
+++ b/frontend/templates/subscription.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% block title %}My Subscription – DocuElevate{% endblock %}
+{% block title %}{{ _("subscription.page_title") }}{% endblock %}
{% block content %}
@@ -8,9 +8,9 @@
- My Subscription
+ {{ _("subscription.heading") }}
-
Your current plan, usage and available upgrades.
+
{{ _("subscription.subtitle") }}
@@ -21,11 +21,10 @@
-
Multi-user mode is not enabled.
+
{{ _("subscription.single_user_title") }}
- Subscription tiers apply when multi-user mode is active. Your instance currently runs in
- single-user mode with no processing limits.
- An admin can enable multi-user mode via Settings .
+ {{ _("subscription.single_user_body_before_link") }}
+ {{ _("nav.settings") }} {{ _("subscription.single_user_body_after_link") }}
@@ -37,17 +36,17 @@
-
Pending plan change scheduled
+
{{ _("subscription.pending_title") }}
- Your plan will change to {{ pending_tier.name }}
- on {% if pending_date %}{{ pending_date.strftime('%B') }} {{ pending_date.day }}, {{ pending_date.year }}{% endif %} .
- You keep all current plan benefits until then.
+ {{ _("subscription.pending_will_change") }} {{ pending_tier.name }}
+ {{ _("subscription.pending_on") }} {% if pending_date %}{{ pending_date.strftime('%B') }} {{ pending_date.day }}, {{ pending_date.year }}{% endif %} .
+ {{ _("subscription.pending_benefits") }}
- Cancel change
+ aria-label="{{ _('subscription.cancel_pending') }}">
+ {{ _("subscription.cancel_pending") }}
{% endif %}
@@ -68,18 +67,18 @@
{% else %}fa-bolt text-purple-600{% endif %}
text-2xl" aria-hidden="true">
-
Current Plan
+
{{ _("subscription.current_plan") }}
{{ tier.tagline }}
{% if tier.price_monthly > 0 %}
-
${{ tier.price_monthly }}/month
+
${{ tier.price_monthly }}{{ _("subscription.per_month") }}
{% else %}
-
Free
+
{{ _("subscription.free") }}
{% endif %}
{% if period_start %}
- Since {{ period_start.strftime('%b') }} {{ period_start.day }}, {{ period_start.year }}
+ {{ _("subscription.since") }} {{ period_start.strftime('%b') }} {{ period_start.day }}, {{ period_start.year }}
{% endif %}
@@ -87,13 +86,13 @@
{% if usage %}
-
Usage
+
{{ _("subscription.usage_heading") }}
-
Total files (lifetime)
+
{{ _("subscription.lifetime_files") }}
{% if tier.lifetime_file_limit > 0 %}
{% set lifetime_pct = ((usage.lifetime / tier.lifetime_file_limit) * 100) | int %}
@@ -106,14 +105,14 @@
{{ usage.lifetime }} / {{ tier.lifetime_file_limit }}
{% else %}
-
Unlimited
+
{{ _("subscription.unlimited") }}
{% endif %}
-
Files today
+
{{ _("subscription.today_files") }}
{% if tier.daily_upload_limit > 0 %}
{% set today_pct = ((usage.today / tier.daily_upload_limit) * 100) | int %}
@@ -123,17 +122,17 @@
{% if today_pct >= 90 %}bg-red-500{% elif today_pct >= 70 %}bg-yellow-500{% else %}bg-blue-500{% endif %}"
style="width: {{ [today_pct, 100] | min }}%">
-
{{ usage.today }} / {{ tier.daily_upload_limit }} today
+
{{ usage.today }} / {{ tier.daily_upload_limit }} {{ _("subscription.today_label") }}
{% else %}
-
Unlimited
+
{{ _("subscription.unlimited") }}
{% endif %}
-
Files this month
+
{{ _("subscription.month_files") }}
{% if tier.monthly_upload_limit > 0 %}
{% set month_pct = ((usage.month / tier.monthly_upload_limit) * 100) | int %}
@@ -143,10 +142,10 @@
{% if month_pct >= 90 %}bg-red-500{% elif month_pct >= 70 %}bg-yellow-500{% else %}bg-indigo-500{% endif %}"
style="width: {{ [month_pct, 100] | min }}%">
- {{ usage.month }} / {{ tier.monthly_upload_limit }} this month
+ {{ usage.month }} / {{ tier.monthly_upload_limit }} {{ _("subscription.this_month_label") }}
{% else %}
-
Unlimited
+
{{ _("subscription.unlimited") }}
{% endif %}
@@ -160,7 +159,7 @@
- What's included in your plan
+ {{ _("subscription.features_heading") }}
{% for feature in tier.features %}
@@ -176,7 +175,7 @@
- Available Plans
+ {{ _("subscription.available_plans_heading") }}
{% for t in all_tiers %}
@@ -192,11 +191,11 @@
{% if is_current %}
- Current
+ {{ _("subscription.current_badge") }}
{% elif is_pending %}
- Pending
+ {{ _("subscription.pending_badge") }}
{% elif t.badge %}
@@ -208,9 +207,9 @@
{{ t.name }}
{{ t.tagline }}
{% if t.price_monthly > 0 %}
-
+
{% else %}
-
+
{% endif %}
{% for feature in t.features[:3] %}
@@ -220,7 +219,7 @@
{% endfor %}
{% if t.features | length > 3 %}
- + {{ (t.features | length) - 3 }} more
+ + {{ (t.features | length) - 3 }} {{ _("subscription.more_features_label") }}
{% endif %}
@@ -228,14 +227,14 @@
{% if is_current and not pending_tier_id %}
- Your current plan
+ {{ _("subscription.current_plan_cta") }}
{% elif is_current and pending_tier_id %}
- Keep {{ t.name }}
+ {{ _("subscription.keep_plan_prefix") }} {{ t.name }}
{% elif is_upgrade %}
{% if t.id == 'business' %}
@@ -247,21 +246,21 @@
- Upgrade to {{ t.name }}
+ {{ _("subscription.upgrade_to_prefix") }} {{ t.name }}
{% endif %}
{% elif is_pending %}
- Cancel scheduled change
+ {{ _("subscription.cancel_scheduled") }}
{% else %}
- Downgrade to {{ t.name }}
+ {{ _("subscription.downgrade_to_prefix") }} {{ t.name }}
{% endif %}
@@ -270,7 +269,7 @@
- Upgrades take effect immediately. Downgrades are scheduled for the end of your current billing period.
+ {{ _("subscription.upgrade_info") }}
@@ -279,7 +278,7 @@
diff --git a/frontend/translations/en.json b/frontend/translations/en.json
index 38ef55dc..1ba37a20 100644
--- a/frontend/translations/en.json
+++ b/frontend/translations/en.json
@@ -187,6 +187,7 @@
"common.actions": "Actions",
"common.active": "Active",
"common.all": "All",
+ "common.avatar": "Avatar",
"common.back": "Back",
"common.cancel": "Cancel",
"common.close": "Close",
@@ -218,6 +219,7 @@
"common.no": "No",
"common.none": "None",
"common.page": "Page",
+ "common.paused": "Paused",
"common.pending": "Pending",
"common.prev_page": "Previous page",
"common.previous": "Previous",
@@ -234,7 +236,10 @@
"common.submit": "Submit",
"common.success": "Success",
"common.tags": "Tags",
+ "common.test": "Test",
+ "common.test_connection": "Test Connection",
"common.type": "Type",
+ "common.update": "Update",
"common.updated": "Updated",
"common.upload": "Upload",
"common.view": "View",
@@ -597,20 +602,94 @@
"index.usage_my_usage": "My usage",
"index.usage_today": "Files today",
"index.usage_unlimited": "Unlimited",
+ "integrations.access_key_label": "Access Key ID",
+ "integrations.active_label": "Active",
+ "integrations.add_button": "Add Integration",
+ "integrations.add_first_button": "Add Your First Integration",
+ "integrations.api_token_label": "API Token",
+ "integrations.authorize_btn": "Authorize",
+ "integrations.authorize_reauth": "Re-Authorize",
+ "integrations.bucket_label": "Bucket",
"integrations.configure": "Configure",
"integrations.connect": "Connect",
"integrations.connected": "Connected",
+ "integrations.connection_failed": "Connection failed",
+ "integrations.connection_success": "Connection successful",
+ "integrations.delete_confirm_are_you_sure": "Are you sure you want to delete",
+ "integrations.delete_confirm_title": "Delete Integration?",
+ "integrations.delete_confirm_undone": "This action cannot be undone.",
+ "integrations.delete_emails_label": "Delete emails after processing",
+ "integrations.delete_files_label": "Delete files after processing",
+ "integrations.destinations_quota_label": "Storage Destinations:",
+ "integrations.destinations_section": "Destinations",
+ "integrations.direction_destination": "Destination (storage)",
+ "integrations.direction_label": "Direction",
+ "integrations.direction_placeholder": "— Select —",
+ "integrations.direction_source": "Source (ingestion)",
"integrations.disconnect": "Disconnect",
+ "integrations.email_settings": "Email Forward Settings",
"integrations.empty_state": "No integrations configured",
+ "integrations.endpoint_label": "Endpoint URL",
+ "integrations.endpoint_optional": "(optional, for S3-compatible)",
"integrations.folder_label": "Folder",
+ "integrations.folder_optional": "(optional)",
+ "integrations.folder_path_label": "Folder Path",
+ "integrations.folder_prefix_label": "Folder Prefix",
+ "integrations.generic_settings_hint": "Configuration for this integration type can be provided as JSON after creation via the API.",
+ "integrations.gmail_hint": "Gmail labels & star: when enabled, processed emails are starred and tagged with an \"Ingested\" label in Gmail. Only applies to Gmail servers.",
+ "integrations.gmail_labels": "Apply Gmail labels & star",
"integrations.host_label": "Host",
"integrations.imap_settings": "IMAP Settings",
+ "integrations.loading": "Loading integrations…",
+ "integrations.modal_close": "Close modal",
+ "integrations.modal_title_add": "Add Integration",
+ "integrations.modal_title_edit": "Edit Integration",
+ "integrations.name_label": "Label",
+ "integrations.name_placeholder": "e.g. Work Gmail, S3 Archive",
+ "integrations.nextcloud_settings": "Nextcloud Settings",
+ "integrations.no_integrations_body": "Add your first integration to connect ingestion sources (like IMAP) and storage destinations (like S3, Dropbox, or Google Drive).",
"integrations.not_connected": "Not Connected",
+ "integrations.oauth_folder_label": "Folder",
+ "integrations.oauth_hint": "Save this integration first, then use the Authorize button to complete the OAuth flow. Your credentials will be stored securely in your personal integration record.",
"integrations.page_title": "Integrations",
+ "integrations.paperless_settings": "Paperless NGX Settings",
"integrations.password_label": "Password",
+ "integrations.paused": "Paused",
+ "integrations.plan_label": "Plan:",
"integrations.port_label": "Port",
+ "integrations.quota_not_available": "(not available)",
+ "integrations.quota_unlimited": "/ unlimited",
+ "integrations.recipient_label": "Recipient Email",
+ "integrations.region_label": "Region",
+ "integrations.remote_path_label": "Remote Path",
+ "integrations.s3_prefix_label": "Prefix (folder path)",
+ "integrations.s3_settings": "S3 Settings",
+ "integrations.secret_key_label": "Secret Access Key",
+ "integrations.show_password": "Show password",
+ "integrations.show_secrets": "Show secrets",
+ "integrations.show_token": "Show token",
+ "integrations.source_local": "Local Filesystem",
+ "integrations.source_type_label": "Source Type",
+ "integrations.sources_quota_label": "Mailbox Sources:",
+ "integrations.sources_section": "Sources",
+ "integrations.subtitle": "Manage your ingestion sources and storage destinations in one place.",
"integrations.title": "Integrations",
+ "integrations.type_label": "Integration Type",
+ "integrations.type_placeholder": "— Select direction first —",
+ "integrations.upgrade_plan": "Upgrade Plan",
+ "integrations.use_ssl": "Use SSL",
"integrations.username_label": "Username",
+ "integrations.watch_folder_settings": "Watch Folder Settings",
+ "integrations.webdav_settings": "WebDAV Settings",
+ "integrations.webdav_url_label": "WebDAV URL",
+ "integrations.webhook_create_token": "and create a personal token.",
+ "integrations.webhook_heading": "Webhook Ingestion",
+ "integrations.webhook_how_heading": "How Webhook Ingestion Works",
+ "integrations.webhook_how_text": "A webhook integration allows external systems to push documents directly into DocuElevate via the REST API. Instead of DocuElevate polling for new files (like IMAP), your application sends files to DocuElevate using an HTTP request with an API token for authentication.",
+ "integrations.webhook_ideal_text": "This is ideal for CI/CD pipelines, automation scripts, scanner integrations, or any system that generates documents and needs to send them for processing.",
+ "integrations.webhook_quick_start": "Quick Start",
+ "integrations.webhook_security_tip": "Create a dedicated API token for each integration and revoke it immediately if compromised. Tokens can be managed on the API Tokens page.",
+ "integrations.webhook_upload_with_token": "Use the token to upload documents via the API:",
"language.bg": "Български",
"language.ca": "Català",
"language.change_success": "Language changed to {language}",
@@ -649,6 +728,8 @@
"language.uk": "Українська",
"language.zh": "中文",
"nav.about": "About",
+ "nav.account_menu": "Account menu",
+ "nav.account_menu_for": "Account menu for {name}",
"nav.admin": "Admin",
"nav.admin.audit_logs": "Audit Logs",
"nav.admin.backups": "Backups",
@@ -667,6 +748,7 @@
"nav.duplicates": "Duplicates",
"nav.file_manager": "File Manager",
"nav.files": "Files",
+ "nav.get_started": "Get Started",
"nav.help": "Help",
"nav.help_center": "Help Center",
"nav.imap": "Email Import",
@@ -675,18 +757,21 @@
"nav.login": "Log In",
"nav.logout": "Log Out",
"nav.main_navigation": "Main navigation",
+ "nav.my_subscription": "My Subscription",
"nav.notifications": "Notifications",
"nav.open_main_menu": "Open main menu",
"nav.pipelines": "Pipelines",
"nav.plan_designer": "Plan Designer",
"nav.pricing": "Pricing",
"nav.profile": "Profile",
+ "nav.profile_settings": "Profile Settings",
"nav.queue": "Queue",
"nav.queue_monitor": "Queue Monitor",
"nav.scheduled_jobs": "Scheduled Jobs",
"nav.search": "Search",
"nav.settings": "Settings",
"nav.shared_links": "Shared Links",
+ "nav.sign_out": "Sign Out",
"nav.signup": "Sign Up",
"nav.similarity": "Similarity",
"nav.skip_to_content": "Skip to main content",
@@ -742,6 +827,42 @@
"pipelines.system_label": "System",
"pipelines.system_pipeline_label": "System pipeline (visible to all users)",
"pipelines.title": "Processing Pipelines",
+ "profile.avatar_alt": "Your profile picture",
+ "profile.avatar_gravatar_suffix": "is shown.",
+ "profile.avatar_heading": "Profile Picture",
+ "profile.avatar_remove": "Remove custom avatar",
+ "profile.avatar_upload_hint": "Upload a JPEG, PNG, GIF, or WebP image up to 2 MB. If no custom picture is set, your",
+ "profile.choose_image": "Choose image…",
+ "profile.confirm_password": "Confirm New Password",
+ "profile.contact_email_hint": "Used for system notifications. This does not change your login e-mail.",
+ "profile.contact_email_label": "Contact / Notification E-mail",
+ "profile.contact_email_placeholder": "you@example.com",
+ "profile.current_password": "Current Password",
+ "profile.dismiss": "Dismiss",
+ "profile.display_name_hint": "Leave blank to use your account username or email.",
+ "profile.display_name_label": "Display Name",
+ "profile.display_name_placeholder": "Your name as shown in the UI",
+ "profile.general_heading": "General Information",
+ "profile.gravatar_link": "Gravatar",
+ "profile.heading": "Profile Settings",
+ "profile.language_auto_detect": "Auto-detect (from browser)",
+ "profile.language_hint": "Choose your preferred interface language. “Auto-detect” follows your browser settings.",
+ "profile.language_label": "UI Language",
+ "profile.new_password": "New Password",
+ "profile.new_password_hint": "Minimum 8 characters.",
+ "profile.page_title": "Profile Settings – DocuElevate",
+ "profile.password_heading": "Change Password",
+ "profile.preferences_heading": "Preferences",
+ "profile.save_button": "Save Changes",
+ "profile.saving": "Saving…",
+ "profile.subtitle": "Manage your display name, avatar, language, and theme preferences.",
+ "profile.theme_dark": "Dark",
+ "profile.theme_hint": "“System Default” follows your device’s dark-mode setting.",
+ "profile.theme_label": "Colour Scheme",
+ "profile.theme_light": "Light",
+ "profile.theme_system": "System Default",
+ "profile.update_password": "Update Password",
+ "profile.updating": "Updating…",
"queue.active_tasks": "Active Tasks",
"queue.auto_refresh_1": "Auto-refreshes every",
"queue.auto_refresh_2": "seconds",
@@ -927,6 +1048,42 @@
"status.page_title": "System Status",
"status.setting_label": "Setting",
"status.value_label": "Value",
+ "subscription.available_plans_heading": "Available Plans",
+ "subscription.back_to_dashboard": "Back to Dashboard",
+ "subscription.cancel_pending": "Cancel change",
+ "subscription.cancel_scheduled": "Cancel scheduled change",
+ "subscription.contact_sales": "Contact Sales",
+ "subscription.current_badge": "Current",
+ "subscription.current_plan": "Current Plan",
+ "subscription.current_plan_cta": "Your current plan",
+ "subscription.downgrade_to_prefix": "Downgrade to",
+ "subscription.features_heading": "What’s included in your plan",
+ "subscription.free": "Free",
+ "subscription.heading": "My Subscription",
+ "subscription.keep_plan_prefix": "Keep",
+ "subscription.lifetime_files": "Total files (lifetime)",
+ "subscription.month_files": "Files this month",
+ "subscription.more_features_label": "more",
+ "subscription.page_title": "My Subscription – DocuElevate",
+ "subscription.pending_badge": "Pending",
+ "subscription.pending_benefits": "You keep all current plan benefits until then.",
+ "subscription.pending_on": "on",
+ "subscription.pending_title": "Pending plan change scheduled",
+ "subscription.pending_will_change": "Your plan will change to",
+ "subscription.per_mo": "/mo",
+ "subscription.per_month": "/month",
+ "subscription.since": "Since",
+ "subscription.single_user_body_after_link": ".",
+ "subscription.single_user_body_before_link": "Subscription tiers apply when multi-user mode is active. Your instance currently runs in single-user mode with no processing limits. An admin can enable multi-user mode via",
+ "subscription.single_user_title": "Multi-user mode is not enabled.",
+ "subscription.subtitle": "Your current plan, usage and available upgrades.",
+ "subscription.this_month_label": "this month",
+ "subscription.today_files": "Files today",
+ "subscription.today_label": "today",
+ "subscription.unlimited": "Unlimited",
+ "subscription.upgrade_info": "Upgrades take effect immediately. Downgrades are scheduled for the end of your current billing period.",
+ "subscription.upgrade_to_prefix": "Upgrade to",
+ "subscription.usage_heading": "Usage",
"upload.browse_button": "Browse Files",
"upload.button_processing": "Processing...",
"upload.camera_button": "Take Photo / Scan Document",