Sheets via neuer KeyboardAwareSheet-Composable (in Modal pattern, auto-grow mit Tastatur, paddingBottom-Lift): EditMail, AddDomain, CreateRoom, ConnectMail. GameOverScreen behält Spring-Slide-In, nutzt RN Keyboard.addListener für Lift. - KeyboardAwareSheet.tsx — universal modal with sheet-grow + keyboard-padding - react-native-keyboard-controller installiert + KeyboardProvider in Root - Snake: time + ScoreProgressBar + useSnakeSounds (haptic, audio TODO) - Tetris: title weg, Buttons zentriert, kein Pressable mit style-fn - DPad-Buttons 60→48, more bg, no scale - useMe: pub-sub listener pattern für app-weite avatar/nickname-Updates - dm.tsx: resolveAvatar wrap (iron.png-Warning) - Mail-error-humanizer + locales Recovery-Doc-Update in docs/internal/RECOVERY_LOG_2026-05-10.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
751 lines
34 KiB
JSON
751 lines
34 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": "Get started",
|
||
"version": "v0.1.0 — RN Migration Phase 1 Skeleton"
|
||
},
|
||
"splash": {
|
||
"tagline": "You will never walk alone!",
|
||
"subtitle": "Together we'll make it.",
|
||
"madeInGermany": "Made in Germany"
|
||
},
|
||
"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",
|
||
"activate_app_lock_failed_title": "Could not activate App Lock",
|
||
"activate_app_lock_failed_msg": "Screen Time 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": "Family access active",
|
||
"layers_app_lock_subtitle_inactive": "Prevents you from deleting ReBreak 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": "How does the cooldown work?"
|
||
},
|
||
"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",
|
||
"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_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 the IMAP credentials of your email provider. 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 is currently unreachable. Check your internet connection or try again later.",
|
||
"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": "Unknown error while connecting. Please check the app password and 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",
|
||
"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)",
|
||
"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"
|
||
},
|
||
"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."
|
||
},
|
||
"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"
|
||
},
|
||
"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"
|
||
}
|
||
}
|