Aktueller Stand

This commit is contained in:
2026-01-23 14:01:49 +01:00
parent 2766dd12c5
commit e16f6d50fb
46 changed files with 5482 additions and 311 deletions

View File

@@ -67,6 +67,26 @@
"adminGoogleRedirectUri": "Redirect URL",
"adminCleanupScanLimit": "Max emails per cleanup",
"adminCleanupScanLimitHint": "0 = unlimited. Useful for testing.",
"adminNewsletterSettings": "Newsletter detection",
"adminNewsletterSettingsHint": "Signals and thresholds used to detect newsletters. Comma-separated lists. Weights define how much each signal adds to the score.",
"adminNewsletterThreshold": "Minimum signals",
"adminNewsletterHeaderKeys": "Header keys",
"adminNewsletterHeaderKeysHint": "Comma-separated list headers (e.g. list-unsubscribe,list-id,...).",
"adminNewsletterWeightHeader": "Weight: header matches",
"adminNewsletterWeightPrecedence": "Weight: bulk/list precedence",
"adminNewsletterSubjectTokens": "Subject keywords",
"adminNewsletterSubjectTokensHint": "Comma-separated tokens matched against the subject.",
"adminNewsletterWeightSubject": "Weight: subject match",
"adminNewsletterFromTokens": "From keywords",
"adminNewsletterFromTokensHint": "Comma-separated tokens matched against the sender.",
"adminNewsletterWeightFrom": "Weight: from match",
"adminUnsubscribeHistoryTtl": "Unsubscribe dedupe window (days)",
"adminUnsubscribeHistoryTtlHint": "Prevents running unsubscribe again within this time window. Set to 0 to disable.",
"adminUnsubscribeMethod": "Unsubscribe method preference",
"adminUnsubscribeMethodHint": "Auto uses HTTP when available and falls back to mailto if HTTP fails.",
"adminUnsubscribeMethodAuto": "Auto (HTTP → mailto fallback)",
"adminUnsubscribeMethodHttp": "Prefer HTTP",
"adminUnsubscribeMethodMailto": "Prefer mailto",
"adminSaveSettings": "Save settings",
"adminSaving": "Saving...",
"adminSettingsSaved": "Saved",
@@ -74,6 +94,7 @@
"adminShowSecret": "Show secret",
"adminHideSecret": "Hide secret",
"adminSettingsSource": "Sources - Client ID: {{id}}, Secret: {{secret}}, Redirect: {{redirect}}",
"adminSettingsSourceNewsletter": "Sources - Threshold: {{threshold}}, Headers: {{headers}}, Subject tokens: {{subject}}, From tokens: {{from}}, Weights (header/precedence/subject/from): {{weightHeader}}/{{weightPrecedence}}/{{weightSubject}}/{{weightFrom}}, Unsubscribe history: {{history}}, Method: {{method}}",
"selectAll": "Select all",
"adminCancelSelected": "Cancel selected",
"adminDeleteSelected": "Delete selected",
@@ -94,30 +115,175 @@
"mailboxCancelEdit": "Cancel",
"mailboxEmpty": "No mailboxes yet. Add one to start cleaning.",
"cleanupStart": "Start cleanup",
"cleanupDryRun": "Dry run (no changes)",
"cleanupDryRun": "Simulate only (no changes)",
"cleanupUnsubscribe": "Unsubscribe enabled",
"cleanupRouting": "Routing enabled",
"cleanupDisabled": "Cleanup is not available yet.",
"cleanupSelectMailbox": "Select a mailbox to start cleanup.",
"cleanupOauthRequired": "Connect Gmail OAuth before starting cleanup.",
"cleanupDryRunHint": "Dry run simulates routing and unsubscribe actions. No changes or emails are sent.",
"cleanupDryRunHint": "Simulation only: routing and unsubscribe are simulated. No changes or emails are sent.",
"cleanupUnsubscribeHint": "Tries to unsubscribe newsletters via List-Unsubscribe. In simulation mode, it only logs the checks.",
"cleanupRoutingHint": "Applies your rules (move/delete/label). In simulation mode, it only simulates the actions.",
"rulesTitle": "Rules",
"rulesAdd": "Add rule",
"rulesReorder": "Drag to reorder",
"rulesAddTitle": "Create rule",
"rulesEditTitle": "Edit rule",
"rulesName": "Rule name",
"rulesEnabled": "Rule enabled",
"rulesMatchMode": "Match mode",
"rulesMatchAll": "All conditions (AND)",
"rulesMatchAny": "Any condition (OR)",
"rulesMatchAnyLabel": "OR",
"rulesStopOnMatch": "Stop after match (first match wins)",
"rulesStopOnMatchBadge": "FIRST",
"rulesConditions": "Conditions",
"rulesActions": "Actions",
"rulesAddCondition": "+ Add condition",
"rulesAddAction": "+ Add action",
"rulesSave": "Save rule",
"rulesExampleHint": "Example: Unsubscribe status = OK + List-Unsubscribe = * → Action: Move to \"Newsletter-Abgemeldet\".",
"remove": "Remove",
"ruleConditionUnsubscribeStatus": "Unsubscribe status",
"ruleConditionScore": "Newsletter score",
"ruleConditionScorePlaceholder": "e.g. >=2",
"ruleConditionHeaderMissing": "Header missing",
"ruleConditionHeaderMissingPlaceholder": "Header name (e.g. List-Unsubscribe)",
"ruleUnsubStatusAny": "Any",
"ruleUnsubStatusOk": "OK",
"ruleUnsubStatusDryRun": "Simulated",
"ruleUnsubStatusFailed": "Failed",
"ruleUnsubStatusSkipped": "Skipped",
"ruleUnsubStatusDuplicate": "Skipped (duplicate)",
"ruleUnsubStatusDisabled": "Disabled",
"ruleActionMarkRead": "Mark as read",
"ruleActionMarkUnread": "Mark as unread",
"rulesOverview": "Rules overview",
"rulesEmpty": "No rules yet.",
"jobsTitle": "Jobs",
"jobsEmpty": "No jobs yet.",
"jobCandidatesTitle": "Result details",
"jobCandidatesHint": "Shows each newsletter candidate with actions, unsubscribe outcome, and metadata.",
"jobCandidatesGroupBy": "Group by",
"jobCandidatesGroupDomain": "Sender domain",
"jobCandidatesGroupFrom": "From address",
"jobCandidatesGroupListId": "List-ID",
"jobCandidatesGroupNone": "No grouping",
"jobCandidatesGroupsEmpty": "No newsletter candidates yet.",
"jobCandidatesShowSignals": "Show details",
"jobCandidatesCount": "{{count}} candidates",
"jobCandidatesLoadMore": "Load more",
"jobCandidatesBack": "Back to groups",
"jobCandidatesRefresh": "Refresh",
"jobCandidatesUnknown": "Unknown",
"jobCandidatesSubject": "Subject",
"jobCandidatesFrom": "From",
"jobCandidatesListId": "List-ID",
"jobCandidatesDate": "Date",
"jobCandidatesActions": "Actions",
"jobCandidatesUnsubscribe": "Unsubscribe",
"jobCandidatesUnsubscribeNone": "No List-Unsubscribe header",
"jobCandidatesUnsubscribeDisabled": "Disabled",
"jobCandidatesUnsubscribeDryRun": "Simulated",
"jobCandidatesUnsubscribeOk": "OK",
"jobCandidatesUnsubscribeFailed": "Failed",
"jobCandidatesUnsubscribeDuplicate": "Skipped (duplicate)",
"resultsTitle": "Result details",
"resultsHint": "Open a detailed list of all detected emails with a preview of each message.",
"resultsOpen": "Open results",
"resultsGroups": "Groups",
"resultsGroupsDisabled": "Grouping disabled. Switch to a grouping option to see categories.",
"resultsItems": "Messages",
"resultsPreview": "Preview",
"resultsSelectGroup": "Select a group to load its messages.",
"resultsSelectItem": "Select a message to preview it.",
"resultsPreviewLoading": "Loading preview...",
"resultsPreviewEmpty": "No preview text available.",
"resultsSearch": "Search subject/from/list",
"resultsFilterAll": "All statuses",
"resultsReviewedAll": "All",
"resultsReviewed": "Reviewed",
"resultsUnreviewed": "Unreviewed",
"resultsExportCsv": "CSV",
"resultsExportGroupCsv": "Group CSV",
"resultsSelectAll": "All",
"resultsMarkSelectedReviewed": "Selected reviewed",
"resultsMarkSelectedUnreviewed": "Selected unreviewed",
"resultsBulkSelect": "Unreviewed",
"resultsBulkMarkReviewed": "All reviewed",
"resultsDeleteSelected": "Delete selected",
"resultsAttachments": "Attachments",
"resultsDownloadAttachment": "Download",
"resultsHistory": "Unsubscribe history",
"resultsUnsubscribeDetails": "Unsubscribe details",
"resultsUnsubscribeStatus": "Status",
"resultsUnsubscribeMethod": "Method",
"resultsUnsubscribeTarget": "Target",
"resultsUnsubscribeMessage": "Result",
"resultsListId": "List-ID",
"resultsListUnsubscribe": "List-Unsubscribe",
"resultsListUnsubscribePost": "List-Unsubscribe-Post",
"resultsMailtoSubject": "Mailto subject",
"resultsMailtoBody": "Mailto body",
"resultsRequestMethod": "Request method",
"resultsRequestUrl": "Request URL",
"resultsResponseStatus": "Response status",
"resultsResponseRedirect": "Redirect",
"resultsMailtoVia": "Mail sent via",
"resultsMailtoTo": "Mailto",
"resultsMailtoReplyTo": "Reply-To",
"resultsMailtoListUnsubscribe": "List-Unsubscribe header",
"resultsUnsubscribeReason": "Reason",
"resultsUnsubscribeError": "Error",
"resultsLive": "Live",
"resultsStatic": "Static",
"resultsBackToJob": "Back to job",
"jobCandidatesActionApplied": "Applied",
"jobCandidatesActionDryRun": "Simulated",
"jobCandidatesActionFailed": "Failed",
"jobCandidatesActionSkipped": "Skipped",
"jobCandidatesSignals": "Signals",
"jobCandidatesScore": "Score",
"jobCandidatesScoreHint": "Score is derived from subject, sender, header signals, and the newsletter detection model.",
"jobCandidatesHeaderSignals": "Headers",
"jobCandidatesSubjectSignals": "Subject matches",
"jobCandidatesFromSignals": "From matches",
"jobCandidatesPrecedenceSignal": "Bulk/List precedence",
"jobEventCleanupStarted": "Cleanup started",
"jobEventCleanupFinished": "Cleanup finished",
"jobEventConnecting": "Connecting to {{email}}",
"jobEventListingGmail": "Listing Gmail messages",
"jobEventListedGmail": "Listed {{count}} Gmail messages so far",
"jobEventPreparedGmail": "Prepared {{count}} Gmail messages",
"jobEventResumeGmail": "Resuming Gmail cleanup at {{current}}/{{total}}",
"jobEventProcessingGmail": "Processing {{count}} Gmail messages",
"jobEventNoGmail": "No Gmail messages to process",
"jobEventFoundMailboxes": "Found {{count}} mailboxes",
"jobEventScanningMailbox": "Scanning {{mailbox}}",
"jobEventPreparedImap": "Prepared {{count}} IMAP messages",
"jobEventResumeImap": "Resuming IMAP cleanup at {{current}}/{{total}}",
"jobEventProcessingImap": "Processing {{count}} IMAP messages",
"jobEventNoImap": "No IMAP messages to process",
"jobEventDetectedCandidates": "Detected {{count}} newsletter candidates",
"jobEventProcessed": "Processed {{current}}/{{total}}",
"jobEventProcessedCount": "Processed {{current}}",
"jobEventGmailActionAppliedList": "Gmail action applied: {{actions}}",
"jobEventGmailActionApplied": "Gmail action applied: {{action}}",
"jobEventGmailActionSkippedNoChanges": "Gmail action skipped: no label changes",
"jobEventGmailActionFailedSimple": "Gmail action failed: {{error}}",
"jobEventGmailActionFailed": "Gmail action failed ({{action}}): {{error}}",
"jobEventImapActionFailed": "IMAP action failed ({{action}}): {{error}}",
"jobEventDryRunAction": "Simulate only: {{action}}",
"jobEventCanceledByAdmin": "Job canceled by admin",
"jobEventCanceledBeforeStart": "Job canceled before start",
"jobEventFailed": "Job failed: {{error}}",
"loadingCandidates": "Loading candidates...",
"jobsProgress": "Progress",
"jobsEta": "ETA",
"jobsEtaDone": "Done",
"jobsEtaQueued": "Queued",
"jobsEtaRecalculating": "Recalculating ETA…",
"jobsEtaCalculating": "Calculating…",
"jobDetailsTitle": "Job details",
"jobNoEvents": "No events yet.",
"jobEvents": "Job events",
@@ -128,7 +294,13 @@
"phaseProcessingPending": "Waiting for processing.",
"phaseUnsubscribePending": "Waiting for unsubscribe.",
"phaseUnsubscribeDisabled": "Unsubscribe disabled for this job.",
"phaseUnsubscribeSummary": "Unsubscribed {{ok}} · Failed {{failed}} · Dry run {{dryRun}} ({{total}} total).",
"phaseUnsubscribeSummary": "Unsubscribed {{ok}} · Failed {{failed}} · Simulated {{dryRun}} ({{total}} total).",
"phaseUnsubscribeSummaryWithProcessed": "Unsubscribed {{ok}} · Failed {{failed}} · Simulated {{dryRun}} ({{total}} candidates, {{processed}}/{{overall}} processed).",
"phaseUnsubscribeSummaryNoDryRun": "Unsubscribed {{ok}} · Failed {{failed}} ({{total}} total).",
"phaseUnsubscribeSummaryNoDryRunWithProcessed": "Unsubscribed {{ok}} · Failed {{failed}} ({{total}} candidates, {{processed}}/{{overall}} processed).",
"phaseUnsubscribeDryRunPending": "Simulation: waiting for unsubscribe checks.",
"phaseUnsubscribeDryRunSummary": "Simulation: {{dryRun}} unsubscribe checks ({{total}} total).",
"phaseUnsubscribeDryRunSummaryWithProcessed": "Simulation: {{dryRun}} unsubscribe checks ({{total}} candidates, {{processed}}/{{overall}} processed).",
"phaseStatusActive": "Active",
"phaseStatusDone": "Done",
"phaseStatusPending": "Pending",
@@ -173,6 +345,7 @@
"statusRunning": "Running",
"statusQueued": "Queued",
"statusSucceeded": "Succeeded",
"statusFinished": "Cleanup finished",
"statusFailed": "Failed",
"statusCanceled": "Canceled",
"oauthStatusLabel": "OAuth status"
@@ -250,11 +423,14 @@
"toastMailboxDeleted": "Mailbox deleted.",
"toastRuleSaved": "Rule saved.",
"toastRuleDeleted": "Rule deleted.",
"toastRuleOrderSaved": "Rule order updated.",
"toastDeleteSelected": "{{deleted}} deleted · {{missing}} missing · {{failed}} failed",
"toastCleanupStarted": "Cleanup job started.",
"toastLoggedOut": "Logged out.",
"toastExportQueued": "Export queued.",
"toastExportReady": "Export ready.",
"toastExportFailed": "Export failed.",
"toastDownloadFailed": "Download failed.",
"toastExportPurged": "Expired exports purged.",
"toastExportDeleted": "Export deleted.",
"toastTenantUpdated": "Tenant updated.",
@@ -270,5 +446,6 @@
"toastSettingsSaved": "Settings saved.",
"toastSettingsFailed": "Settings save failed.",
"confirmMailboxDelete": "Delete mailbox {{email}}? This will remove all related data.",
"confirmDeleteSelected": "Delete {{count}} selected messages? Messages might already be deleted.",
"adminDeleteJobConfirm": "Delete this job and all its events?"
}