From 808328f5a438b58c267954a8afcae4f488106cd3 Mon Sep 17 00:00:00 2001 From: chrilep Date: Tue, 24 Mar 2026 11:35:53 +0100 Subject: [PATCH] added russian language issue #86 --- components/providers/intl-provider.tsx | 2 + components/ui/language-switcher.tsx | 3 +- i18n/request.ts | 3 + i18n/routing.ts | 2 +- locales/de/common.json | 3 + locales/en/common.json | 3 + locales/es/common.json | 3 + locales/fr/common.json | 3 + locales/it/common.json | 3 + locales/ja/common.json | 3 + locales/nl/common.json | 3 + locales/pt/common.json | 3 + locales/ru/common.json | 2379 ++++++++++++++++++++++++ 13 files changed, 2411 insertions(+), 2 deletions(-) create mode 100644 locales/ru/common.json diff --git a/components/providers/intl-provider.tsx b/components/providers/intl-provider.tsx index 9454e24b..66228b33 100644 --- a/components/providers/intl-provider.tsx +++ b/components/providers/intl-provider.tsx @@ -11,6 +11,7 @@ import itMessages from '@/locales/it/common.json'; import deMessages from '@/locales/de/common.json'; import nlMessages from '@/locales/nl/common.json'; import ptMessages from '@/locales/pt/common.json'; +import ruMessages from '@/locales/ru/common.json'; // Pre-loaded translations (loaded at build time, not runtime) const ALL_MESSAGES = { @@ -22,6 +23,7 @@ const ALL_MESSAGES = { de: deMessages, nl: nlMessages, pt: ptMessages, + ru: ruMessages, }; interface IntlProviderProps { diff --git a/components/ui/language-switcher.tsx b/components/ui/language-switcher.tsx index fa000095..c918c651 100644 --- a/components/ui/language-switcher.tsx +++ b/components/ui/language-switcher.tsx @@ -16,7 +16,8 @@ export function LanguageSwitcher({ className }: { className?: string }) { { value: 'it', label: 'Italiano' }, { value: 'de', label: 'Deutsch' }, { value: 'nl', label: 'Nederlands' }, - { value: 'pt', label: 'Português' } + { value: 'pt', label: 'Português' }, + { value: 'ru', label: 'Русский' } ]; return ( diff --git a/i18n/request.ts b/i18n/request.ts index 32349866..d62b07eb 100644 --- a/i18n/request.ts +++ b/i18n/request.ts @@ -32,6 +32,9 @@ export default getRequestConfig(async ({ requestLocale }) => { case 'pt': messages = (await import('../locales/pt/common.json')).default; break; + case 'ru': + messages = (await import('../locales/ru/common.json')).default; + break; default: messages = (await import('../locales/en/common.json')).default; } diff --git a/i18n/routing.ts b/i18n/routing.ts index 5296c9d1..27a11349 100644 --- a/i18n/routing.ts +++ b/i18n/routing.ts @@ -1,7 +1,7 @@ import { defineRouting } from 'next-intl/routing'; export const routing = defineRouting({ - locales: ['en', 'fr', 'de', 'es', 'it', 'ja', 'nl', 'pt'], + locales: ['en', 'fr', 'de', 'es', 'it', 'ja', 'nl', 'pt', 'ru'], defaultLocale: 'en', localePrefix: 'never' }); diff --git a/locales/de/common.json b/locales/de/common.json index 968765fc..81d458cc 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russisch", "select_language": "Sprache auswählen", "switch_to_english": "Zu Englisch wechseln", "switch_to_french": "Zu Französisch wechseln", @@ -592,6 +593,7 @@ "switch_to_german": "Zu Deutsch wechseln", "switch_to_dutch": "Zu Niederländisch wechseln", "switch_to_portuguese": "Zu Portugiesisch wechseln", + "switch_to_russian": "Zu Russisch wechseln", "switching": "Sprache wird gewechselt..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Verfolgen Sie Ihre Postfachgröße hier. Der Kreis füllt sich mit zunehmendem Verbrauch." } } + diff --git a/locales/en/common.json b/locales/en/common.json index 269c82f1..51ce7896 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russian", "select_language": "Select language", "switch_to_english": "Switch to English", "switch_to_french": "Switch to French", @@ -592,6 +593,7 @@ "switch_to_german": "Switch to German", "switch_to_dutch": "Switch to Dutch", "switch_to_portuguese": "Switch to Portuguese", + "switch_to_russian": "Switch to Russian", "switching": "Changing language..." }, "settings": { @@ -2374,3 +2376,4 @@ "quota_desc": "Track your mailbox size here. The circle fills up as you use more space." } } + diff --git a/locales/es/common.json b/locales/es/common.json index dc0770b9..4b22d815 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Ruso", "select_language": "Seleccionar idioma", "switch_to_english": "Cambiar a inglés", "switch_to_french": "Cambiar a francés", @@ -592,6 +593,7 @@ "switch_to_german": "Cambiar a alemán", "switch_to_dutch": "Cambiar a neerlandés", "switch_to_portuguese": "Cambiar a portugués", + "switch_to_russian": "Cambiar a ruso", "switching": "Cambiando idioma..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Controla el tamaño de tu buzón aquí. El círculo se llena a medida que usas más espacio." } } + diff --git a/locales/fr/common.json b/locales/fr/common.json index ec1dded2..d79af376 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russe", "select_language": "Sélectionner la langue", "switch_to_english": "Passer à l'anglais", "switch_to_french": "Passer au français", @@ -592,6 +593,7 @@ "switch_to_german": "Passer à l'allemand", "switch_to_dutch": "Passer au néerlandais", "switch_to_portuguese": "Passer au portugais", + "switch_to_russian": "Passer au russe", "switching": "Changement de langue..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Suivez la taille de votre boîte mail ici. Le cercle se remplit au fur et à mesure que vous utilisez plus d'espace." } } + diff --git a/locales/it/common.json b/locales/it/common.json index eb4221ef..a2be5837 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russo", "select_language": "Seleziona lingua", "switch_to_english": "Passa all'inglese", "switch_to_french": "Passa al francese", @@ -592,6 +593,7 @@ "switch_to_german": "Passa al tedesco", "switch_to_dutch": "Passa all'olandese", "switch_to_portuguese": "Passa al portoghese", + "switch_to_russian": "Passa al russo", "switching": "Cambio lingua in corso..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Monitora le dimensioni della tua casella qui. Il cerchio si riempie man mano che utilizzi più spazio." } } + diff --git a/locales/ja/common.json b/locales/ja/common.json index 34e38d89..6e789851 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "ロシア語", "select_language": "言語を選択", "switch_to_english": "英語に切り替え", "switch_to_french": "フランス語に切り替え", @@ -592,6 +593,7 @@ "switch_to_german": "ドイツ語に切り替え", "switch_to_dutch": "オランダ語に切り替え", "switch_to_portuguese": "ポルトガル語に切り替え", + "switch_to_russian": "ロシア語に切り替え", "switching": "言語を変更中..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "メールボックスのサイズをここで確認できます。使用量が増えるとサークルが満たされます。" } } + diff --git a/locales/nl/common.json b/locales/nl/common.json index 83e89f5f..00e32ee0 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russisch", "select_language": "Selecteer taal", "switch_to_english": "Overschakelen naar Engels", "switch_to_french": "Overschakelen naar Frans", @@ -592,6 +593,7 @@ "switch_to_german": "Overschakelen naar Duits", "switch_to_dutch": "Overschakelen naar Nederlands", "switch_to_portuguese": "Overschakelen naar Portugees", + "switch_to_russian": "Overschakelen naar Russisch", "switching": "Taal wijzigen..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Volg de grootte van uw mailbox hier. De cirkel vult zich naarmate u meer ruimte gebruikt." } } + diff --git a/locales/pt/common.json b/locales/pt/common.json index 6f3a363e..34e4b364 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -583,6 +583,7 @@ "german": "Deutsch", "dutch": "Nederlands", "portuguese": "Português", + "russian": "Russo", "select_language": "Selecionar idioma", "switch_to_english": "Mudar para Inglês", "switch_to_french": "Mudar para Francês", @@ -592,6 +593,7 @@ "switch_to_german": "Mudar para Alemão", "switch_to_dutch": "Mudar para Holandês", "switch_to_portuguese": "Mudar para Português", + "switch_to_russian": "Mudar para Russo", "switching": "Alterando idioma..." }, "settings": { @@ -2329,3 +2331,4 @@ "quota_desc": "Acompanhe o tamanho da sua caixa de correio aqui. O círculo preenche-se à medida que utiliza mais espaço." } } + diff --git a/locales/ru/common.json b/locales/ru/common.json new file mode 100644 index 00000000..913486ac --- /dev/null +++ b/locales/ru/common.json @@ -0,0 +1,2379 @@ +{ + "login": { + "title": "Webmail", + "username_label": "Email", + "username_placeholder": "user@example.com", + "password_label": "Password", + "password_placeholder": "Enter your password", + "sign_in": "Sign in", + "signing_in": "Signing in...", + "loading": "Loading...", + "reconnecting": "Connection lost. Attempting to reconnect…", + "error": { + "invalid_credentials": "Invalid email or password. Please check your credentials and try again.", + "connection_failed": "Unable to reach the server. Check your internet connection and try again.", + "cors_blocked": "The server is reachable but is blocking cross-origin requests. Check your JMAP server's CORS settings and allow this domain.", + "server_error": "The server is temporarily unavailable. Please try again later.", + "generic": "An unexpected error occurred. If this persists, contact your administrator.", + "totp_invalid": "Invalid authentication code. Please check your authenticator app and try again.", + "oauth_discovery_failed": "SSO is enabled but the identity provider could not be reached. Check your OAuth configuration." + }, + "show_password": "Show password", + "hide_password": "Hide password", + "totp_toggle": "I have a 2FA code", + "remember_me": "Remember me", + "config_error": { + "title": "Configuration Error", + "fetch_failed": "Unable to load application configuration. Please try again later.", + "server_not_configured": "The mail server has not been configured. Please contact your administrator." + }, + "remove_from_history": "Remove from history", + "totp_label": "Authentication code", + "totp_placeholder": "000000", + "session_expired": "Your session has expired. Please sign in again.", + "dismiss": "Dismiss", + "or": "or", + "sign_in_sso": "Sign in with SSO", + "add_account_title": "Add Account", + "add_account_subtitle": "Sign in with another account", + "cancel": "Cancel", + "website": "Website", + "imprint": "Imprint", + "privacy_policy": "Privacy Policy", + "try_demo": "Try Demo", + "demo_description": "Explore with sample data — no account needed", + "demo_launching": "Launching demo...", + "demo_login_button": "Launch Demo", + "demo_tagline": "Experience a full-featured email client. No account required.", + "demo_no_signup": "No signup needed — explore freely with sample data", + "oauth_completing": "Completing sign in...", + "oauth_error": { + "title": "Authentication Failed", + "invalid_state": "Security validation failed. Please try signing in again.", + "missing_params": "Missing authorization data. Please try signing in again.", + "token_exchange_failed": "Failed to complete authentication. Please try again.", + "access_denied": "Access was denied. Please contact your administrator.", + "back_to_login": "Back to login" + } + }, + "sidebar": { + "close": "Close", + "compose": "Compose", + "compose_hint": "Compose (c)", + "search_placeholder": "Search mail...", + "search_placeholder_hint": "Search mail... (press /)", + "storage": "Storage", + "storage_used": "Used", + "storage_free": "Free", + "storage_total": "Total", + "sign_out": "Sign out", + "sign_out_of": "Sign out of {account}", + "sign_out_all": "Sign out of all accounts", + "add_account": "Add account", + "set_as_default": "Set as default", + "switch_account": "Switch account", + "contacts": "Contacts", + "calendar": "Calendar", + "settings": "Settings", + "files": "Files", + "loading_mailboxes": "Loading mailboxes...", + "push_connected": "Real-time updates active", + "push_disconnected": "Real-time updates inactive", + "keyboard_shortcuts": "Keyboard Shortcuts", + "theme": { + "light": "Light mode", + "dark": "Dark mode", + "system": "System theme" + }, + "language": { + "title": "Language" + }, + "mailboxes": { + "inbox": "Inbox", + "sent": "Sent", + "drafts": "Drafts", + "trash": "Trash", + "archive": "Archive", + "starred": "Starred", + "all_mail": "All Mail", + "spam": "Spam", + "important": "Important" + }, + "expand": "Expand", + "collapse": "Collapse", + "expand_tooltip": "Expand", + "collapse_tooltip": "Collapse", + "mobile": { + "search": "Search", + "compose": "Compose", + "go_back": "Go back" + }, + "clear_search": "Clear search", + "vacation_active": "Vacation responder is active", + "demo_banner": "Demo Mode", + "demo_reset": "Reset", + "demo_tour": "Tour", + "tags": "Tags", + "mail": "Mail", + "nav_label": "Navigation", + "add_app": "Apps" + }, + "sidebar_apps": { + "modal_title": "Sidebar Apps", + "add_new": "Add App", + "edit_app": "Edit App", + "name_label": "Name", + "name_placeholder": "My App", + "name_required": "Name is required", + "url_label": "URL", + "url_required": "URL is required", + "url_invalid": "Enter a valid http or https URL", + "icon_label": "Icon", + "icon_required": "Icon is required", + "open_mode_label": "Open Mode", + "open_new_tab": "New Tab", + "open_inline": "Inline", + "cancel": "Cancel", + "add": "Add", + "update": "Update", + "delete": "Delete", + "delete_confirm_title": "Delete App", + "delete_confirm": "Are you sure you want to delete \"{name}\"?", + "no_apps": "No apps added yet", + "no_apps_hint": "Add custom apps and links to your sidebar", + "search_icons": "Search icons...", + "show_popular": "Popular", + "show_all": "All", + "no_icons_found": "No icons found", + "inline_badge": "Inline", + "tab_badge": "Tab", + "show_on_mobile": "Show on Mobile" + }, + "email_list": { + "no_emails": "No messages found", + "no_emails_description": "This mailbox is empty", + "no_search_results": "No results found", + "no_search_results_description": "Try adjusting your search or filters", + "loading": "Loading emails...", + "unread": "unread", + "to_me": "To me", + "to_recipients": "To {count} recipients", + "and_others": "and {count} others", + "draft": "Draft", + "starred": "Starred", + "conversations_count": "{count} of {total} conversations", + "conversations_count_plus": "{count}+ conversations", + "conversations_count_simple": "{count} conversations", + "no_conversations": "No conversations", + "loading_more": "Loading more emails...", + "no_more_emails": "No more emails to load", + "batch_actions": { + "select": "Select emails", + "select_all": "Select all", + "mark_read": "Mark as read", + "mark_unread": "Mark as unread", + "delete": "Delete", + "delete_confirm_title": "Delete emails", + "delete_confirm_message": "Are you sure you want to delete {count, plural, one {1 email} other {# emails}}?", + "clear_selection": "Clear selection" + }, + "permanent_delete": "Delete permanently", + "permanent_delete_confirm_title": "Permanently delete", + "permanent_delete_confirm_message": "This email will be permanently deleted. This action cannot be undone.", + "permanent_delete_confirm_batch_message": "These {count, plural, one {1 email} other {# emails}} will be permanently deleted. This action cannot be undone.", + "empty_folder": { + "button": "Empty folder", + "confirm_title": "Empty folder", + "confirm_message": "All emails in this folder will be permanently deleted. This action cannot be undone.", + "confirm_button": "Empty folder", + "junk_hint": "You can empty the Junk folder to permanently remove all messages.", + "trash_hint": "You can empty the Trash folder to permanently remove all messages." + } + }, + "email_viewer": { + "no_email_selected": "No email selected", + "no_email_description": "Select an email from the list to view it here", + "no_conversation_selected": "No conversation selected", + "no_conversation_description": "Choose a conversation from the list to read it here", + "no_subject": "(No Subject)", + "loading_email": "Loading email...", + "loading": "Loading...", + "reply": "Reply", + "reply_all": "Reply All", + "forward": "Forward", + "delete": "Delete", + "archive": "Archive", + "star": "Star", + "unstar": "Unstar", + "mark_unread": "Mark as unread", + "mark_read": "Mark as read", + "print": "Print", + "view_source": "View source", + "export_email": "Export as .eml", + "import_email": "Import .eml", + "keyboard_shortcuts": "Keyboard shortcuts (?)", + "email_source": "Email Source", + "draft_banner": "This message is a draft", + "edit_draft": "Edit", + "copy_source": "Copy to clipboard", + "source_copied": "Source copied to clipboard", + "attachments": "Attachments", + "important": "Important", + "download": "Download", + "download_all": "Download all", + "from": "From", + "to": "To", + "cc": "CC", + "bcc": "BCC", + "date": "Date", + "subject": "Subject", + "show_details": "Show details", + "hide_details": "Hide details", + "external_content_warning": "Images and external content have been blocked", + "load_external_content": "Load images", + "trust_sender": "Always trust this sender", + "back_to_list": "Back to list", + "view_contact": "View contact", + "message_details": "Message Details", + "more_reply_options": "More reply options", + "set_color": "Set tag", + "tag": "Tag", + "more_actions": "More actions", + "previous": "Prev", + "next": "Next", + "move_to": "Move to...", + "remove_color": "Remove tag", + "more_count": "+{count} more", + "characters_count": "{count} characters", + "quick_reply_placeholder": "Write a quick reply...", + "more_options": "More options", + "sending": "Sending...", + "security_authentication": "Security & Authentication", + "technical_details": "Technical Details", + "message_id_label": "Message-ID:", + "reply_to_label": "Reply-To:", + "delivery_time_label": "Delivery time:", + "conversation_part_label": "Part of conversation:", + "previous_messages": "{count} previous message", + "previous_messages_plural": "{count} previous messages", + "time": { + "day": "day", + "days": "days", + "hour": "hour", + "hours": "hours", + "minute": "minute", + "minutes": "minutes" + }, + "unknown_sender": "Unknown", + "recipient_me": "me", + "recipient_and_others": "{name} and {count} others", + "recipient_to_prefix": "To:", + "authentication": { + "title": "Authentication", + "status": { + "verified": "Verified", + "warning": "Warning", + "none": "Not authenticated" + }, + "spf": { + "pass": "SPF Pass", + "fail": "SPF Fail", + "none": "No SPF" + }, + "dkim": { + "pass": "DKIM Valid", + "fail": "DKIM Invalid", + "none": "No DKIM" + }, + "dmarc": { + "pass": "DMARC Pass", + "fail": "DMARC Fail", + "none": "No DMARC" + }, + "spam_score": "Spam Score" + }, + "headers": { + "routing": "Routing", + "received": "Received", + "message_id": "Message ID", + "list_info": "List Information" + }, + "color_tag": { + "title": "Color Tag", + "red": "Red", + "orange": "Orange", + "yellow": "Yellow", + "green": "Green", + "blue": "Blue", + "purple": "Purple", + "pink": "Pink", + "none": "None" + }, + "tooltips": { + "reply": "Reply (r)", + "reply_all": "Reply All (a)", + "forward": "Forward (f)", + "archive": "Archive (e)", + "delete": "Delete (# or Del)", + "star": "Star (s)", + "unstar": "Unstar (s)", + "compose": "Compose (c)", + "previous": "Previous email", + "next": "Next email", + "edit_draft": "Edit draft" + }, + "spam": { + "button_title": "Report spam", + "not_spam_title": "Mark as legitimate", + "toast_success": "Moved to Junk", + "toast_batch": "{count} emails moved to Junk", + "toast_undo": "Undo", + "toast_not_spam_success": "Moved to Inbox", + "toast_not_spam_batch": "{count} emails moved to Inbox", + "error": "Failed to report spam", + "error_not_spam": "Failed to restore email" + }, + "unsubscribe_banner": { + "label": "Newsletter", + "button": "Unsubscribe", + "confirm_title": "Unsubscribe from this sender?", + "confirm_button": "Confirm", + "cancel": "Cancel", + "success_http": "Unsubscribe page opened in new tab", + "success_mailto": "Unsubscribe request sent to your email client", + "error": "Unable to unsubscribe", + "dismiss": "Dismiss" + }, + "calendar_invitation": { + "loading": "Loading event details…", + "title": "Calendar Invitation", + "published_title": "Published Event", + "response_title": "Event Response", + "update_title": "Event Update", + "counter_title": "Counter Proposal", + "refresh_title": "Refresh Request", + "declined_counter_title": "Counter Proposal Declined", + "cancelled_title": "Event Cancelled", + "organizer": "Organized by {name}", + "attendees": "{count, plural, one {# attendee} other {# attendees}}", + "accept": "Accept", + "maybe": "Maybe", + "decline": "Decline", + "add_to_calendar": "Add to calendar", + "added": "Added to calendar", + "rsvp_sent": "Response sent", + "parse_error": "Could not read invitation", + "action_failed": "Could not complete that calendar action.", + "no_calendar": "Calendar not available", + "published_info": "This event was shared for reference.", + "response_info": "This message contains an attendee response.", + "response_info_organizer": "This attendee response updates your event.", + "update_info": "This message updates an existing event.", + "counter_info": "This message proposes changes to an event.", + "counter_info_organizer": "This attendee proposed changes to your event.", + "refresh_info": "This message requests the latest event details.", + "refresh_info_organizer": "An attendee requested the latest event details.", + "declined_counter_info": "The organizer declined a counter proposal.", + "authentication_failed_info": "Mail authentication checks for this invitation failed. Treat calendar actions with caution.", + "authentication_missing_info": "This invitation does not include verified mail authentication. Confirm the details with the organizer if anything looks unusual.", + "sender_mismatch_info": "This invitation was sent from {sender}, while the organizer listed in the calendar data is {organizer}.", + "sender_mismatch_unverified_info": "This invitation was sent from {sender}, while the organizer listed in the calendar data is {organizer}, and the message could not be verified.", + "organizer_role": "You organize this event", + "your_response": "Your response: {status}", + "response_needed": "Needs response", + "response_accepted": "Accepted", + "response_tentative": "Tentative", + "response_declined": "Declined", + "response_delegated": "Delegated", + "actor_sent_info": "Sent by {name}.", + "actor_response_info": "{name} responded {status}.", + "actor_counter_info": "{name} proposed changes to this event.", + "actor_refresh_info": "{name} asked for the latest event details.", + "actor_declined_counter_info": "{name} declined the counter proposal.", + "actor_note": "Note: {comment}", + "actor_unknown": "Someone", + "proposed_changes": "Proposed changes", + "change_title": "Title", + "change_time": "Time", + "change_location": "Location", + "change_description": "Description", + "change_empty": "None", + "change_from_to": "{before} -> {after}", + "apply_proposal": "Apply proposed changes", + "proposal_applied": "Proposed changes applied.", + "review_proposal": "Review proposal", + "review_request": "Review request", + "view_in_calendar": "View in calendar", + "select_calendar": "Select calendar", + "already_in_calendar": "Already in your calendar", + "request_info": "You've been invited to this event. Respond to let the organizer know your availability.", + "cancel_info": "The organizer has cancelled this event.", + "event_updated": "Update #{sequence}", + "event_status_tentative": "Tentative", + "event_status_cancelled": "Cancelled" + }, + "send": "Send", + "more": "more" + }, + "email_composer": { + "new_message": "New Message", + "reply": "Reply", + "reply_all": "Reply All", + "forward": "Forward", + "reply_to": "Reply", + "reply_all_to": "Reply All", + "forward_message": "Forward", + "from": "From", + "to": "To", + "cc": "CC", + "bcc": "BCC", + "subject": "Subject", + "body_placeholder": "Write your message...", + "send": "Send", + "cancel": "Cancel", + "attach": "Attach", + "discard": "Discard", + "discard_draft_title": "Discard draft?", + "discard_draft_confirm": "You have unsaved changes. Do you want to discard this draft?", + "saving": "Saving...", + "draft_saved": "Draft saved", + "save_failed": "Failed to save", + "to_placeholder": "Recipient email addresses", + "cc_placeholder": "Cc recipients", + "bcc_placeholder": "Bcc recipients", + "subject_placeholder": "Subject", + "cc_label": "Cc:", + "bcc_label": "Bcc:", + "subject_label": "Subject:", + "file_size_kb": "KB", + "prefix": { + "forward": "Fwd:", + "reply": "Re:" + }, + "no_subject": "(No Subject)", + "unknown_sender": "Unknown", + "quote": { + "reply_header": "On {date}, {sender} wrote:", + "forward_header": "---------- Forwarded message ----------", + "from": "From: {sender}", + "date": "Date: {date}", + "subject": "Subject: {subject}", + "to": "To: {recipients}" + }, + "remove_sub_address": "Remove sub-address", + "use_template": "Template", + "save_as_template": "Save as Template", + "validation": { + "recipient_required": "Add a recipient to send", + "subject_required": "Add a subject", + "body_required": "Write a message or attach a file" + }, + "upload_progress": "Uploading {uploaded} / {total}", + "upload_cancel": "Cancel upload", + "upload_failed": "Failed to upload {filename}", + "drop_files": "Drop files to attach", + "show_less": "Show less", + "send_failed": "Failed to send email", + "continue_draft": "Continue draft", + "close_draft_title": "Save or discard draft?", + "close_draft_message": "You have unsaved changes. Would you like to save this as a draft or discard it?", + "save_draft": "Save Draft", + "smime_sign_on": "S/MIME signing enabled", + "smime_sign_off": "Enable S/MIME signing", + "smime_encrypt_on": "S/MIME encryption enabled", + "smime_encrypt_off": "Enable S/MIME encryption", + "smime_encrypt_unavailable": "S/MIME encryption unavailable – missing recipient certificates", + "smime_unlock_title": "Unlock S/MIME Key", + "smime_unlock_message": "Enter the passphrase to unlock your S/MIME signing key.", + "smime_unlock_button": "Unlock", + "smime_passphrase_placeholder": "Passphrase" + }, + "confirm_dialog": { + "confirm": "Confirm", + "cancel": "Cancel" + }, + "common": { + "loading": "Loading...", + "error": "Error", + "success": "Success", + "cancel": "Cancel", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "search": "Search", + "refresh": "Refresh", + "settings": "Settings", + "help": "Help", + "logout": "Logout", + "yes": "Yes", + "no": "No", + "unknown": "Unknown", + "app_title": "Webmail", + "reconnecting": "Connection lost. Attempting to reconnect…" + }, + "notifications": { + "email_sent": "Email sent successfully", + "email_deleted": "Email deleted", + "email_archived": "Email archived", + "email_starred": "Email starred", + "email_unstarred": "Email unstarred", + "email_marked_read": "Email marked as read", + "email_marked_unread": "Email marked as unread", + "copied_to_clipboard": "Copied to clipboard", + "source_copied": "Source copied to clipboard", + "error_sending": "Failed to send email", + "error_deleting": "Failed to delete email", + "error_loading": "Failed to load emails", + "new_email": "New email", + "new_email_from": "From {sender}", + "click_to_view": "Click to view", + "email_moved": "Email moved", + "emails_moved": "{count} emails moved", + "moved_to_mailbox": "Moved to {mailbox}", + "move_failed": "Move failed", + "move_error": "Could not move emails to the selected folder", + "email_tagged": "Email tagged", + "emails_tagged": "{count} emails tagged", + "tag_failed": "Tagging failed", + "identity_created": "Identity created successfully", + "identity_updated": "Identity updated successfully", + "identity_deleted": "Identity deleted", + "identity_set_primary": "Primary identity updated", + "identity_create_failed": "Failed to create identity: {error}", + "identity_update_failed": "Failed to update identity: {error}", + "identity_delete_failed": "Failed to delete identity: {error}", + "identity_unauthorized": "You are not authorized to send from this email address", + "identity_not_found": "Identity not found", + "vacation_saved": "Vacation responder settings saved", + "vacation_save_failed": "Failed to save vacation responder settings", + "filters_saved": "Filters saved successfully", + "filters_save_failed": "Failed to save filters", + "filters_deleted": "Filter rule deleted", + "templates_exported": "Templates exported successfully", + "templates_imported": "{count, plural, one {# template} other {# templates}} imported", + "templates_import_errors": "Some templates could not be imported", + "templates_import_empty": "No templates found in the file", + "export_email_error": "Failed to export email", + "import_email_success": "Email imported successfully", + "import_email_error": "Failed to import email" + }, + "date": { + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week", + "this_month": "This month", + "older": "Older", + "just_now": "Just now", + "minutes_ago": "{count} minute ago", + "minutes_ago_plural": "{count} minutes ago", + "hours_ago": "{count} hour ago", + "hours_ago_plural": "{count} hours ago", + "days_ago": "{count} day ago", + "days_ago_plural": "{count} days ago" + }, + "language": { + "title": "Language", + "english": "English", + "french": "Français", + "japanese": "日本語", + "spanish": "Español", + "italian": "Italiano", + "german": "Deutsch", + "dutch": "Nederlands", + "portuguese": "Português", + "russian": "Русский", + "select_language": "Select language", + "switch_to_english": "Switch to English", + "switch_to_french": "Switch to French", + "switch_to_japanese": "Switch to Japanese", + "switch_to_spanish": "Switch to Spanish", + "switch_to_italian": "Switch to Italian", + "switch_to_german": "Switch to German", + "switch_to_dutch": "Switch to Dutch", + "switch_to_portuguese": "Switch to Portuguese", + "switch_to_russian": "Переключиться на русский", + "switching": "Changing language..." + }, + "settings": { + "title": "Settings", + "back_to_mail": "Back to Mail", + "save_success": "Settings saved successfully", + "import_success": "Settings imported successfully", + "import_error": "Failed to import settings", + "reset_confirm": "Are you sure you want to reset all settings to defaults?", + "unsaved_changes": "You have unsaved changes", + "discard_changes": "Discard unsaved changes?", + "discard": "Discard", + "keep_editing": "Keep editing", + "tabs": { + "appearance": "Appearance", + "language": "Language & Region", + "email": "Email Behavior", + "composer": "Composer", + "privacy": "Privacy & Security", + "account": "Account", + "identities": "Identities", + "vacation": "Vacation Responder", + "advanced": "Advanced", + "calendar": "Calendar", + "filters": "Filters", + "templates": "Templates", + "folders": "Folders", + "keywords": "Keywords", + "security": "Security", + "files": "Files", + "contacts": "Contacts", + "encryption": "Encryption", + "sidebar_apps": "Sidebar Apps", + "notifications": "Notifications" + }, + "tab_groups": { + "general": "General", + "account": "Account & Identity", + "organization": "Mail Organization", + "apps": "Apps", + "system": "System" + }, + "appearance": { + "title": "Appearance", + "description": "Customize the look and feel of your webmail", + "theme": { + "label": "Theme", + "description": "Choose your preferred color scheme", + "light": "Light", + "dark": "Dark", + "system": "System" + }, + "language": { + "label": "Language", + "description": "Choose your preferred language" + }, + "font_size": { + "label": "Font Size", + "description": "Adjust text size for better readability", + "small": "Small", + "medium": "Medium", + "large": "Large" + }, + "list_density": { + "label": "Density", + "description": "Control spacing and padding across the UI", + "extra_compact": "Extra Compact", + "compact": "Compact", + "regular": "Regular", + "comfortable": "Comfortable" + }, + "animations": { + "label": "Enable Animations", + "description": "Show smooth transitions and effects" + }, + "toolbar_position": { + "label": "Toolbar Position", + "description": "Where to show email action buttons (Reply, Archive, Delete, etc.)", + "top": "Top", + "below_subject": "Below subject" + }, + "toolbar_labels": { + "label": "Show Toolbar Labels", + "description": "Display text labels next to toolbar icons. Disable to save space once you are familiar with the icons." + } + }, + "keywords": { + "title": "Email Keywords", + "description": "Define keywords (labels/tags) to organize your emails with colors. These are stored as JMAP keywords on the server.", + "add_keyword": "Add Keyword", + "reset_defaults": "Reset to Defaults", + "label_field": "Display Name", + "label_placeholder": "e.g. Work, Personal, Urgent", + "id_field": "Keyword ID", + "id_placeholder": "e.g. work, personal", + "color_field": "Color", + "id_exists": "This keyword ID already exists", + "edit": "Edit keyword", + "delete": "Delete keyword", + "save": "Save", + "add": "Add", + "cancel": "Cancel", + "migrating": "Updating keyword on existing emails…", + "migration_error": "Failed to update keyword on existing emails" + }, + "notifications": { + "test_sound": "Test notification sound", + "sounds": { + "default": "Default (Beep)", + "cheerful": "Cheerful", + "involved": "Involved", + "swift": "Swift Gesture", + "relax": "Relax" + }, + "sound_selection": { + "title": "Notification Sound", + "description": "Choose which sound to play for notifications", + "choose": "Sound", + "choose_desc": "Select a notification tone and click the speaker icon to preview it" + }, + "email": { + "title": "Email Notifications", + "description": "Configure notifications for incoming emails", + "enabled": "Email notifications", + "enabled_desc": "Show notifications when new emails arrive", + "sound": "Notification sound", + "sound_desc": "Play an audio alert when new emails arrive" + }, + "calendar": { + "title": "Calendar Notifications", + "description": "Configure notifications for calendar events", + "enabled": "Event notifications", + "enabled_desc": "Show alerts for upcoming calendar events", + "sound": "Notification sound", + "sound_desc": "Play an audio alert for calendar reminders", + "invitation_parsing": "Parse email invitations", + "invitation_parsing_desc": "Detect calendar invitations in email attachments and show calendar actions" + } + }, + "language_region": { + "title": "Language & Region", + "description": "Configure language and regional preferences", + "language": { + "label": "Language", + "description": "Choose your preferred language", + "english": "English", + "french": "Français" + }, + "date_format": { + "label": "Date Format", + "description": "How dates should be displayed", + "regional": "Regional", + "iso": "ISO 8601", + "custom": "Custom" + }, + "time_format": { + "label": "Time Format", + "description": "Choose between 12-hour or 24-hour clock", + "12h": "12-hour", + "24h": "24-hour" + }, + "first_day": { + "label": "First Day of Week", + "description": "Start week on Sunday or Monday", + "sunday": "Sunday", + "monday": "Monday" + } + }, + "email_behavior": { + "title": "Email Behavior", + "description": "Configure how emails are handled", + "mark_read": { + "label": "Mark as Read", + "description": "When to mark emails as read when opened", + "instant": "Instantly", + "delay_3s": "After 3 seconds", + "delay_5s": "After 5 seconds", + "never": "Never" + }, + "delete_action": { + "label": "Delete Action", + "description": "What happens when you delete an email", + "trash": "Move to Trash", + "permanent": "Delete Permanently", + "warning": "Emails will be permanently deleted and cannot be recovered. This action is irreversible." + }, + "archive_mode": { + "label": "Archive in", + "description": "How to organize emails when archiving", + "single": "A single folder", + "year": "A folder per year", + "month": "A folder per month", + "reorganize": "Reorganize existing archive", + "reorganize_success": "{count, plural, =0 {No emails to reorganize} =1 {1 email reorganized} other {# emails reorganized}}", + "reorganize_error": "Failed to reorganize archive" + }, + "permanently_delete_junk": { + "label": "Permanently Delete Junk", + "description": "Permanently delete emails from the Junk/Spam folder instead of moving them to Trash" + }, + "show_preview": { + "label": "Show Preview Text", + "description": "Display email preview in the list" + }, + "attachment_click_action": { + "label": "Attachment Click Action", + "description": "Choose whether clicking a file attachment previews it or downloads it immediately", + "preview": "Preview when possible", + "download": "Download immediately" + }, + "attachment_position": { + "label": "Attachment Position", + "description": "Where to display attachments in the email header", + "beside-sender": "Next to sender", + "below-header": "Below header" + }, + "emails_per_page": { + "10": "10 emails", + "25": "25 emails", + "50": "50 emails", + "100": "100 emails", + "label": "Emails Per Page", + "description": "Number of emails to load at once" + }, + "always_light_mode": { + "label": "Always Show Emails in Light Mode", + "description": "Render email content in light mode even when the app is in dark mode, avoiding dark mode conversion issues" + }, + "external_content": { + "label": "External Content", + "description": "How to handle images and external content", + "ask": "Always ask", + "block": "Always block", + "allow": "Always allow" + }, + "trusted_senders": { + "label": "Trusted Senders", + "description": "Manage senders whose images load automatically", + "count_zero": "None", + "count_one": "1 sender", + "count_other": "{count} senders", + "modal_title": "Trusted Senders", + "empty_title": "No trusted senders yet", + "empty_description": "When viewing an email with blocked images, click \"Always trust this sender\" to add them here.", + "add_manually": "Add sender manually", + "add_button": "Add", + "add_placeholder": "Enter email address", + "search_placeholder": "Search senders...", + "no_results": "No senders match your search", + "remove": "Remove", + "close": "Close", + "invalid_email": "Please enter a valid email address", + "already_added": "This sender is already trusted" + }, + "hover_actions": { + "label": "Quick Hover Actions", + "description": "Choose which quick actions appear when hovering over an email in the list", + "delete": "Delete", + "star": "Star / Unstar", + "mark_read": "Mark Read / Unread", + "archive": "Archive", + "tag": "Tag", + "spam": "Mark as Spam", + "none_selected": "No actions selected" + }, + "default_mail_program": { + "label": "Default Mail Program", + "description": "Register {appName} as your default mail program for mailto: links", + "button": "Set as Default", + "success": "Browser prompted to set as default", + "error": "Your browser does not support this feature" + } + }, + "composer": { + "title": "Composer", + "description": "Configure email composition settings", + "autosave": { + "label": "Auto-save Interval", + "description": "How often to save drafts automatically", + "30s": "Every 30 seconds", + "1m": "Every minute", + "2m": "Every 2 minutes", + "5m": "Every 5 minutes" + }, + "send_confirmation": { + "label": "Send Confirmation", + "description": "Ask for confirmation before sending emails" + }, + "default_reply": { + "label": "Default Reply Mode", + "description": "Default action when clicking reply", + "reply": "Reply", + "reply_all": "Reply All" + } + }, + "privacy": { + "title": "Privacy & Security", + "description": "Manage your privacy and security settings", + "external_images": { + "label": "Block External Images", + "description": "Prevent tracking through external images" + }, + "session_timeout": { + "label": "Session Timeout", + "description": "Automatically log out after inactivity", + "never": "Never", + "30m": "30 minutes", + "1h": "1 hour", + "4h": "4 hours" + }, + "clear_cache": { + "label": "Clear Cache", + "description": "Remove cached data and temporary files", + "button": "Clear Cache", + "confirm": "Are you sure you want to clear the cache?", + "success": "Cache cleared successfully" + } + }, + "account": { + "title": "Account", + "description": "View your account information", + "name_label": "Display Name", + "username_label": "Username", + "account_type_label": "Account Type", + "auth_method_label": "Authentication", + "auth_method_oauth": "Single Sign-On (OAuth/OIDC)", + "auth_method_basic": "Password", + "demo_account": "Demo Account", + "email": { + "label": "Email Address", + "value": "{email}" + }, + "server": { + "label": "JMAP Server", + "value": "{server}" + }, + "storage": { + "label": "Storage Usage", + "used": "{used} of {total} used", + "percentage": "{percent}% used" + }, + "last_sync": { + "label": "Last Sync", + "value": "{time}" + } + }, + "security": { + "title": "Account Security", + "description": "Manage your password, two-factor authentication, and security settings", + "detecting": "Detecting server capabilities...", + "not_available": "Account security management is not available for this mail server.", + "password": { + "title": "Change Password", + "current": "Current Password", + "new": "New Password", + "confirm": "Confirm New Password", + "submit": "Change Password", + "success": "Password changed successfully", + "error_title": "Password change failed", + "error_mismatch": "New passwords do not match", + "error_min_length": "Password must be at least 8 characters", + "error_generic": "Failed to change password" + }, + "display_name": { + "label": "Display Name", + "description": "Your name as it appears on the server", + "save": "Save", + "success": "Display name updated", + "error": "Failed to update display name" + }, + "totp": { + "section_title": "Two-Factor Authentication", + "label": "TOTP Authentication", + "description": "Add an extra layer of security with a time-based one-time password", + "active": "Enabled", + "inactive": "Disabled", + "enabled": "Two-factor authentication enabled", + "disabled": "Two-factor authentication disabled", + "enable_error": "Failed to enable 2FA", + "disable_error": "Failed to disable 2FA", + "setup_instructions": "Copy this URL into your authenticator app (Google Authenticator, Authy, etc.):" + }, + "app_passwords": { + "title": "App Passwords", + "description": "Create passwords for apps that don't support two-factor authentication", + "add": "Add", + "create": "Create", + "cancel": "Cancel", + "generate": "Generate", + "name_label": "App Name", + "name_placeholder": "e.g. Thunderbird, iPhone Mail", + "password_label": "Password (leave empty to auto-generate)", + "password_placeholder": "Auto-generated if empty", + "added": "App password created", + "removed": "App password removed", + "add_error": "Failed to create app password", + "remove_error": "Failed to remove app password", + "none": "No app passwords configured" + }, + "encryption": { + "section_title": "Encryption at Rest", + "label": "Email Encryption", + "description": "Encrypt stored emails on the server for additional privacy", + "active": "{type} encryption enabled", + "inactive": "Disabled", + "enabled": "Encryption at rest enabled", + "disabled_success": "Encryption at rest disabled", + "error": "Failed to update encryption settings" + } + }, + "identities": { + "title": "Sending Identities", + "description": "Manage email addresses you can send from", + "identities_count": { + "label": "Your Identities", + "description": "Email addresses configured for sending", + "count_zero": "No identities", + "count_one": "1 identity", + "count_other": "{count} identities" + }, + "manage": "Manage Identities", + "sub_addressing": { + "label": "Sub-Addressing", + "description": "Use tags like user+tag@domain.com to organize incoming mail", + "learn_more": "Learn More" + } + }, + "vacation": { + "title": "Vacation Responder", + "description": "Automatically reply to incoming emails while you're away", + "loading": "Loading vacation settings...", + "not_supported": "Your mail server does not support vacation responses.", + "fetch_error": "Failed to load vacation settings. Please try again.", + "status": { + "label": "Vacation Responder", + "description": "Send an automatic reply to people who email you", + "active": "Active", + "inactive": "Inactive" + }, + "date_range": { + "title": "Date Range", + "description": "Optionally limit the auto-reply to a specific period", + "start": "Start Date", + "start_description": "Leave empty for no start limit", + "end": "End Date", + "end_description": "Leave empty for no end limit" + }, + "message": { + "title": "Auto-Reply Message", + "description": "The message that will be sent as a reply", + "subject_label": "Subject", + "subject_description": "Subject line of the auto-reply", + "subject_placeholder": "Out of Office", + "body_label": "Message Body", + "body_description": "Plain text message content", + "body_placeholder": "Thank you for your email. I am currently out of the office and will respond when I return." + }, + "preview": { + "title": "Preview", + "show": "Show preview", + "hide": "Hide preview" + }, + "save": "Save Changes", + "saving": "Saving...", + "warnings": { + "end_before_start": "End date must be after start date", + "start_in_past": "Start date is in the past", + "empty_body": "Message body is empty — recipients will receive a blank reply" + } + }, + "folders": { + "title": "Folders", + "description": "Manage your email folders and assign standard roles", + "folder_list": "Your Folders", + "folder_list_description": "Click a folder icon to customize it", + "standard_roles": "Standard Folder Roles", + "standard_roles_description": "Assign which folders are used for standard mailbox roles like Inbox, Sent, Trash, etc.", + "role_inbox": "Inbox", + "role_drafts": "Drafts", + "role_sent": "Sent", + "role_trash": "Trash", + "role_junk": "Spam / Junk", + "role_archive": "Archive", + "role_none": "None", + "create_folder": "Create Folder", + "create_subfolder": "Create Subfolder", + "subfolder_of": "Inside {name}", + "subfolder_name": "Subfolder name", + "new_folder_name": "Folder name", + "rename": "Rename", + "change_icon": "Change icon", + "delete": "Delete", + "confirm_delete": "Are you sure you want to delete \"{name}\"? Emails in this folder will be moved to Trash.", + "create": "Create", + "cancel": "Cancel", + "no_folders": "No custom folders", + "cannot_delete_role": "Cannot delete a folder with a standard role. Remove the role first.", + "folder_created": "Folder created", + "folder_renamed": "Folder renamed", + "folder_deleted": "Folder deleted", + "role_updated": "Folder role updated", + "error_create": "Failed to create folder", + "error_rename": "Failed to rename folder", + "error_delete": "Failed to delete folder", + "error_role": "Failed to update folder role" + }, + "advanced": { + "title": "Advanced", + "description": "Advanced options and developer settings", + "debug_mode": { + "label": "Debug Mode", + "description": "Enable detailed logging for troubleshooting" + }, + "settings_sync": { + "label": "Settings Sync", + "description": "Sync your settings across browsers and devices" + }, + "sender_favicons": { + "label": "Sender Favicons (Experimental)", + "description": "Show website icons as profile pictures for business senders" + }, + "keyboard_shortcuts": { + "label": "Keyboard Shortcuts", + "description": "View available keyboard shortcuts", + "button": "View Shortcuts" + }, + "reset_settings": { + "label": "Reset Settings", + "description": "Restore all settings to default values", + "button": "Reset to Defaults" + }, + "export_settings": { + "label": "Export Settings", + "description": "Download your settings as JSON", + "button": "Export" + }, + "import_settings": { + "label": "Import Settings", + "description": "Upload settings from JSON file", + "button": "Import" + } + }, + "sidebar_apps": { + "title": "Sidebar Apps", + "description": "Manage custom apps and links in your sidebar", + "keep_loaded": "Keep Apps Loaded", + "keep_loaded_description": "Keep inline apps running in the background when switching between them to avoid reloading", + "manage_title": "Custom Apps", + "manage_description": "Add, edit, or remove custom apps from your sidebar" + }, + "contacts": { + "title": "Contacts", + "description": "Import and export your contacts", + "import_label": "Import Contacts", + "import_description": "Import contacts from a vCard (.vcf) file", + "export_label": "Export Contacts", + "export_description": "Export all contacts as a vCard (.vcf) file" + }, + "filters": { + "title": "Email Filters", + "description": "Create rules to automatically sort, label, and manage incoming emails", + "add_rule": "Add Rule", + "no_rules": "No filter rules", + "no_rules_description": "Create rules to automatically organize your incoming emails", + "edit_rule": "Edit Rule", + "new_rule": "New Rule", + "delete_rule": "Delete Rule", + "delete_confirm": "Are you sure you want to delete this rule?", + "enable": "Enable", + "disable": "Disable", + "raw_editor": "Raw Sieve Editor", + "raw_editor_warning": "Editing the raw Sieve script may break visual rule editing. Changes made here override the visual builder.", + "validate": "Validate", + "validation_success": "Script is valid", + "validation_error": "Script has errors", + "save": "Save Rules", + "saving": "Saving...", + "saved": "Filters saved successfully", + "save_failed": "Failed to save filters", + "loading": "Loading filters...", + "not_supported": "Your mail server does not support email filters.", + "rule_name": "Rule Name", + "rule_name_placeholder": "e.g., Sort newsletters", + "match_all": "Match ALL conditions", + "match_any": "Match ANY condition", + "conditions": "Conditions", + "add_condition": "Add Condition", + "actions": "Actions", + "add_action": "Add Action", + "stop_processing": "Stop processing subsequent rules", + "condition_fields": { + "from": "From", + "to": "To", + "cc": "Cc", + "subject": "Subject", + "header": "Custom Header", + "size": "Size", + "body": "Body" + }, + "comparators": { + "contains": "contains", + "not_contains": "does not contain", + "is": "is exactly", + "not_is": "is not", + "starts_with": "starts with", + "ends_with": "ends with", + "matches": "matches pattern", + "greater_than": "is greater than", + "less_than": "is less than" + }, + "action_types": { + "move": "Move to folder", + "copy": "Copy to folder", + "forward": "Forward to", + "mark_read": "Mark as read", + "star": "Star message", + "add_label": "Add label", + "discard": "Discard (delete silently)", + "reject": "Reject with message", + "keep": "Keep in inbox", + "stop": "Stop processing" + }, + "move_to_folder": "Select folder", + "copy_to_folder": "Select folder", + "forward_to": "Forward to email address", + "forward_placeholder": "email@example.com", + "reject_message": "Rejection message", + "reject_placeholder": "Your email has been rejected", + "label_name": "Label name", + "label_placeholder": "e.g., important", + "header_name": "Header name", + "header_placeholder": "e.g., X-Mailing-List", + "size_bytes": "Size in bytes", + "size_placeholder": "e.g., 1000000", + "system_managed": "System-managed rule", + "opaque_warning": "This script was edited outside the visual builder. Only raw Sieve editing is available.", + "open_sieve_editor": "Open raw Sieve editor", + "fetch_error": "Failed to load filters", + "expanded_view": "Expanded view", + "expanded_view_description": "Show filter rules with detailed condition and action blocks", + "if": "If", + "then": "Then", + "match_all_conditions": "all match", + "match_any_condition": "any matches", + "and": "and", + "or": "or", + "cancel": "Cancel", + "confirm_delete": "Delete", + "rule_list": "Filter rules", + "drag_to_reorder": "Drag to reorder", + "match_type": "Match type", + "reset_to_visual": "Reset to visual builder", + "reset_warning": "This will discard the current script and start fresh.", + "confirm_reset": "Reset", + "validation_empty_name": "Rule name is required", + "validation_empty_conditions": "At least one condition with a value is required", + "validation_empty_actions": "At least one action is required", + "templates_section": "Start from template", + "template_newsletters": "Move newsletters to folder", + "template_receipts": "Auto-archive receipts", + "template_important": "Flag important emails", + "template_notifications": "Filter notifications", + "sieve_editor": { + "title": "Sieve Script Editor", + "warning": "Editing the raw Sieve script may break visual rule editing. Changes made here override the visual builder.", + "script_content": "Sieve script", + "valid": "Script is valid", + "invalid": "Script has errors", + "save_warning": "Saving will overwrite any visual rules. This cannot be undone. Click Save again to confirm.", + "validating": "Validating...", + "validate": "Validate", + "cancel": "Cancel", + "save": "Save", + "confirm_save": "Confirm Save", + "validation_failed": "Validation request failed" + }, + "rule_summary": { + "conditions_count": "{count, plural, one {# condition} other {# conditions}}", + "actions_count": "{count, plural, one {# action} other {# actions}}" + } + }, + "templates": { + "title": "Email Templates", + "description": "Create reusable email templates with placeholder variables", + "add": "New Template", + "edit": "Edit Template", + "name": "Template Name", + "name_placeholder": "e.g., Follow-up email", + "category": "Category", + "category_placeholder": "e.g., Work, Personal", + "subject": "Subject", + "subject_placeholder": "Email subject line", + "body": "Body", + "body_placeholder": "Email body content...", + "recipients_placeholder": "email@example.com", + "identity": "Send As", + "default_identity": "Default identity", + "favorite": "Favorite", + "cancel": "Cancel", + "create": "Create", + "update": "Update", + "confirm_delete": "Delete", + "no_templates": "No templates yet", + "manage": "Manage Templates", + "count": "{count, plural, one {# template} other {# templates}}", + "export_import": "Export & Import", + "export_import_description": "Back up your templates or transfer them to another device", + "export": "Export", + "import": "Import", + "validation": { + "empty": "Template name is required", + "too_long": "Template name must be 200 characters or less" + } + }, + "files": { + "display": { + "title": "Display", + "description": "Configure how files and folders are displayed" + }, + "folder_layout": { + "label": "Folder Navigation", + "description": "Choose how folders are displayed: inline with files or in a sidebar tree", + "inline": "Inline", + "sidebar": "Sidebar" + }, + "default_view": { + "label": "Default View", + "description": "Choose between grid and list layout", + "list": "List", + "grid": "Grid" + }, + "default_sort": { + "label": "Default Sort", + "description": "Choose the default sorting for files", + "name": "Name", + "size": "Size", + "modified": "Modified" + }, + "sort_direction": { + "label": "Sort Direction", + "description": "Choose ascending or descending order", + "ascending": "Ascending", + "descending": "Descending" + }, + "icons": { + "title": "Icons", + "description": "Configure file icon appearance" + }, + "show_icons": { + "label": "Show File Icons", + "description": "Display icons next to files and folders" + }, + "colored_icons": { + "label": "Colored Icons", + "description": "Use colorful icons instead of monochrome" + }, + "show_thumbnails": { + "label": "Show Thumbnails", + "description": "Display image previews instead of icons for image files" + }, + "behavior": { + "title": "Behavior", + "description": "Configure file browser behavior" + }, + "show_hidden": { + "label": "Show Hidden Files", + "description": "Display files and folders that start with a dot" + }, + "preview": { + "label": "Preview" + } + } + }, + "errors": { + "page_error_title": "Something went wrong", + "page_error_description": "We encountered an unexpected error. Please try again or return to the home page.", + "sidebar_error": "Unable to load mailboxes", + "email_list_error": "Unable to load emails", + "viewer_error_title": "Unable to display email", + "viewer_error_description": "There was a problem rendering this email. It may contain unsupported content.", + "composer_error": "Unable to load composer", + "settings_error_title": "Settings unavailable", + "settings_error_description": "Unable to load settings. Your preferences may not be saved.", + "try_again": "Try again", + "reload": "Reload", + "reload_emails": "Reload emails", + "reload_settings": "Reload settings", + "retry": "Retry", + "go_home": "Go to inbox" + }, + "context_menu": { + "reply": "Reply", + "reply_all": "Reply All", + "forward": "Forward", + "mark_read": "Mark as Read", + "mark_unread": "Mark as Unread", + "star": "Star", + "unstar": "Unstar", + "move_to": "Move to...", + "archive": "Archive", + "delete": "Delete", + "mark_as_spam": "Report spam", + "not_spam": "Not spam", + "color_tag": "Label", + "remove_color": "Remove Label", + "items_selected": "{count} emails selected", + "edit_draft": "Edit Draft" + }, + "shortcuts": { + "title": "Keyboard Shortcuts", + "tip": "Press ? anytime to show this help", + "sections": { + "navigation": "Navigation", + "actions": "Email Actions", + "global": "Global", + "threads": "Threads", + "composer": "Composer" + }, + "navigation": { + "next_email": "Next email", + "previous_email": "Previous email", + "open_email": "Open email", + "close_email": "Close / Deselect" + }, + "actions": { + "reply": "Reply", + "reply_all": "Reply all", + "forward": "Forward", + "star": "Toggle star", + "archive": "Archive", + "delete": "Delete", + "mark_unread": "Mark as unread", + "mark_read": "Mark as read", + "toggle_spam": "Report spam / Not spam" + }, + "global": { + "compose": "Compose new email", + "search": "Focus search", + "help": "Show shortcuts", + "refresh": "Refresh emails", + "select_all": "Select all" + }, + "threads": { + "expand_collapse": "Expand/collapse thread" + }, + "composer": { + "template_picker": "Open template picker" + } + }, + "threads": { + "messages_one": "{count} message", + "messages_other": "{count} messages", + "messages_tooltip": "{count, plural, one {# message in this conversation} other {# messages in this conversation}}", + "expand": "Expand conversation", + "collapse": "Collapse conversation", + "loading": "Loading conversation...", + "mark_read": "Mark conversation as read", + "mark_unread": "Mark conversation as unread", + "archive": "Archive conversation", + "delete": "Delete conversation", + "star": "Star conversation", + "unstar": "Unstar conversation", + "toggle_thread": "Toggle thread" + }, + "identities": { + "modal_title": "Manage Sending Identities", + "create_new": "Create New Identity", + "edit_identity": "Edit Identity", + "delete_confirm": "Delete this identity? This cannot be undone.", + "cannot_delete": "This identity cannot be deleted", + "primary_identity": "Primary", + "set_as_primary": "Set as primary", + "no_identities": "No identities found", + "display": { + "reply_to": "Reply-To:", + "bcc": "BCC:", + "signature": "Signature:", + "preview": "Preview:" + }, + "validation_errors": { + "invalid_emails": "Invalid emails: {emails}", + "unknown_error": "Unknown error" + }, + "form": { + "name_label": "Display Name", + "name_placeholder": "e.g., Work Email, Personal", + "name_required": "Name is required", + "email_label": "Email Address", + "email_placeholder": "your.email@example.com", + "email_required": "Email is required", + "email_invalid": "Please enter a valid email address", + "email_immutable": "Email address cannot be changed after creation", + "reply_to_label": "Reply-To (optional)", + "reply_to_placeholder": "different@email.com", + "bcc_label": "Auto BCC (optional)", + "bcc_placeholder": "archive@email.com", + "text_signature_label": "Text Signature", + "html_signature_label": "HTML Signature", + "save": "Save Identity", + "cancel": "Cancel", + "creating": "Creating...", + "updating": "Updating..." + }, + "sub_address": { + "button_tooltip": "Use sub-address", + "popover_title": "Add Sub-Address Tag", + "tag_input_placeholder": "Enter tag (e.g., shopping)", + "preview_label": "Preview:", + "recent_tags": "Recent Tags", + "suggested_tags": "Suggested", + "use_address": "Use This Address", + "invalid_tag": "Tag must be alphanumeric and dashes only", + "tag_too_long": "Tag must be 30 characters or less", + "help_text": "Emails sent to user+tag@domain.com will arrive in your inbox", + "validation": { + "empty": "Tag cannot be empty", + "too_long": "Tag must be {max} characters or less", + "invalid_chars": "Tag must contain only letters, numbers, and dashes" + } + }, + "badge": { + "sent_via": "via", + "sub_address_tag": "Sent using sub-address: {tag}", + "identity_name": "Sent using identity: {name}", + "identity_short": "via {name}", + "subaddress_tag": "+{tag}" + }, + "delete_button": "Delete", + "delete_confirm_title": "Delete Identity" + }, + "templates": { + "picker_title": "Choose a Template", + "search_placeholder": "Search templates...", + "section_favorites": "Favorites", + "section_recent": "Recent", + "section_uncategorized": "Other", + "no_templates": "No templates yet", + "no_results": "No templates found", + "fill_placeholders": "Fill Placeholder Values", + "enter_value": "Enter a value...", + "preview": "Preview", + "insert_with_values": "Insert with Values", + "insert_raw": "Insert Raw", + "copy_suffix": "(copy)", + "placeholder": "Variable", + "placeholders": { + "recipient_name": "Recipient name", + "company": "Company name", + "date": "Current date", + "day_of_week": "Day of the week", + "sender_name": "Your name" + } + }, + "contacts": { + "title": "Contacts", + "search_placeholder": "Search contacts...", + "create_new": "New Contact", + "no_category": "No Category", + "category_added": "Contact added to {name}", + "category_added_plural": "{count} contacts added to {name}", + "empty_state": "No contacts yet", + "empty_state_title": "No contacts yet", + "empty_state_subtitle": "Create your first contact or import from a vCard file", + "empty_search": "No contacts match your search", + "empty_search_hint": "Try a different search term", + "clear_search": "Clear search", + "import_vcard": "Import vCard", + "delete_confirm_title": "Delete contact", + "delete_confirm": "Are you sure you want to delete this contact?", + "local_mode": "Contacts are stored locally (server does not support JMAP Contacts)", + "back_to_mail": "Back to mail", + "tabs": { + "all": "All", + "groups": "Groups" + }, + "shared": { + "title": "Shared" + }, + "address_books": { + "title": "My Address Books", + "shared_prefix": "Shared: {name}", + "moved": "Contact moved to {name}", + "moved_plural": "{count} contacts moved to {name}", + "move_failed": "Failed to move contact", + "address_book": "Address Book" + }, + "detail": { + "emails": "Email Addresses", + "phones": "Phone Numbers", + "organizations": "Organizations", + "addresses": "Addresses", + "notes": "Notes", + "titles": "Titles & Roles", + "online_services": "Online Services", + "anniversaries": "Anniversaries", + "personal_info": "Personal Info", + "languages": "Languages", + "categories": "Categories", + "related_contacts": "Related Contacts", + "crypto_keys": "Crypto Keys", + "cert_issuer": "Issuer", + "cert_expires": "Expires", + "cert_expired": "Expired", + "cert_fingerprint": "Fingerprint", + "cert_algorithm": "Algorithm", + "import_to_smime": "Import to S/MIME", + "cert_already_imported": "Already imported to S/MIME", + "cert_imported": "Certificate imported to S/MIME store", + "cert_import_failed": "Failed to import certificate", + "no_contact_selected": "Select a contact to view details", + "compose_email": "Compose email", + "copy_email": "Copy email", + "copy_phone": "Copy phone number", + "copy_url": "Copy URL", + "copied": "Copied to clipboard", + "copy_failed": "Failed to copy to clipboard", + "created": "Created", + "updated": "Last updated", + "timezone": "Timezone", + "anniversary_birth": "Birthday", + "anniversary_death": "Passed away", + "anniversary_wedding": "Anniversary", + "anniversary_other": "Other", + "personal_expertise": "Expertise", + "personal_hobby": "Hobby", + "personal_interest": "Interest", + "personal_other": "Other", + "gender": "Gender", + "gender_masculine": "Male", + "gender_feminine": "Female", + "gender_other": "Other", + "gender_none": "Not applicable", + "gender_unknown": "Unknown", + "calendar": "Calendar", + "calendar_uri": "Calendar URL", + "scheduling_uri": "Scheduling URL", + "freebusy_uri": "Free/Busy URL" + }, + "form": { + "create_title": "New Contact", + "edit_title": "Edit Contact", + "section_address_book": "Directory", + "select_address_book": "Select a directory...", + "section_identity": "Name & Identity", + "section_work": "Work & Organization", + "prefix": "Prefix", + "prefix_placeholder": "Dr., Mr., Mrs.", + "given_name": "First name", + "middle_name": "Middle name", + "surname": "Last name", + "suffix": "Suffix", + "suffix_placeholder": "Jr., Sr., III", + "nickname": "Nickname", + "nickname_placeholder": "Nickname", + "email": "Email", + "email_placeholder": "email@example.com", + "phone": "Phone", + "phone_placeholder": "+1 234 567 890", + "phone_type": "Type", + "phone_voice": "Voice", + "phone_cell": "Mobile", + "phone_fax": "Fax", + "phone_pager": "Pager", + "phone_video": "Video", + "phone_text": "Text", + "organization": "Organization", + "organization_placeholder": "Company name", + "department": "Department", + "department_placeholder": "Department", + "job_title": "Job title", + "job_title_placeholder": "e.g., Software Engineer", + "role": "Role", + "role_placeholder": "e.g., Team Lead", + "addresses": "Addresses", + "add_address": "Add address", + "street": "Street", + "city": "City", + "region": "State / Region", + "postcode": "Postal code", + "country": "Country", + "online_services": "Online Services", + "add_online_service": "Add online service", + "url_placeholder": "https://...", + "service_placeholder": "Service", + "anniversaries": "Anniversaries", + "add_anniversary": "Add date", + "anniversary_birth": "Birthday", + "anniversary_wedding": "Anniversary", + "anniversary_death": "Memorial", + "anniversary_other": "Other", + "personal_info": "Personal Info", + "add_personal_info": "Add entry", + "personal_info_placeholder": "e.g., Photography", + "personal_expertise": "Expertise", + "personal_hobby": "Hobby", + "personal_interest": "Interest", + "personal_other": "Other", + "level": "Level", + "level_high": "High", + "level_medium": "Medium", + "level_low": "Low", + "categories": "Categories", + "categories_placeholder": "e.g., Family, Friends, Colleagues", + "categories_hint": "Type to search or add categories", + "category_add": "Add", + "note": "Notes", + "note_placeholder": "Add a note...", + "gender": "Gender", + "gender_sex": "Sex", + "gender_male": "Male", + "gender_female": "Female", + "gender_other": "Other", + "gender_none": "Not applicable", + "gender_unknown": "Unknown", + "gender_identity": "Gender identity", + "gender_identity_placeholder": "Gender identity...", + "calendar": "Calendar", + "calendar_uri": "Calendar URL", + "scheduling_uri": "Scheduling URL", + "freebusy_uri": "Free/Busy URL", + "context_work": "Work", + "context_private": "Private", + "add_email": "Add email", + "add_phone": "Add phone", + "save": "Save", + "cancel": "Cancel", + "creating": "Creating...", + "updating": "Updating...", + "name_required": "At least a first name or last name is required", + "email_invalid": "Please enter a valid email address", + "email_error_inline": "Invalid email format", + "save_failed": "Failed to save contact", + "delete": "Delete" + }, + "groups": { + "create": "New Group", + "edit": "Edit Group", + "empty": "No groups yet", + "delete_confirm_title": "Delete group", + "delete_confirm": "Are you sure you want to delete this group?", + "name_label": "Group Name", + "name_placeholder": "e.g., Team, Family", + "name_required": "Group name is required", + "save_failed": "Failed to save group", + "members_label": "Members", + "search_members": "Search contacts to add...", + "no_members": "No members in this group", + "member_count": "{count, plural, =0 {No members} one {1 member} other {# members}}" + }, + "import": { + "title": "Import Contacts", + "drop_hint": "Click to select a vCard file", + "file_types": ".vcf or .vcard files", + "no_contacts": "No contacts found in file", + "parse_error": "Failed to parse vCard file", + "found": "{count, plural, one {1 contact found} other {# contacts found}}", + "duplicate": "Duplicate", + "select_all": "Select all", + "deselect_all": "Deselect all", + "selected": "{count, plural, one {1 selected} other {# selected}}", + "import_button": "Import", + "importing": "Importing...", + "success": "{count, plural, one {1 contact imported} other {# contacts imported}}", + "failed": "Import failed", + "close": "Close", + "file_too_large": "File is too large (max 5 MB)" + }, + "export": { + "title": "Export Contacts", + "success": "{count, plural, one {1 contact exported} other {# contacts exported}}" + }, + "bulk": { + "selected": "{count, plural, one {1 selected} other {# selected}}", + "select_all": "Select all", + "delete": "Delete", + "delete_confirm_title": "Delete contacts", + "delete_confirm": "Delete {count, plural, one {1 contact} other {# contacts}}?", + "deleted": "{count, plural, one {1 contact deleted} other {# contacts deleted}}", + "add_to_group": "Add to group", + "choose_group": "Choose a group", + "adding_contacts": "Adding {count, plural, one {1 contact} other {# contacts}}", + "added_to_group": "Contacts added to group", + "export": "Export", + "clear": "Clear selection" + }, + "toast": { + "created": "Contact created", + "updated": "Contact updated", + "deleted": "Contact deleted", + "error_create": "Failed to create contact", + "error_update": "Failed to update contact", + "error_delete": "Failed to delete contact" + } + }, + "calendar": { + "title": "Calendar", + "back_to_email": "Back to email", + "my_calendars": "Calendars", + "mini_calendar_change": "Click to change month", + "views": { + "month": "Month", + "week": "Week", + "day": "Day", + "agenda": "Agenda", + "today": "Today", + "month_hint": "Month (m)", + "week_hint": "Week (w)", + "day_hint": "Day (d)", + "agenda_hint": "Agenda (a)", + "tasks": "Tasks", + "tasks_hint": "Tasks (k)" + }, + "events": { + "create": "Create event", + "edit": "Edit event", + "delete": "Delete event", + "details": "Event details", + "no_events": "No events", + "all_day": "All day", + "more": "+{count} more", + "no_title": "(No title)", + "resize": "Resize event", + "duplicate": "Duplicate", + "today_header": "Today", + "tomorrow_header": "Tomorrow" + }, + "detail": { + "add_note": "Add a note...", + "save_note": "Save", + "note_saved": "Note added", + "open_link": "Open link", + "meeting_link": "Meeting link", + "tentative": "Tentative", + "cancelled": "Cancelled", + "delete_confirm": "Delete this event?" + }, + "form": { + "title": "Title", + "description": "Description", + "location": "Location", + "start_date": "Start date", + "end_date": "End date", + "start_time": "Start time", + "end_time": "End time", + "all_day_event": "All-day event", + "calendar_select": "Calendar", + "save": "Save", + "cancel": "Cancel", + "delete_confirm": "Are you sure you want to delete this event?", + "color": "Color" + }, + "participants": { + "title": "Participants", + "add": "Add participant", + "organizer": "Organizer", + "attendee": "Attendee", + "accepted": "Accepted", + "declined": "Declined", + "tentative": "Tentative", + "needs_action": "Needs action", + "remove": "Remove", + "email_placeholder": "Add email address or search contacts", + "send_invitations": "Send invitations to participants", + "status_summary": "{accepted} accepted, {pending} pending", + "invited_by": "Invitation from {name}", + "respond_below": "Respond using the buttons below", + "rsvp_label": "Your response", + "cancel_notification": "Participants will be notified of the cancellation", + "you_organizer": "You are the organizer", + "you_attendee": "You are an attendee", + "no_participants": "No participants", + "count": "{count, plural, one {# participant} other {# participants}}" + }, + "recurrence": { + "title": "Recurrence", + "none": "Does not repeat", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "yearly": "Yearly", + "every_n_days": "Every {count} days", + "every_n_weeks": "Every {count} weeks", + "every_n_months": "Every {count} months", + "until": "Until", + "occurrences": "{count} occurrences" + }, + "recurrence_scope": { + "edit_title": "Edit recurring event", + "delete_title": "Delete recurring event", + "description": "This is a recurring event. Which events would you like to modify?", + "this_event": "This event only", + "this_and_future": "This and following events", + "all_events": "All events", + "cancel": "Cancel", + "save": "Save", + "delete": "Delete" + }, + "alerts": { + "title": "Reminder", + "none": "No reminder", + "at_time": "At time of event", + "minutes_before": "{count, plural, one {# minute before} other {# minutes before}}", + "hours_before": "{count, plural, one {# hour before} other {# hours before}}", + "days_before": "{count, plural, one {# day before} other {# days before}}" + }, + "settings": { + "title": "Calendar settings", + "default_view": "Default view", + "week_starts_on": "Week starts on", + "time_format": "Time format", + "default_calendar": "Default calendar", + "default_reminder": "Default reminder", + "time_format_12h": "12-hour", + "time_format_24h": "24-hour", + "notifications_enabled": "Event notifications", + "notifications_enabled_desc": "Show alerts for upcoming calendar events", + "notification_sound": "Notification sound", + "notification_sound_desc": "Play a sound for calendar alerts", + "invitation_parsing": "Parse email invitations", + "invitation_parsing_desc": "Detect calendar invitations in email attachments and show calendar actions", + "show_time_in_month_view": "Show time in month view", + "show_time_in_month_view_desc": "Display event times in the month calendar view", + "show_week_numbers": "Show week numbers", + "show_week_numbers_desc": "Display week numbers in the mini-calendar", + "enable_tasks": "Enable tasks", + "enable_tasks_desc": "Show a tasks view in the calendar for managing to-dos", + "show_tasks_on_calendar": "Show tasks on calendar", + "show_tasks_on_calendar_desc": "Display task chips on the day and week calendar views" + }, + "days": { + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "notifications": { + "event_created": "Event created", + "event_updated": "Event updated", + "event_deleted": "Event deleted", + "calendar_created": "Calendar created", + "calendar_deleted": "Calendar deleted", + "event_move_error": "Failed to move event", + "event_resize_error": "Failed to resize event", + "alert_title": "Upcoming event", + "alert_now": "Starting now", + "alert_in_minutes": "In {count} min", + "invitation_sent": "Invitations sent", + "rsvp_updated": "Response updated", + "rsvp_error": "Failed to update response", + "event_duplicated": "Event duplicated", + "event_error": "Failed to save event", + "task_due": "Task due" + }, + "status": { + "loading_calendars": "Loading calendars...", + "loading_events": "Loading events..." + }, + "quick_create": { + "placeholder": "New event title", + "aria_label": "Quick create event" + }, + "nav_prev": "Previous", + "nav_next": "Next", + "import": { + "title": "Import Calendar", + "tab_file": "File", + "tab_url": "URL", + "select_file": "Select .ics file", + "drop_file": "or drop file here", + "supported_formats": "Supports iCalendar (.ics) files", + "url_description": "Enter the URL of an external iCalendar (.ics) feed to import events.", + "url_placeholder": "https://example.com/calendar.ics", + "url_hint": "Supports CalDAV and iCalendar (.ics) URLs", + "fetch": "Fetch", + "invalid_url": "Please enter a valid URL", + "url_fetch_failed": "Failed to fetch calendar from URL", + "parsing": "Parsing calendar file...", + "parsed_events": "{count} events found", + "no_events": "No events found in file", + "select_all": "Select all", + "deselect_all": "Deselect all", + "target_calendar": "Import to calendar", + "import_button": "Import selected", + "importing": "Importing events...", + "success": "{count} events imported successfully", + "error": "Failed to import calendar", + "file_too_large": "File exceeds 5MB limit", + "invalid_format": "Invalid calendar file format" + }, + "management": { + "title": "Calendar Management", + "description": "Create, rename, and customize your calendars. Right-click a calendar in the sidebar to quickly change its color.", + "name": "Name", + "name_placeholder": "Calendar name", + "color": "Color", + "change_color": "Change color", + "add_calendar": "Add calendar", + "edit": "Edit", + "delete": "Delete", + "save": "Save", + "create": "Create", + "cancel": "Cancel", + "default": "Default", + "confirm_delete": "Delete \"{name}\"? All events in this calendar will be removed.", + "confirm_clear": "Clear all events from \"{name}\"? This cannot be undone.", + "clear_events": "Clear events", + "events_cleared": "{count} events cleared", + "error_clear": "Failed to clear calendar events", + "calendar_created": "Calendar created", + "calendar_updated": "Calendar updated", + "calendar_deleted": "Calendar deleted", + "color_updated": "Calendar color updated", + "error_create": "Failed to create calendar", + "error_update": "Failed to update calendar", + "error_delete": "Failed to delete calendar", + "caldav_url": "CalDAV URL", + "copy_url": "Copy CalDAV URL", + "url_copied": "CalDAV URL copied to clipboard" + }, + "subscription": { + "title": "iCal Subscription", + "section_title": "iCal Subscriptions", + "description": "Subscribe to an external iCalendar feed. Events will be synced automatically into their own calendar. Supports https:// and webcal:// URLs.", + "url_label": "Calendar URL", + "url_placeholder": "https://example.com/calendar.ics or webcal://...", + "name_label": "Calendar name", + "name_placeholder": "e.g. Public Holidays", + "color_label": "Color", + "refresh_interval": "Refresh interval", + "interval_15": "Every 15 minutes", + "interval_30": "Every 30 minutes", + "interval_60": "Every hour", + "interval_360": "Every 6 hours", + "interval_1440": "Every day", + "subscribe": "Subscribe", + "subscribing": "Subscribing...", + "invalid_url": "Please enter a valid URL", + "success": "Subscribed to \"{name}\"", + "error": "Failed to add subscription", + "refresh": "Refresh now", + "refresh_success": "Subscription refreshed", + "refresh_error": "Failed to refresh subscription", + "unsubscribe": "Unsubscribe", + "confirm_delete": "Unsubscribe from \"{name}\"? The calendar and all its events will be removed.", + "deleted": "Subscription removed", + "delete_error": "Failed to remove subscription", + "last_refreshed": "Last updated: {time}" + }, + "tasks": { + "label": "Tasks", + "no_tasks": "No tasks", + "no_title": "(No title)", + "mark_complete": "Mark as complete", + "mark_incomplete": "Mark as incomplete", + "filter_all": "All", + "filter_pending": "Pending", + "filter_completed": "Completed", + "filter_overdue": "Overdue", + "show_completed": "Show completed", + "create": "New Task", + "edit": "Edit Task", + "title_placeholder": "Task title", + "description_placeholder": "Add a description...", + "due_date": "Due date", + "include_time": "Include time", + "priority": "Priority", + "priority_none": "None", + "priority_high": "High", + "priority_medium": "Medium", + "priority_low": "Low", + "progress": "Status", + "progress_needs_action": "Needs action", + "progress_in_process": "In process", + "progress_completed": "Completed", + "progress_cancelled": "Cancelled", + "calendar": "Calendar", + "alert": "Reminder", + "alert_none": "None", + "alert_at_time": "At time of due date", + "alert_5min": "5 minutes before", + "alert_15min": "15 minutes before", + "alert_30min": "30 minutes before", + "alert_1hr": "1 hour before", + "alert_1day": "1 day before", + "delete": "Delete", + "cancel": "Cancel", + "save": "Save", + "quick_add_placeholder": "Add a task...", + "due_today": "Today", + "due_tomorrow": "Tomorrow", + "overdue": "Overdue" + } + }, + "advanced_search": { + "title": "Advanced Search", + "from": "From", + "from_placeholder": "Sender email or name", + "to": "To", + "to_placeholder": "Recipient email or name", + "subject": "Subject", + "subject_placeholder": "Subject contains...", + "body": "Body", + "body_placeholder": "Body contains...", + "folder": "Folder", + "all_folders": "All folders", + "has_attachment": "Attachments", + "date_after": "After", + "date_before": "Before", + "starred": "Starred", + "unread": "Unread", + "read": "Read", + "yes": "Yes", + "no": "No", + "clear": "Clear", + "clear_all": "Clear all", + "filters_active": "{count} filter", + "filters_active_plural": "{count} filters", + "toggle_filters": "More", + "search_hint": "Use advanced filters for precise search", + "advanced_filters_tooltip": "Advanced search filters", + "results_found": "{count, plural, =0 {No results found} one {# result found} other {# results found}}", + "results_found_more": "{count}+ results found" + }, + "welcome": { + "title": "Welcome to your mailbox", + "tip_compose": "Press c to compose a new email", + "tip_shortcuts": "Press ? to see all keyboard shortcuts", + "tip_sidebar": "Find Calendar, Contacts and Settings in the sidebar menu", + "tip_settings": "Customize your experience in Settings", + "got_it": "Got it", + "settings": "Settings", + "dismiss": "Dismiss", + "start_tour": "Start Tour" + }, + "demo_welcome": { + "title": "Welcome to Bulwark Mail", + "description": "Explore a fully-featured webmail client — right in your browser. All data stays on your device, so feel free to test everything.", + "feature_email": "Read & compose email", + "feature_organize": "Tags, stars & folders", + "feature_shortcuts": "Keyboard shortcuts", + "feature_privacy": "100% private demo", + "hint": "Click any email on the left to get started, or take the tour below." + }, + "files": { + "title": "Files", + "search_placeholder": "Search files...", + "empty_state_title": "No files yet", + "empty_state_description": "Upload files or create folders to get started", + "upload": "Upload", + "upload_files": "Upload Files", + "new_folder": "New Folder", + "new_folder_name": "Folder name", + "rename": "Rename", + "rename_title": "Rename", + "new_name": "New name", + "delete": "Delete", + "delete_confirm_title": "Delete resource", + "delete_confirm_message": "Are you sure you want to delete \"{name}\"? This cannot be undone.", + "download": "Download", + "name": "Name", + "size": "Size", + "modified": "Modified", + "type": "Type", + "folder": "Folder", + "file": "File", + "parent_directory": "Parent directory", + "breadcrumb_root": "Home", + "drop_files_here": "Drop files or folders here to upload", + "uploading": "Uploading...", + "upload_success": "{count, plural, one {1 file uploaded} other {# files uploaded}}", + "upload_error": "Failed to upload file", + "create_folder_success": "Folder created", + "create_folder_error": "Failed to create folder", + "delete_success": "Deleted successfully", + "delete_error": "Failed to delete", + "rename_success": "Renamed successfully", + "rename_error": "Failed to rename", + "download_error": "Failed to download", + "not_available": "File storage is not available on this server", + "cancel": "Cancel", + "create": "Create", + "save": "Save", + "no_results": "No files match your search", + "batch_delete_confirm_message": "Are you sure you want to delete {count, plural, one {1 item} other {# items}}? This cannot be undone.", + "batch_delete_success": "{count, plural, one {1 item deleted} other {# items deleted}}", + "grid_view": "Grid view", + "list_view": "List view", + "details": "Details", + "path": "Path", + "preview": "Preview", + "preview_error": "Failed to load preview", + "cut": "Cut", + "copy": "Copy", + "paste": "Paste", + "move_success": "{count, plural, one {1 item moved} other {# items moved}}", + "move_error": "Failed to move", + "paste_success": "Pasted successfully", + "paste_error": "Failed to paste", + "new_text_file": "New Text File", + "file_name": "File name", + "retry": "Retry", + "refresh": "Refresh", + "toggle_favorite": "Toggle favorite", + "duplicate": "Duplicate", + "duplicate_success": "Duplicated successfully", + "duplicate_error": "Failed to duplicate", + "create_file_success": "File created", + "create_file_error": "Failed to create file", + "favorites": "Favorites", + "recent": "Recent", + "properties": "Properties", + "open_folder": "Open folder", + "upload_folder": "Upload Folder", + "file_too_large": "\"{name}\" exceeds the maximum file size ({max})", + "undo": "Undo", + "undo_success": "Action undone", + "undo_error": "Failed to undo", + "toolbar": "File actions", + "file_list": "Files and folders", + "context_menu": "Actions", + "settings_title": "File Settings", + "settings_display": "Display", + "settings_default_view": "Default View", + "settings_default_view_desc": "Choose between grid and list layout", + "settings_default_sort": "Default Sort", + "settings_default_sort_desc": "Choose the default sorting for files", + "settings_sort_direction": "Sort Direction", + "settings_sort_direction_desc": "Choose ascending or descending order", + "settings_ascending": "Ascending", + "settings_descending": "Descending", + "settings_icons": "Icons", + "settings_show_icons": "Show File Icons", + "settings_show_icons_desc": "Display icons next to files and folders", + "settings_colored_icons": "Colored Icons", + "settings_colored_icons_desc": "Use colorful icons instead of monochrome", + "settings_show_thumbnails": "Show Thumbnails", + "settings_show_thumbnails_desc": "Display image previews instead of icons for image files", + "settings_behavior": "Behavior", + "settings_show_hidden": "Show Hidden Files", + "settings_show_hidden_desc": "Display files and folders that start with a dot", + "settings_folder_layout": "Folder Navigation", + "settings_folder_layout_desc": "Choose how folders are displayed: inline with files or in a sidebar tree", + "settings_folder_layout_inline": "Inline", + "settings_folder_layout_sidebar": "Sidebar" + }, + "smime": { + "your_certificates": "Your Certificates", + "your_certificates_desc": "Import and manage your S/MIME certificates for signing and encrypting emails", + "recipient_certificates": "Recipient Certificates", + "recipient_certificates_desc": "Public certificates for encrypting emails to recipients", + "identity_bindings": "Identity Key Bindings", + "identity_bindings_desc": "Bind S/MIME certificates to your email identities", + "defaults_title": "Defaults", + "defaults_desc": "Configure default signing and encryption behavior", + "import_pkcs12": "Import PKCS#12 (.p12/.pfx)", + "import_public_cert": "Import Certificate", + "no_certificates": "No certificates imported yet", + "no_recipient_certs": "No recipient certificates", + "expires": "Expires", + "expired": "Expired", + "bound_to": "Bound to", + "no_key_bound": "None", + "lock": "Lock key", + "unlock": "Unlock key", + "details": "View details", + "delete": "Delete", + "encrypt_by_default": "Encrypt by default", + "encrypt_by_default_desc": "Automatically encrypt emails when all recipients have certificates", + "remember_unlocked": "Remember unlocked keys", + "remember_unlocked_desc": "Keep keys unlocked for the duration of this browser session", + "sign_default_for": "Sign by default for", + "enter_p12_passphrase": "Enter PKCS#12 Passphrase", + "p12_passphrase_desc": "Enter the passphrase that protects this certificate file", + "enter_storage_passphrase": "Set Storage Passphrase", + "storage_passphrase_desc": "Choose a passphrase to protect this key at rest in your browser", + "next": "Next", + "import": "Import", + "unlock_key": "Unlock Key", + "unlock_key_desc": "Enter the storage passphrase to unlock this key for signing or decryption", + "passphrase_placeholder": "Enter passphrase", + "confirm_passphrase_placeholder": "Confirm passphrase", + "passphrase_mismatch": "Passphrases do not match", + "cancel": "Cancel", + "processing": "Processing…", + "close": "Close", + "certificate_details": "Certificate Details", + "cert_subject": "Subject", + "cert_issuer": "Issuer", + "cert_email": "Email", + "cert_serial": "Serial Number", + "cert_validity": "Validity", + "cert_fingerprint": "Fingerprint (SHA-256)", + "cert_algorithm": "Algorithm", + "cert_capabilities": "Capabilities", + "cert_source": "Source", + "cert_expired": "This certificate has expired", + "cert_not_yet_valid": "This certificate is not yet valid", + "cap_sign": "Signing", + "cap_encrypt": "Encryption", + "cap_none": "None", + "show_passphrase": "Show passphrase", + "hide_passphrase": "Hide passphrase", + "sign_toggle": "Sign", + "encrypt_toggle": "Encrypt", + "missing_recipient_certs": "Missing certificates for: {emails}", + "missing_sender_cert": "No certificate bound to this identity", + "status_encrypted_ok": "This message was encrypted", + "status_encrypted_no_key": "This message is encrypted but no matching key was found", + "status_encrypted_failed": "Failed to decrypt this message", + "status_signed_valid": "Signature verified", + "status_signed_invalid": "Signature verification failed", + "status_signed_expired_cert": "Signed with an expired certificate", + "status_signed_mismatch": "Signature valid, but signer does not match sender", + "status_unsupported": "Unsupported S/MIME format", + "auto_import_signer_certs": "Auto-import signer certificates", + "auto_import_signer_certs_desc": "Automatically save certificates from verified signed emails for future encryption", + "export": "Export", + "enter_export_passphrase": "Set Export Passphrase", + "export_passphrase_desc": "Choose a passphrase to protect the exported PKCS#12 file", + "export_storage_desc": "Enter the storage passphrase to decrypt the key for export", + "incorrect_passphrase": "Incorrect passphrase" + }, + "tour": { + "step_counter": "Step {current} of {total}", + "skip": "Skip tour", + "back": "Back", + "next": "Next", + "finish": "Finish", + "take_a_tour": "Take a tour of the interface", + "restart_title": "Introductory tour", + "restart_desc": "Replay the guided walkthrough of the interface", + "restart_button": "Restart tour", + "sidebar_title": "Your mailboxes", + "sidebar_desc": "This is your folder sidebar. Click any mailbox to view its emails. You can create folders, drag emails between them, and see unread counts at a glance.", + "compose_title": "Compose an email", + "compose_desc": "Click here to write a new email. You can add recipients, attachments, and use rich text formatting.", + "search_title": "Search your mail", + "search_desc": "Search by sender, subject, or content. Click the filter icon for advanced options like date range, attachments, and starred messages.", + "email_list_title": "Your email list", + "email_list_desc": "Emails appear here. Click one to read it on the right. Use the checkbox to select multiple, then bulk-move, delete, or tag them.", + "email_viewer_title": "Reading pane", + "email_viewer_desc": "The selected email opens here. Reply, forward, archive, or delete with the toolbar buttons. You can also star emails or add color tags.", + "keywords_title": "Color tags", + "keywords_desc": "Organize your email with color-coded tags. Drag an email onto a tag to label it, or right-click an email to assign tags.", + "calendar_title": "Calendar", + "calendar_desc": "Switch to the calendar to manage your events. Create events, set reminders, and view day, week, or month layouts.", + "contacts_title": "Contacts", + "contacts_desc": "Your address book lives here. Import contacts, create groups, and click any contact to see their full details.", + "settings_title": "Settings", + "settings_desc": "Customize everything: theme, density, signatures, filters, keyboard shortcuts, calendar defaults, and more.", + "shortcuts_title": "Keyboard shortcuts", + "shortcuts_desc": "Power users love this. Press ? anytime to see all available shortcuts. You can navigate, compose, and manage emails without touching a mouse.", + "compose_open_title": "The composer", + "compose_open_desc": "This is the email composer. Add recipients, write your message, attach files, and use rich text formatting. You can also save drafts and use templates.", + "calendar_view_title": "Your calendar", + "calendar_view_desc": "Here's your calendar with sample events. You can switch between day, week, month, and agenda views using the toolbar.", + "create_event_title": "Create an event", + "create_event_desc": "Click this button to create a new calendar event. You can set a title, date, time, and add participants.", + "event_modal_title": "Event details", + "event_modal_desc": "Here's the event form. Fill in the title, pick a date and time, add a location or participants. Hit save when you're done — or close it and move on.", + "contacts_list_title": "Your contacts", + "contacts_list_desc": "Here are your contacts. Click any contact to see their full details on the right. You can also create new contacts, import vCards, or organize contacts into groups.", + "settings_tabs_title": "Settings menu", + "settings_tabs_desc": "Here are all the settings categories. Customize your appearance, manage identities, set up email filters, configure your calendar, and much more.", + "files_title": "File storage", + "files_desc": "Your file browser lets you upload, organize, and share files — like a personal cloud drive built into your mail.", + "demo_banner_title": "Demo controls", + "demo_banner_desc": "You're in demo mode — everything stays in your browser. Hit 'Reset Demo' anytime to start fresh with clean sample data.", + "quota_title": "Storage usage", + "quota_desc": "Track your mailbox size here. The circle fills up as you use more space." + } +} +