DSGVO Art. 9 — Compliance-Gap im Mail-Connect-Flow geschlossen (Hans-Müller-DSB
hat den Gap für Gmail/iCloud/GMX identifiziert, schon vor Outlook-OAuth-Pflicht):
- Schema: mail_connections.consent_at + consent_version + consent_ip_address;
neue consent_logs-Tabelle für Audit (grant + revoke append-only)
- Endpoints:
- POST /api/mail-connections/consent (Bulk-Array für Re-Consent, partial-fail
wirft sofort = DSGVO-sicher gegen silent-skip fremder IDs)
- POST /api/mail-connections/:id mit consent-gate (412 wenn consentVersion fehlt)
- DELETE /api/mail-connections/:id mit Widerruf-Log (OAuth-Token-Revoke als
TODO für mo Phase 2)
- GET /api/mail-connections/pending-consent — listet Bestands-Connections
mit consent_at=NULL für Re-Consent-Modal
- Account-Lösch-Bug fix: deleteAllMailConnections() war in user/delete nicht
eingebunden — Verbindungen blieben als Waisen
- Frontend:
- ConnectMailSheet: neuer Consent-Step VOR Provider-Grid (view-Machine
consent → grid → form), exakter Hans-Müller-Wortlaut für Art. 9 Abs. 2
lit. a Einwilligung
- MailConsentReminderSheet: Re-Consent-Modal beim App-Open für Bestands-User
- Stores mailConsent + mailConnectDraft (letzterer fixt Bug: Email/Provider
ging verloren wenn User Browser für App-Pw-Generierung öffnete)
- 12 neue i18n-Keys mail.consent.* in DE + EN
- Versionierter Consent-Text: art9-mail-v1-2026-05-13 (Bump bei Text-Änderung
triggert Re-Consent für alle)
Outlook-OAuth Schema (Phase 0 — additiv, Endpoints kommen später):
- mail_connections: auth_method (default 'app_password' → keine Bestands-
Connection bricht), oauth_access_token, oauth_refresh_token,
oauth_token_expiry, oauth_scope
- Encryption via bestehendes server/utils/crypto.ts (AES-256-GCM, Key aus
Infisical)
- Plan-Doc backend/docs/mail-outlook-oauth-plan.md (mo)
- DSB-Review backend/docs/mail-outlook-oauth-dsgvo-review.md (Hans-Müller):
MS als Sub-AV via DPA Sep 2025, EU Data Boundary seit Feb 2025; 5 Pflicht-
Aufgaben + Anwalts-Klärung zu DPA-Anspruch ohne MS-Lizenz
Profile — Cooldown-Pattern-Analysis als Collapsible:
- CooldownPatternAnalysis: 24h-Uhrzeit-Heatmap, Mo–So-Wochentag-Histogramm,
Top-5-Reason-Wortcloud mit Stop-Words-Filter, Cancel-Rate-Anzeige
- DiGA-relevant: NLP läuft client-side, reason-Texte verlassen das Device
nicht (gut für DSB-Akte)
- useProfileData: useCooldownHistoryFull (limit=100) für Pattern-Analyse
- Neutral formuliert, kein Stigma, alle Headings als Frage
Plan-Docs (kein Code):
- backend/docs/mail-custom-keywords-plan.md — Pro/Legend Custom-Keyword-Filter
(3.25 PT MVP, user-scoped, Body-Match in Phase 2)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
929 lines
45 KiB
JSON
929 lines
45 KiB
JSON
{
|
||
"common": {
|
||
"loading": "One moment...",
|
||
"cancel": "Cancel",
|
||
"continue": "Continue",
|
||
"back": "Back",
|
||
"error": "Error",
|
||
"success": "Success",
|
||
"ok": "OK",
|
||
"confirm": "Confirm",
|
||
"retry": "Try again",
|
||
"unknown_error": "Unknown error"
|
||
},
|
||
"auth": {
|
||
"welcomeBack": "Welcome back",
|
||
"signinSubtitle": "Sign in to continue.",
|
||
"signin": "Sign in",
|
||
"signingIn": "One moment...",
|
||
"signup": "Sign up",
|
||
"signupTitle": "Create account",
|
||
"signupSubtitle": "Join the community.",
|
||
"signOut": "Sign out",
|
||
"email": "Email",
|
||
"emailPlaceholder": "Email",
|
||
"emailRequired": "Email *",
|
||
"password": "Password",
|
||
"passwordPlaceholder": "Password",
|
||
"passwordRequired": "Password * (min. 8 characters)",
|
||
"passwordMin8": "Password must be at least 8 characters.",
|
||
"newPassword": "New password",
|
||
"firstName": "First name",
|
||
"lastName": "Last name",
|
||
"nickname": "Username",
|
||
"nicknamePlaceholder": "Username * (visible to others)",
|
||
"noAccount": "No account yet?",
|
||
"alreadyRegistered": "Already registered?",
|
||
"fillRequired": "Please fill in all required fields.",
|
||
"googleSignin": "Sign in with Google",
|
||
"appleSignin": "Sign in with Apple",
|
||
"googleSignup": "Sign up with Google",
|
||
"appleSignup": "Sign up with Apple",
|
||
"orWithEmail": "or with email",
|
||
"forgotPassword": "Forgot password?",
|
||
"resetPasswordTitle": "Reset password",
|
||
"resetPasswordSubtitle": "Enter your email and we'll send you a reset link.",
|
||
"resetPasswordSend": "Send link",
|
||
"resetPasswordSent": "Email sent",
|
||
"resetPasswordSentDesc": "Check your inbox. The link is valid for 60 minutes.",
|
||
"resetPasswordSentDescPrefix": "Check your inbox for ",
|
||
"resetPasswordSentDescSuffix": ". The link is valid for 60 minutes.",
|
||
"backToLogin": "← Back to sign in",
|
||
"backToLoginPlain": "Back to sign in",
|
||
"backToSignup": "← Back to sign up",
|
||
"chooseAvatar": "Choose avatar",
|
||
"privacyNotice": "Your data is stored securely on servers in Germany. We never sell data to third parties.",
|
||
"acceptTerms": "I accept the",
|
||
"acceptTermsSuffix": " and have read the privacy policy.",
|
||
"termsLink": "Terms of Service",
|
||
"pleaseAcceptTerms": "Please accept the Terms of Service.",
|
||
"confirmEmailTitle": "Confirm email",
|
||
"confirmEmailDesc": "We sent a 6-digit code to %{email}.",
|
||
"confirmEmailLine1": "We sent a 6-digit code to",
|
||
"confirmEmailLine2": "",
|
||
"confirmBtn": "Confirm",
|
||
"confirmed": "Confirmed! Redirecting...",
|
||
"confirming": "Confirming sign-in...",
|
||
"confirmSuccess": "Successfully signed in!",
|
||
"confirmTimeout": "Timed out – please try again.",
|
||
"confirmFailed": "Confirmation failed.",
|
||
"resend": "Resend",
|
||
"resendCooldown": "Resend (%{seconds}s)",
|
||
"noCode": "Didn't receive a code?",
|
||
"deviceLimitTitle": "Device limit reached",
|
||
"deviceLimitDesc": "Your current plan doesn't allow more devices. Free up another device or upgrade your plan to continue on this device.",
|
||
"deviceLimitUpgrade": "Upgrade plan",
|
||
"toLogin": "Back to sign in",
|
||
"oauthFailed": "Sign in failed",
|
||
"loginFailed": "Sign in failed",
|
||
"registerFailed": "Registration failed"
|
||
},
|
||
"landing": {
|
||
"appName": "Rebreak",
|
||
"tagline": "You're not walking alone.",
|
||
"start": "Sign up"
|
||
},
|
||
"splash": {
|
||
"tagline": "You will never walk alone!",
|
||
"subtitle": "Together we'll make it.",
|
||
"madeInGermany": "Made in Germany"
|
||
},
|
||
"applock": {
|
||
"title": "Rebreak is locked",
|
||
"subtitle": "Unlock the app to continue.",
|
||
"unlock": "Unlock",
|
||
"prompt": "Unlock Rebreak",
|
||
"signOut_title": "Sign out?",
|
||
"signOut_body": "You can sign back in with your email and password afterwards."
|
||
},
|
||
"appHeader": {
|
||
"appName": "ReBreak",
|
||
"sosLabel": "SOS",
|
||
"sosTagline": "we're here for you",
|
||
"sosSubtitle": "Tap if you need help",
|
||
"editProfile": "Edit profile",
|
||
"settings": "Settings",
|
||
"signOut": "Sign out"
|
||
},
|
||
"headerMenu": {
|
||
"profile": "Profile",
|
||
"settings": "Settings",
|
||
"games": "ReBreak Games",
|
||
"debug": "Debug",
|
||
"logout": "Sign out"
|
||
},
|
||
"tabs": {
|
||
"home": "Home",
|
||
"chat": "Chat",
|
||
"coach": "Coach",
|
||
"blocker": "Blocker",
|
||
"mail": "Mail",
|
||
"profile": "Profile"
|
||
},
|
||
"games": {
|
||
"title": "ReBreak Games",
|
||
"subtitle": "Casual play outside SOS — Memory, Snake, Tetris and Tic-Tac-Toe.",
|
||
"back_to_picker": "Games",
|
||
"last_score": "Score: %{score}",
|
||
"skeleton_footer": "Skeleton — Highscore leaderboard coming in Phase C"
|
||
},
|
||
"home": {
|
||
"tagline": "You're not walking alone.",
|
||
"start": "Get started",
|
||
"greeting_morning": "Good morning",
|
||
"greeting_day": "Good afternoon",
|
||
"greeting_evening": "Good evening",
|
||
"streak_days_one": "day clean",
|
||
"streak_days_other": "days clean",
|
||
"streak_start": "Start your first day",
|
||
"quote_of_day": "Thought of the day",
|
||
"quick_access": "Quick access",
|
||
"stats_urges": "Urges",
|
||
"stats_chats": "Chats",
|
||
"stats_mails": "Mails blocked"
|
||
},
|
||
"coach": {
|
||
"title": "Lyra",
|
||
"subtitle": "Your CBT coach",
|
||
"welcome": "Hi! I'm Lyra, your personal coach. How are you doing today? I'm here to listen and help.",
|
||
"input_placeholder": "Write to me...",
|
||
"new_chat": "New chat",
|
||
"lyra": "Lyra",
|
||
"modeBadge": {
|
||
"coach": "Coach",
|
||
"sos": "SOS"
|
||
},
|
||
"placeholder": "What's on your mind?",
|
||
"speaking": "Lyra is speaking...",
|
||
"recording": "Recording...",
|
||
"transcribing": "Processing...",
|
||
"feedback_saved": "Feedback saved",
|
||
"welcome_back": "Welcome back",
|
||
"online": "online",
|
||
"thinking": "typing …",
|
||
"error": "Something went wrong. Please try again."
|
||
},
|
||
"blocker": {
|
||
"title": "Blocker",
|
||
"subtitle": "208,000+ domains blocked",
|
||
"status_active": "Active",
|
||
"status_inactive": "Inactive",
|
||
"filter_label": "Gambling Filter",
|
||
"filter_active_desc": "All gambling sites are being blocked",
|
||
"filter_inactive_desc": "Filter is disabled",
|
||
"tamper_title": "Tamper protection",
|
||
"tamper_desc": "The filter is secured against easy disabling. Unlocking requires a 6-hour cooldown period.",
|
||
"custom_domains": "Custom Domains",
|
||
"add_domain": "Add",
|
||
"help_link": "Help & FAQ about Blocker",
|
||
"status_approved": "Approved",
|
||
"status_rejected": "Rejected",
|
||
"status_pending": "Pending",
|
||
"add_sheet_title": "Block domain",
|
||
"add_sheet_label": "Domain",
|
||
"add_sheet_placeholder": "e.g. bet365.com",
|
||
"add_sheet_invalid": "Please enter a valid domain (e.g. example.com)",
|
||
"add_sheet_warning_free": "This domain stays on your list permanently — you cannot remove it later.",
|
||
"add_sheet_warning_pro": "This domain is permanent. You can release it to the global blocklist — the slot becomes free again and it will protect every ReBreak user.",
|
||
"add_sheet_confirm_permanent": "I understand this domain is permanent.",
|
||
"add_sheet_add_failed": "Failed to add domain.",
|
||
"add_sheet_already_global": "%{domain} is already on the global blocklist — no slot needed.",
|
||
"cooldown_banner_title": "Cooldown running",
|
||
"deactivation_actionsheet_title": "Start 24-hour cooldown?",
|
||
"deactivation_actionsheet_message": "Protection stays active during this time. You can cancel anytime.",
|
||
"deactivation_start_cta": "Start cooldown",
|
||
"deactivation_failed_msg": "Could not start cooldown.",
|
||
"deactivation_heading": "Before you deactivate",
|
||
"deactivation_title": "We get it.",
|
||
"deactivation_intro": "Before you turn off protection, here's what you should know:",
|
||
"deactivation_bullet1_title": "24-hour cooldown",
|
||
"deactivation_bullet1_text": "Protection stays active for 24 hours even after you start the cooldown. This time gives you space to let the urge pass.",
|
||
"deactivation_bullet2_title": "You can cancel anytime",
|
||
"deactivation_bullet2_text": "If the urge fades: one tap and the cooldown is gone. Protection just stays on.",
|
||
"deactivation_bullet3_title": "Other tools are here",
|
||
"deactivation_bullet3_text": "Breathing exercise, Lyra, your streak — everything stays available while you wait.",
|
||
"deactivation_breathe_cta": "Breathe for 3 min",
|
||
"deactivation_start_anyway": "Start cooldown anyway",
|
||
"deactivation_starting": "Starting cooldown…",
|
||
"deactivation_cancel_failed": "Could not cancel cooldown.",
|
||
"domain_section_title": "Custom domains",
|
||
"domain_add_a11y": "Add domain",
|
||
"domain_limit_title": "Limit reached",
|
||
"domain_limit_desc": "Pro: 208k+ domains, refill on release — tap for details",
|
||
"domain_empty": "No custom domains yet.\nTap + to add one.",
|
||
"domain_badge_voting": "Voting",
|
||
"domain_badge_pruefung": "Review",
|
||
"domain_badge_rejected": "Rejected",
|
||
"domain_badge_active": "Active",
|
||
"domain_btn_freigeben": "Release",
|
||
"domain_btn_erneut": "Retry",
|
||
"domain_btn_in_abstimmung": "In voting",
|
||
"domain_btn_rebreak_prueft": "ReBreak reviewing",
|
||
"domain_confirm_legend_resubmit": "Resubmit to ReBreak?",
|
||
"domain_confirm_legend_first": "Send domain to ReBreak?",
|
||
"domain_confirm_community_resubmit": "Resubmit to community vote?",
|
||
"domain_confirm_community_first": "Release domain to community vote?",
|
||
"domain_confirm_legend_message": "%{domain} will be sent directly to the ReBreak team for manual review.",
|
||
"domain_confirm_community_message": "%{domain} will be released to the community vote (yes/no voting).",
|
||
"domain_success_legend_title": "Domain submitted",
|
||
"domain_success_community_title": "Domain in voting",
|
||
"domain_success_legend_message": "The ReBreak team is reviewing this domain manually. You'll get a notification with the result.",
|
||
"domain_success_community_message": "The community can now vote. You'll be notified once the result is in.",
|
||
"upgrade_alert_title": "Pro upgrade",
|
||
"upgrade_alert_desc": "Stripe checkout is coming in step 11.",
|
||
"protection_card_title": "ReBreak protection",
|
||
"protection_card_locked_title": "ReBreak protection active",
|
||
"protection_subtitle_inactive": "Tap to activate protection",
|
||
"protection_subtitle_cooldown": "Cooldown running — protection still active",
|
||
"protection_subtitle_free": "Filter active — %{count} custom domains",
|
||
"protection_subtitle_legend": "Protected against 208,000+ domains + up to 10 custom",
|
||
"protection_subtitle_pro": "Protected against 208,000+ domains + 5 custom",
|
||
"protection_settings_a11y": "Protection settings",
|
||
"protection_stat_domains": "Domains",
|
||
"protection_stat_method": "Method",
|
||
"protection_stat_method_dns": "DNS",
|
||
"protection_stat_method_native": "Native",
|
||
"protection_stat_status": "Status",
|
||
"protection_stat_status_live": "Live",
|
||
"activate_url_failed_title": "Could not activate URL filter",
|
||
"activate_url_failed_msg": "Unknown error.\nYou can try again or check System Settings.",
|
||
"activate_settings_btn": "Settings",
|
||
"protection_off_title": "Protection is off",
|
||
"protection_off_message": "The filter isn't running but should be. Want to turn it back on?",
|
||
"reactivate_btn": "Turn back on",
|
||
"activate_app_lock_failed_title": "Could not activate App Lock",
|
||
"activate_app_lock_failed_msg": "The required permission was denied. You can try again.",
|
||
"sync_list_failed_title": "Filter list could not be loaded",
|
||
"sync_list_failed_msg": "Please try again later.",
|
||
"activation_failed_title": "Activation failed",
|
||
"details_done": "Done",
|
||
"details_title": "Protection details",
|
||
"details_active_title": "Protection active",
|
||
"details_domains_blocked": "%{value} domains blocked",
|
||
"details_layers_heading": "Active layers",
|
||
"details_layer_url_label": "Network filter",
|
||
"details_layer_url_desc": "Blocks gambling domains system-wide (NEFilter Extension)",
|
||
"details_layer_applock_label": "App lock",
|
||
"details_layer_applock_desc": "ReBreak cannot be deleted impulsively",
|
||
"details_layer_vpn_label": "VPN filter",
|
||
"details_layer_vpn_desc": "Local DNS filter via VpnService",
|
||
"details_layer_a11y_label": "Browser filter",
|
||
"details_layer_a11y_desc": "Detects URL input in browser apps",
|
||
"details_layer_tamper_label": "Tamper lock",
|
||
"details_layer_tamper_desc": "Watchdog against external deactivation",
|
||
"details_lyra_cta_title": "Don't need protection anymore?",
|
||
"details_lyra_cta_subtitle": "Talk to Lyra about it — she's listening.",
|
||
"details_deactivate_link": "Deactivate anyway",
|
||
"layers_url_filter_title": "URL filter",
|
||
"layers_url_filter_subtitle_active": "System-wide filter active",
|
||
"layers_url_filter_subtitle_inactive": "Blocks gambling sites in Safari + apps",
|
||
"layers_app_lock_title": "App lock",
|
||
"layers_app_lock_subtitle_active": "Locked — disable only via the cooldown",
|
||
"layers_app_lock_subtitle_inactive": "Stops you from switching off ReBreak or the filter on impulse",
|
||
"layers_app_lock_warning": "Once active, you can only disable protection through a 24-hour cooldown. That's by design.",
|
||
"kpi_global_label": "Domains blocked worldwide",
|
||
"kpi_global_subtitle": "Active entries in the global blocklist",
|
||
"delta_week": "this week",
|
||
"delta_month": "this month",
|
||
"kpi_submissions_title": "Your submitted domains",
|
||
"kpi_submissions_subtitle": "Status of your contributions to the global list",
|
||
"kpi_my_submissions": "total",
|
||
"kpi_status_active": "active",
|
||
"kpi_status_vote": "in vote",
|
||
"kpi_status_review": "in review",
|
||
"kpi_in_vote": "In vote",
|
||
"kpi_in_review": "In review",
|
||
"kpi_avg_per_user": "Avg. domains per user",
|
||
"kpi_avg_wait": "Avg. wait",
|
||
"kpi_days_suffix": "days",
|
||
"faq_heading": "FAQ",
|
||
"faq1_q": "How does protection work?",
|
||
"faq1_a": "Protection runs directly in iOS as a content filter. Gambling sites are blocked locally on your device — no traffic leaves your iPhone.",
|
||
"faq2_q": "How many sites are blocked?",
|
||
"faq2_a": "Over 208,000 domains from a curated global blocklist — online casinos, sports betting, gambling platforms and related sites. The list is updated regularly.",
|
||
"faq3_q": "Can I add my own domains?",
|
||
"faq3_a": "Yes. From the domain list on the blocker page you can add custom domains that get blocked in addition to the global list.",
|
||
"faq4_q": "Why can't I turn protection off immediately?",
|
||
"faq4_a": "In the moment of urge, you often want to disable fast — and regret it after. The 24-hour cooldown gives you time for the urge to pass. You can cancel the cooldown anytime — protection then simply stays on.",
|
||
"more_info_title": "Disable protection",
|
||
"cooldown_elapsed_title": "Protection is off",
|
||
"cooldown_elapsed_message": "The cooldown has elapsed — protection was disabled. You can now turn off the ReBreak accessibility service in Settings.",
|
||
"cooldown_elapsed_open_settings": "Open Settings",
|
||
"app_lock_coming_soon_badge": "Soon",
|
||
"app_lock_coming_soon_desc": "App lock coming soon — filter protection is already active."
|
||
},
|
||
"mail": {
|
||
"title": "Mail Shield",
|
||
"subtitle": "Automatically block gambling emails",
|
||
"plan_free": "Free",
|
||
"stat_accounts": "Mailbox",
|
||
"stat_domains": "Domains",
|
||
"stat_interval": "Scan interval",
|
||
"connect_title": "Connect your mailbox",
|
||
"connect_desc": "Rebreak automatically scans for gambling emails and blocks them — without reading your emails.",
|
||
"connect_cta": "Connect now",
|
||
"privacy_1": "Only subject + sender are checked",
|
||
"privacy_2": "No access to email content",
|
||
"privacy_3": "GDPR-compliant, servers in Germany",
|
||
"providers_title": "Supported providers",
|
||
"provider_other": "Other providers",
|
||
"empty_title": "No emails blocked yet",
|
||
"empty_subtitle": "Connect your mailbox so Rebreak can protect you automatically.",
|
||
"connect_sheet_title": "Connect mailbox",
|
||
"connect_sheet_subtitle": "Choose your email provider. Rebreak deletes gambling emails automatically — your message content is never read.",
|
||
"provider_gmail": "Gmail",
|
||
"provider_icloud": "iCloud Mail",
|
||
"provider_outlook": "Outlook",
|
||
"provider_outlook_disabled_badge": "Coming soon",
|
||
"provider_outlook_disabled_hint": "Microsoft accounts need a new sign-in method, we're working on it.",
|
||
"provider_yahoo": "Yahoo Mail",
|
||
"provider_gmx": "GMX / Web.de",
|
||
"app_password_required_title": "App password required",
|
||
"app_password_guide_gmail": "Gmail requires an app-specific password (not your regular Google password). Enable 2FA and create an app password at myaccount.google.com/apppasswords.",
|
||
"app_password_guide_icloud": "iCloud requires an app-specific password. Go to appleid.apple.com → Sign in → App-specific passwords.",
|
||
"app_password_guide_outlook": "Outlook with Microsoft account: Enable 2FA and create an app password at account.microsoft.com/security.",
|
||
"app_password_guide_yahoo": "Yahoo requires an app password. Enable 2FA and create it at login.yahoo.com/account/security.",
|
||
"app_password_guide_gmx": "GMX / Web.de: Enable IMAP in settings and use your regular password or an app password if 2FA is active.",
|
||
"app_password_guide_other": "Enter your email address and app password. Rebreak detects your provider automatically from the domain (e.g. IONOS, Strato, 1&1). An app password is recommended if available.",
|
||
"app_password_open_link": "Create app password now",
|
||
"form_email_label": "Email address",
|
||
"form_email_placeholder": "your@email.com",
|
||
"form_password_label": "App password",
|
||
"form_password_placeholder": "App password (not your login password)",
|
||
"form_privacy_note": "Your password is stored AES-encrypted. The content of your emails is never read — only subject and sender.",
|
||
"form_connect_btn": "Connect mailbox",
|
||
"form_fields_required": "Email and password are required.",
|
||
"connect_failed": "Connection failed. Please check your credentials.",
|
||
"section_accounts": "Mailboxes",
|
||
"add_account_a11y": "Add mailbox",
|
||
"empty_state_title": "No mailbox connected",
|
||
"empty_state_subtitle": "Connect your first mailbox — Rebreak will delete gambling emails automatically before you see them.",
|
||
"empty_state_cta": "Connect first mailbox",
|
||
"account_active": "Active",
|
||
"account_inactive": "Inactive",
|
||
"account_last_scan": "%{time} ago",
|
||
"account_never_scanned": "Not scanned yet",
|
||
"account_just_now": "just now",
|
||
"account_stat_blocked": "Blocked",
|
||
"account_stat_scanned": "Scanned",
|
||
"account_stat_block_rate": "Block rate",
|
||
"account_disconnect_confirm_title": "Disconnect mailbox?",
|
||
"account_disconnect_confirm_message": "%{email} will be disconnected and all scan data will be deleted.",
|
||
"account_disconnect_confirm_btn": "Disconnect",
|
||
"stats_blocked": "Blocked",
|
||
"stats_accounts": "Mailboxes",
|
||
"stats_next_scan": "Next scan",
|
||
"stats_next_scan_soon": "soon",
|
||
"stats_mode": "Mode",
|
||
"stats_account_summary": "across %{count} mailbox(es)",
|
||
"scheduled": "Scheduled",
|
||
"account_of_scanned": "of %{scanned} scanned",
|
||
"activity_log_count": "%{count} mail(s) blocked",
|
||
"connect_success_title": "Mailbox connected",
|
||
"connect_success_message": "Rebreak will now automatically scan for gambling emails.",
|
||
"upgrade_alert_title": "More mailboxes",
|
||
"upgrade_alert_desc": "Upgrade to Pro for up to 3 mailboxes, or Legend for unlimited.",
|
||
"add_account": "Add mailbox",
|
||
"section_accounts_count": "%{used} of %{max} connected",
|
||
"section_accounts_count_unlimited": "%{used} connected · unlimited",
|
||
"live": "Live",
|
||
"disconnect": "Disconnect",
|
||
"loading": "Loading…",
|
||
"app_password_placeholder": "App password",
|
||
"scan_interval_label": "Scan interval",
|
||
"realtime_desc": "Real-time blocking via IMAP IDLE",
|
||
"free_scan_interval_hint": "Free plan: fixed 4h interval. Upgrade for 1h.",
|
||
"account_change_password": "Change password",
|
||
"edit_account_title": "Update password",
|
||
"edit_account_subtitle": "Enter the new app password for %{email}. The previous password will be replaced.",
|
||
"edit_account_save": "Save",
|
||
"activity_log_title": "Recently blocked",
|
||
"activity_log_subtitle": "Mails blocked in the last 24h",
|
||
"activity_log_empty": "No mails blocked in the last 24h",
|
||
"activity_log_more": "+ %{count} more",
|
||
"activity_no_subject": "(no subject)",
|
||
"chart_title": "Last 7 days",
|
||
"chart_week_total": "%{count} this week",
|
||
"status_auth_error": "Auth Error",
|
||
"status_connect_error": "Connection Error",
|
||
"status_error_tap_hint": "Tap to fix",
|
||
"status_stale": "Stale",
|
||
"status_stale_last_scan": "last scan %{rel}",
|
||
"status_live_idle": "IDLE active since %{rel}",
|
||
"status_live_no_new_mail": "connected · no new mail since %{rel}",
|
||
"status_waiting_first_connect": "Waiting for first connection",
|
||
"auth_error_title": "App Password invalid",
|
||
"auth_error_subtitle": "The app password for %{email} has expired or is incorrect. Please renew it and enter it below.",
|
||
"auth_error_renew_link": "Create new app password",
|
||
"errors": {
|
||
"auth_failed": "The app password is incorrect. Please regenerate it at your mail provider and enter it here.",
|
||
"app_password_required": "Your mail provider requires an app-specific password. Create one in your account settings.",
|
||
"connection_failed": "Could not connect to the mail server. Please try again later.",
|
||
"host_unreachable": "Mail server unreachable. Check your internet connection — or your provider may not be supported yet. Write to: support@rebreak.org",
|
||
"tls_error": "Secure connection to the mail server failed. Please contact your provider.",
|
||
"rate_limited": "Too many connection attempts. Please wait a few minutes and try again.",
|
||
"unknown": "Connection failed. Check your app password or write us at support@rebreak.org — we'll add your provider."
|
||
},
|
||
"consent": {
|
||
"title": "Before you connect your inbox",
|
||
"intro": "Rebreak scans your inbox specifically for gambling promotional emails and deletes them automatically. This processing may allow conclusions to be drawn about a gambling disorder — we treat this as a special category of data under Art. 9 GDPR.",
|
||
"legal_text": "By connecting my email inbox, I expressly consent to Rebreak scanning my inbox specifically for gambling promotional emails and deleting them. I acknowledge that this processing may allow conclusions to be drawn about a gambling disorder, and I expressly consent to this processing of health-related data pursuant to Art. 9(2)(a) GDPR. I may withdraw this consent at any time with future effect by disconnecting the mail connection in the app settings.",
|
||
"checkbox_label": "I expressly consent",
|
||
"cta_next": "Continue",
|
||
"more_link": "More about this processing",
|
||
"reminder_title": "Important privacy update",
|
||
"reminder_body_one": "We have updated our consent wording for mail processing. Your existing mailbox connection requires your renewed explicit consent — otherwise we will pause automatic deletion.",
|
||
"reminder_body_other": "We have updated our consent wording for mail processing. Your %{count} existing mailbox connections require your renewed explicit consent — otherwise we will pause automatic deletion.",
|
||
"reminder_legal_short": "I consent to the processing of my mailbox contents under Art. 9(2)(a) GDPR.",
|
||
"reminder_cta_consent": "I consent",
|
||
"reminder_cta_later": "Later",
|
||
"reminder_cta_disconnect": "Disconnect now",
|
||
"reminder_consent_error": "Failed to save consent. Please try again."
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"account_section": "Account",
|
||
"prefs_section": "Preferences",
|
||
"danger_section": "Danger Zone",
|
||
"edit_profile": "Edit profile",
|
||
"devices": "Devices",
|
||
"devices_desc": "Manage registered devices",
|
||
"subscription": "Subscription",
|
||
"subscription_desc": "Plan & upgrade path",
|
||
"subscription_plan_free": "Free",
|
||
"subscription_plan_pro": "Pro",
|
||
"subscription_plan_legend": "Legend",
|
||
"subscription_sheet_title": "Your subscription",
|
||
"subscription_sheet_body": "Manage your subscription at rebreak.org — upgrade, downgrade or cancel there.",
|
||
"subscription_sheet_cta": "Go to rebreak.org/account",
|
||
"plan_free": "Free",
|
||
"push_notifications": "Push notifications",
|
||
"streak_reminders": "Streak reminders",
|
||
"language": "Language",
|
||
"language_desc": "German / English",
|
||
"language_current": "English",
|
||
"upgrade_cta": "Upgrade to Pro — €29/year",
|
||
"delete_account": "Delete account",
|
||
"delete_desc": "All data will be permanently deleted.",
|
||
"sign_out": "Sign out",
|
||
"coming_soon_title": "Coming soon",
|
||
"coming_soon_desc": "Settings will be wired up in Phase 3. Currently skeleton only.",
|
||
"soon_badge": "Soon",
|
||
"skeleton_footer": "Settings skeleton — see ops/UI_MIGRATION_PLAN.md",
|
||
"section_profile": "Profile",
|
||
"profile_edit": "Nickname & avatar",
|
||
"profile_edit_desc": "Nickname, avatar image, personal data",
|
||
"profile_avatar": "Choose avatar",
|
||
"profile_avatar_desc": "Preset library or your own photo",
|
||
"section_theme": "Theme & language",
|
||
"theme": "Theme",
|
||
"theme_desc": "Light / Dark / System",
|
||
"section_notifications": "Notifications",
|
||
"notifications_push": "Push notifications",
|
||
"notifications_push_desc": "Toggle individual categories",
|
||
"notifications_streak": "Streak reminders",
|
||
"notifications_streak_desc": "Daily nudges to stay on track",
|
||
"section_devices": "Devices & subscription",
|
||
"section_lyra": "Lyra (Legend)",
|
||
"lyra_voice": "Lyra voice",
|
||
"lyra_voice_desc": "Voice picker — Legend-plan exclusive",
|
||
"lyra_voice_only_legend": "Legend plan only",
|
||
"theme_picker_title": "Choose theme",
|
||
"theme_system": "System",
|
||
"theme_light": "Light",
|
||
"theme_dark": "Dark",
|
||
"language_picker_title": "Choose language",
|
||
"language_de": "Deutsch",
|
||
"language_en": "English",
|
||
"lyra_voice_picker_title": "Choose Lyra voice",
|
||
"lyra_voice_sarah": "Sarah (warm)",
|
||
"lyra_voice_aria": "Aria (calm)",
|
||
"lyra_voice_charlotte": "Charlotte (clear)",
|
||
"lyra_voice_alice": "Alice (neutral)",
|
||
"lyra_voice_bill": "Bill (deep)",
|
||
"section_debug": "Debug",
|
||
"debug_llm": "LLM provider",
|
||
"debug_llm_desc": "Model & prompt tuning (DEV)",
|
||
"debug_tts": "TTS provider",
|
||
"debug_tts_desc": "Cartesia / ElevenLabs / Gemini (DEV)",
|
||
"debug_plan": "Override plan (DEV)",
|
||
"debug_plan_desc": "POST /api/dev/set-plan — staging only",
|
||
"devices_page_title": "Registered devices",
|
||
"devices_slots": "Device slots",
|
||
"devices_slots_desc": "Your %{plan} plan allows this many simultaneous devices.",
|
||
"devices_this_device": "This device",
|
||
"devices_since": "since",
|
||
"devices_just_now": "just active",
|
||
"devices_mins_ago": "%{count}m ago",
|
||
"devices_hours_ago": "%{count}h ago",
|
||
"devices_days_ago": "%{count}d ago",
|
||
"devices_empty": "No devices registered",
|
||
"devices_hint": "Devices you remove will re-register on next sign-in. This device cannot be removed while you are signed in.",
|
||
"devices_remove_title": "Remove device",
|
||
"devices_remove_desc": "The device slot will be freed. It can re-register on next sign-in.",
|
||
"devices_remove_confirm": "Remove",
|
||
"section_security": "Security",
|
||
"app_lock": "App lock",
|
||
"app_lock_desc": "Unlock with Face ID, Touch ID or passcode when opening",
|
||
"app_lock_unavailable": "Not available on this device",
|
||
"app_lock_desc_android": "Unlock with fingerprint, face unlock or PIN when opening"
|
||
},
|
||
"device_limit": {
|
||
"title": "Device limit reached",
|
||
"subtitle": "%{count} of %{max} device slots used (%{plan}) — remove a device to continue",
|
||
"hint": "Removed devices can re-register on next sign-in.",
|
||
"remove_cta": "Remove device"
|
||
},
|
||
"urge": {
|
||
"title": "SOS — Breathing exercise",
|
||
"step_dashboard": "Start",
|
||
"step_emotion": "Emotion",
|
||
"step_breathing": "Breathing",
|
||
"step_games": "Lyra games",
|
||
"step_result": "Reflection",
|
||
"step_done": "Done",
|
||
"feel_urge": "Feeling a strong urge right now?",
|
||
"feel_urge_desc": "We'll guide you through a short reset, step by step.",
|
||
"yes_urge": "Yes, I need help",
|
||
"just_play": "Just play",
|
||
"this_week": "This week",
|
||
"total_urges": "Urges",
|
||
"overcome_count": "Overcome",
|
||
"breathing_exercises": "Breathing sessions",
|
||
"having_urge": "You're not alone.",
|
||
"how_feeling": "How are you feeling right now?",
|
||
"emotion_stress": "Stress",
|
||
"emotion_sadness": "Sadness",
|
||
"emotion_anger": "Anger",
|
||
"emotion_empty": "Emptiness",
|
||
"emotion_boredom": "Boredom",
|
||
"emotion_other": "Other",
|
||
"lets_breathe": "Let's breathe for a minute",
|
||
"breathing_desc": "Just 3 rounds. Your mind usually feels calmer afterwards.",
|
||
"round": "Round %{current} / %{total}",
|
||
"round_simple": "Round %{current} / %{total}",
|
||
"intro": "Deep breathing helps overcome the urge.",
|
||
"inhale": "Inhale",
|
||
"hold": "Hold",
|
||
"exhale": "Exhale",
|
||
"start": "Start exercise",
|
||
"start_exercise": "Start breathing",
|
||
"skip": "Skip",
|
||
"game_offer_title": "Lyra games",
|
||
"game_offer_text": "Pick a short game. 2-3 minutes are often enough to break the urge.",
|
||
"just_play_lyra": "Need a quick focus reset? Pick a game.",
|
||
"game_memory": "Memory",
|
||
"game_tictactoe": "Tic-Tac-Toe",
|
||
"game_snake": "Snake",
|
||
"game_tetris": "Tetris",
|
||
"game_memory_desc": "Find pairs and regain focus",
|
||
"game_tictactoe_desc": "Quick duel for clear decisions",
|
||
"game_snake_desc": "Rhythm over rumination",
|
||
"game_tetris_desc": "Organize patterns, calm your mind",
|
||
"skip_games": "Skip games",
|
||
"back": "Back",
|
||
"open_lyra": "Open with Lyra",
|
||
"game_start_title": "Start game",
|
||
"game_start_desc": "%{game} will be started with Lyra.",
|
||
"how_overcome": "How did it go afterwards?",
|
||
"answer_helps": "Your answer helps you spot patterns and get stronger.",
|
||
"i_overcame": "I overcame the urge",
|
||
"i_gave_in": "I gave in",
|
||
"overcame_msg": "Strong. Every resisted urge rewires your brain.",
|
||
"gave_in_msg": "No judgment. Honesty is the start of the next win.",
|
||
"save": "Save",
|
||
"done_title": "Well done!",
|
||
"done_desc": "You completed the breathing exercise. Your nervous system has calmed down.",
|
||
"done_back": "Back",
|
||
"well_done": "Great job",
|
||
"chin_up": "Keep your head up",
|
||
"overcame_result": "You broke the urge loop. Stay close to what helps you.",
|
||
"gave_in_result": "A setback is not the end. Breathe and restart.",
|
||
"back_to_dashboard": "Back to dashboard"
|
||
},
|
||
"notifications": {
|
||
"title": "Notifications",
|
||
"empty_title": "No notifications",
|
||
"empty_subtitle": "You're all caught up.",
|
||
"mark_all_read": "Mark all as read",
|
||
"liked_post": "liked your post",
|
||
"commented_post": "commented on your post",
|
||
"voted_domain": "voted on your domain",
|
||
"domain_accepted": "is now in the global blocklist",
|
||
"domain_accepted_sub": "Tap to open your blocklist",
|
||
"domain_rejected": "was rejected and removed from your list",
|
||
"new_follower": "started following you",
|
||
"generic": "sent you a notification",
|
||
"just_now": "just now",
|
||
"min_ago": "%{n} min ago",
|
||
"hours_ago": "%{n} h ago",
|
||
"days_ago": "%{n} d ago"
|
||
},
|
||
"chat": {
|
||
"title": "Chat",
|
||
"dms": "Direct Messages",
|
||
"rooms": "Groups",
|
||
"groups": "Groups",
|
||
"direct": "Direct",
|
||
"no_chats": "No chats yet",
|
||
"no_rooms": "No groups yet",
|
||
"start_dm": "Start new DM",
|
||
"placeholder": "Write a message…",
|
||
"you": "You: ",
|
||
"just_now": "just now",
|
||
"loading": "Loading…",
|
||
"send_failed": "Failed to send message.",
|
||
"create_group": "Create group",
|
||
"create": "Create",
|
||
"room_name": "Group name",
|
||
"room_description": "Description (optional)",
|
||
"public_room": "Public group",
|
||
"join_mode": "Join mode",
|
||
"join_mode_approval": "With approval",
|
||
"join_mode_invite": "Invite only",
|
||
"join": "Join",
|
||
"join_pending": "Join request pending…",
|
||
"join_required": "Join the group to participate.",
|
||
"members": "Members",
|
||
"settings": "Settings",
|
||
"info": "Info",
|
||
"leave_room": "Leave group",
|
||
"reply": "Reply",
|
||
"reply_to": "Replying to",
|
||
"like": "Like",
|
||
"unlike": "Unlike",
|
||
"copy": "Copy",
|
||
"image_attachment": "Image",
|
||
"file_attachment": "File",
|
||
"upload_failed": "Upload failed",
|
||
"member_count": "%{n} members",
|
||
"pending_request": "Join requests",
|
||
"approve": "Approve",
|
||
"reject": "Reject",
|
||
"avatar_updated": "Group photo updated",
|
||
"send": "Send"
|
||
},
|
||
"community": {
|
||
"compose_placeholder": "What's on your mind?",
|
||
"compose_default_user": "You",
|
||
"compose_photo_perm_title": "Photo access",
|
||
"compose_photo_perm_desc": "Please allow access to your photos in iOS Settings.",
|
||
"image": "Image",
|
||
"cancel": "Cancel",
|
||
"share": "Share",
|
||
"no_posts": "Be the first to share something",
|
||
"cat_all": "All",
|
||
"cat_games": "Games",
|
||
"cat_domain": "Domain Votes",
|
||
"cat_lyra": "Lyra",
|
||
"cat_rebreak": "ReBreak",
|
||
"like": "Like",
|
||
"comment": "Comment",
|
||
"comments_title": "Comments",
|
||
"comments_empty": "No comments yet – be the first!",
|
||
"reply": "Reply",
|
||
"reply_to": "Replying to",
|
||
"send": "Send",
|
||
"comment_placeholder": "Write a comment…",
|
||
"filter": "Filter",
|
||
"published": "Published",
|
||
"post_failed": "Failed to publish post.",
|
||
"anonymous_label": "Anonymous",
|
||
"tier_starter": "Starter",
|
||
"tier_pro": "Pro",
|
||
"tier_legend": "Legend",
|
||
"bot_admin": "Admin",
|
||
"bot_ai": "AI",
|
||
"reposted_suffix": "reposted",
|
||
"domain_proposal_label": "Blocklist proposal",
|
||
"domain_added_to_blocklist": "Added to global blocklist",
|
||
"domain_added": "In the global blocklist",
|
||
"domain_proposed": "Proposed for inclusion",
|
||
"domain_vote_own": "You can't vote on your own proposal.",
|
||
"vote_yes": "Yes",
|
||
"vote_no": "No",
|
||
"vote_rejected": "Rejected",
|
||
"vote_in_review": "Under review",
|
||
"voted_thanks": "Thanks for your vote!"
|
||
},
|
||
"streak": {
|
||
"label_one": "day",
|
||
"label_other": "days",
|
||
"label_suffix": "clean"
|
||
},
|
||
"profile": {
|
||
"edit_title": "Edit profile",
|
||
"edit_save": "Save",
|
||
"edit_photo_cta": "Choose your own photo",
|
||
"edit_photo_perm_title": "Photo access",
|
||
"edit_photo_perm_desc": "Please allow access to your photos in iOS Settings.",
|
||
"edit_preset_label": "Choose avatar",
|
||
"edit_nickname_label": "Nickname",
|
||
"edit_nickname_hint": "Visible to other members — max. 32 characters.",
|
||
"crop_title": "Choose crop",
|
||
"crop_confirm": "Apply",
|
||
"crop_hint": "Move and zoom the image to select the desired crop area.",
|
||
"crop_reset": "Reset",
|
||
"streak_section_label": "STREAK",
|
||
"streak_days_protected": "days protected",
|
||
"streak_since": "since {{date}}",
|
||
"streak_longest": "Longest streak: {{days}} days",
|
||
"cooldown": {
|
||
"heading": "COOLDOWN HISTORY",
|
||
"window_label": "last {{weeks}}W",
|
||
"week_label": "W{{n}}",
|
||
"none": "No cooldowns in the last 8 weeks",
|
||
"count_one": "1 cooldown over {{weeks}} weeks",
|
||
"count_other": "{{n}} cooldowns over {{weeks}} weeks",
|
||
"avg_last": "Ø 1 every {{avg}} weeks · last {{date}}",
|
||
"patterns": {
|
||
"toggle_label": "More insights",
|
||
"hour_heading": "When do you start cooldowns?",
|
||
"day_heading": "Which days?",
|
||
"reason_heading": "Common terms",
|
||
"cancel_rate": "Cooldowns cancelled: {{pct}}%",
|
||
"not_enough": "Not enough patterns yet",
|
||
"weekday_mon": "Mon",
|
||
"weekday_tue": "Tue",
|
||
"weekday_wed": "Wed",
|
||
"weekday_thu": "Thu",
|
||
"weekday_fri": "Fri",
|
||
"weekday_sat": "Sat",
|
||
"weekday_sun": "Sun",
|
||
"hour_morning": "Morning",
|
||
"hour_afternoon": "Afternoon",
|
||
"hour_evening": "Evening",
|
||
"hour_night": "Night"
|
||
}
|
||
}
|
||
},
|
||
"demographics": {
|
||
"employment_status_employed": "employed",
|
||
"employment_status_self_employed": "self-employed",
|
||
"employment_status_in_training": "in education / training",
|
||
"employment_status_unemployed": "unemployed / job-seeking",
|
||
"employment_status_retired": "retired / pensioned",
|
||
"employment_status_homemaking": "homemaking / care work",
|
||
"employment_status_other": "other",
|
||
"industry_it_software": "IT / Software",
|
||
"industry_healthcare": "Healthcare / Medicine",
|
||
"industry_education": "Education / Teaching",
|
||
"industry_hospitality": "Hospitality / Hotels",
|
||
"industry_construction": "Construction / Trades",
|
||
"industry_banking_finance": "Banking / Finance",
|
||
"industry_sales_marketing": "Sales / Marketing",
|
||
"industry_public_admin": "Public administration",
|
||
"industry_logistics": "Logistics / Transport",
|
||
"industry_creative_media": "Creative / Media",
|
||
"industry_other": "other",
|
||
"tenure_less_1y": "less than 1 year",
|
||
"tenure_1_3y": "1-3 years",
|
||
"tenure_3_5y": "3-5 years",
|
||
"tenure_5_10y": "5-10 years",
|
||
"tenure_more_10y": "more than 10 years",
|
||
"shift_work_yes": "Yes",
|
||
"shift_work_no": "No",
|
||
"shift_work_unknown": "n/a",
|
||
"section_beruf": "EMPLOYMENT",
|
||
"section_wohnort": "LOCATION",
|
||
"field_status": "Status",
|
||
"field_shift_work": "Shift work",
|
||
"field_industry": "Industry",
|
||
"field_job_tenure": "In job since",
|
||
"field_bundesland": "State",
|
||
"field_city": "City",
|
||
"picker_employment_status": "Employment status",
|
||
"picker_industry": "Industry",
|
||
"picker_job_tenure": "Time in current job",
|
||
"picker_bundesland": "State"
|
||
},
|
||
"devices": {
|
||
"section_title_this": "This device",
|
||
"section_title_others": "Other protected devices",
|
||
"subtitle_legend": "Protection across up to 3 devices — whichever one you use.",
|
||
"subtitle_free": "Current device protected.",
|
||
"add_mac": "Add Mac",
|
||
"add_windows": "Add Windows (coming soon)",
|
||
"upgrade_cta": "Upgrade to Legend",
|
||
"status_pending": "Ready to install",
|
||
"status_active": "Active",
|
||
"status_revoked": "Removed",
|
||
"label_placeholder": "e.g. MacBook Pro",
|
||
"label_default": "MacBook Pro",
|
||
"label_question": "What should this Mac be called?",
|
||
"prepare_profile": "Prepare profile",
|
||
"lyra_intro": "Three steps. I'll walk you through each one — if something goes wrong, tap Help.",
|
||
"step_1_title": "Download the profile",
|
||
"step_1_body": "Tap the button below. If you're on your Mac, it opens the profile file directly. On your phone? You'll get a QR code — scan it on your Mac to get the file.",
|
||
"step_2_title": "Install the profile",
|
||
"step_2_body": "On the Mac: double-click the downloaded file → System Settings opens → \"Install Profile\" → enter your Mac password → done.",
|
||
"step_3_title": "Use a standard account",
|
||
"step_3_body": "Important: use a standard account on the Mac, not admin. If you ever have an urgent need to remove the profile, you'll need the admin password — ideally held by someone you trust (partner, friend). That's the real protection layer.",
|
||
"step_4_title": "Done",
|
||
"step_4_body": "Once you've installed it, tap \"I've installed it\" — then I'll count the Mac as a protected device.",
|
||
"download_button": "Download profile to Mac",
|
||
"confirm_installed": "I've installed it ✓",
|
||
"need_help": "I need help",
|
||
"success_title": "Mac protected!",
|
||
"success_body": "You can add more devices whenever you like.",
|
||
"remove_warning_title": "Remove profile manually",
|
||
"remove_warning_body": "We can't delete the profile remotely. On the Mac: System Settings → Profiles → ReBreak → Remove (admin password required).",
|
||
"add_windows_enabled": "Add Windows PC",
|
||
"windows_label_question": "What should this Windows PC be called?",
|
||
"windows_label_default": "Windows PC",
|
||
"windows_label_placeholder": "e.g. Gaming PC",
|
||
"windows_lyra_intro": "Five quick steps. I'll walk you through each one — if something goes wrong, tap Help.",
|
||
"windows_step_1_title": "Download the file",
|
||
"windows_step_1_body": "Tap the button below — on your Windows PC. The .reg file will be downloaded.",
|
||
"windows_step_2_title": "Run the .reg file",
|
||
"windows_step_2_body": "Double-click the downloaded .reg file. Windows will ask: 'Do you want to add keys to the registry?' → Click 'Yes'.",
|
||
"windows_step_3_title": "Confirm UAC prompt",
|
||
"windows_step_3_body": "If a blue UAC prompt appears: click 'Yes'. This is the admin confirmation.",
|
||
"windows_step_4_title": "Activate DNS",
|
||
"windows_step_4_body": "Open Windows Settings → Network & Internet → click your Wi-Fi → DNS server assignment → 'Edit' → choose 'Encrypted only (DNS over HTTPS)' → select 'rebreak-...' from the list.",
|
||
"windows_step_5_title": "Done",
|
||
"windows_step_5_body": "Once you've saved the DNS selection, tap 'I've installed it' and I'll count your PC as a protected device.",
|
||
"windows_download_button": "Download file to Windows PC",
|
||
"windows_success_title": "Windows PC protected!",
|
||
"windows_success_body": "You can add more devices whenever you like.",
|
||
"windows_remove_warning_body": "We can't delete the registry entry remotely. On the PC: Regedit → HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\DoHSvc → remove the key."
|
||
},
|
||
"plan": {
|
||
"change": {
|
||
"header_upgrade": "You're switching to {{to}}.",
|
||
"header_downgrade": "You're switching from {{from}} to {{to}}.",
|
||
"section_gains": "What you're getting",
|
||
"section_keeps": "What stays the same",
|
||
"section_changes": "What changes",
|
||
"downgrade_reassurance": "Your core protection keeps running.",
|
||
"downgrade_no_delete_title": "Nothing gets deleted.",
|
||
"downgrade_no_delete_body": "Everything paused comes back immediately when you upgrade again.",
|
||
"downgrade_recovery_note": "If this change weakens your protection at a moment when you feel uncertain — write to Lyra. Or write to us. We'll find a solution.",
|
||
"billing_hint": "Manage your subscription at rebreak.org.",
|
||
"grace_days_one": "expires in {{count}} day",
|
||
"grace_days_other": "expires in {{count}} days",
|
||
"cta_confirm_upgrade": "Let's go",
|
||
"cta_confirm_downgrade": "Got it, continue",
|
||
"cta_stay": "Stay on {{plan}}",
|
||
"action_keep": "stays",
|
||
"action_limited": "will be limited",
|
||
"action_paused": "will be paused",
|
||
"action_grace": "Grace period",
|
||
"action_degraded": "protection ending",
|
||
"action_unlocked": "unlocked"
|
||
}
|
||
},
|
||
"plan_limit": {
|
||
"mail_banner_title": "Mailboxes over plan limit",
|
||
"mail_banner_body_one": "You have {{used}} mailbox, {{plan}} protects {{max}} — {{over}} is paused.",
|
||
"mail_banner_body_other": "You have {{used}} mailboxes, {{plan}} protects {{max}} — {{over}} are paused.",
|
||
"mail_account_paused": "Paused (plan downgrade)",
|
||
"mail_add_disabled_hint": "Remove a mailbox first or upgrade.",
|
||
"blocker_domain_over_limit": "You have {{used}} custom domains, {{plan}} allows {{max}} — all stay active, you can't add new ones until you're under {{max}}.",
|
||
"blocker_add_disabled_hint": "Remove a domain first or upgrade.",
|
||
"blocker_basic_protection": "Basic protection active — full protection against all known gambling sites: Pro/Legend.",
|
||
"device_degraded_title": "Protection expired",
|
||
"device_degraded_body": "The profile is still installed on the device. Remove it manually or get Legend back.",
|
||
"device_add_limit_hint": "All {{max}} device slots are used. Remove a device or upgrade.",
|
||
"device_add_limit_short": "Limit reached"
|
||
},
|
||
"gameOver": {
|
||
"title": "Game over",
|
||
"score": "Score",
|
||
"best": "Best",
|
||
"newBest": "New best",
|
||
"retry": "Play again",
|
||
"exit": "Exit",
|
||
"motivational_0": "You gave yourself a short break. That counts.",
|
||
"motivational_1": "Every minute of focus is a minute for you.",
|
||
"motivational_2": "Training your attention — that's exactly what you just did.",
|
||
"motivational_3": "Well played. And good that you're here.",
|
||
"motivational_4": "Small pauses, big impact.",
|
||
"lyra_title_record": "New record!",
|
||
"lyra_body_record": "You surpassed yourself. Impressive.",
|
||
"lyra_title_good": "Excellent!",
|
||
"lyra_body_good": "You were fully in the zone — the urge had no chance.",
|
||
"lyra_title_ok": "Keep going",
|
||
"lyra_body_ok": "Every round moves you forward. Stay with it.",
|
||
"lyra_title_low": "Next time",
|
||
"lyra_body_low": "Showing up already counts. You've got this.",
|
||
"rating_saved": "Rating saved",
|
||
"save_rating": "Save rating",
|
||
"feedback_placeholder": "What did you like or miss?",
|
||
"share_result": "Share to community",
|
||
"share_to_community": "Share your result",
|
||
"share_challenge": "Can you beat this?",
|
||
"share_loading": "Lyra is writing...",
|
||
"post_to_community": "Post",
|
||
"posted": "Posted to the community feed",
|
||
"post_error": "Posting failed, please try again"
|
||
},
|
||
"alert": {
|
||
"error_generic": "Something went wrong — please try again.",
|
||
"error_file_too_large": "The image is too large.",
|
||
"details_label": "Details",
|
||
"compress_error_title": "Could not process image"
|
||
}
|
||
}
|