<?php
return [
// Relative time strings used by app.js formatting helpers.
'time.soon' => 'Soon',
'time.in_hours' => 'In {count} hour{suffix}',
'time.tomorrow' => 'Tomorrow',
'time.in_days' => 'In {count} days',
'time.just_now' => 'Just now',
'time.minutes_ago' => '{count} minutes ago',
'time.hours_ago' => '{count} hour{suffix} ago',
'time.yesterday' => 'Yesterday',
'time.days_ago' => '{count} days ago',
'time.suffix_plural' => 's',
'time.suffix_singular' => '',
// Shared/common UI defaults.
'errors.failed_load_messages' => 'Failed to load messages',
'messages.none_found' => 'No messages found',
'messages.no_subject' => '(No Subject)',
'ui.common.success' => 'Success',
'ui.common.error' => 'Error',
'ui.common.unknown_error' => 'Unknown error',
'ui.common.saving' => 'Saving...',
'ui.common.copy_failed_manual' => 'Copy to clipboard failed. Please copy manually.',
'ui.common.copy_not_supported_manual' => 'Copy to clipboard not supported. Please copy manually.',
'ui.common.loading' => 'Loading...',
'ui.common.loading_messages' => 'Loading messages...',
'ui.common.loading_message' => 'Loading message...',
'ui.common.search' => 'Search',
'ui.common.search_messages' => 'Search Messages',
'ui.common.import' => 'Import',
'ui.common.search_placeholder' => 'Search...',
'ui.common.search_messages_placeholder' => 'Search messages...',
'ui.common.advanced_search' => 'Advanced Search',
'ui.common.advanced_search.title' => 'Advanced Search',
'ui.common.advanced_search.from_name' => 'From / Poster Name',
'ui.common.advanced_search.from_name_placeholder' => 'Search by poster...',
'ui.common.advanced_search.subject' => 'Subject',
'ui.common.advanced_search.subject_placeholder' => 'Search by subject...',
'ui.common.advanced_search.body' => 'Message Body',
'ui.common.advanced_search.body_placeholder' => 'Search in message body...',
'ui.common.advanced_search.help' => 'Fill in one or more fields. Fields are combined with AND logic.',
'ui.common.advanced_search.date_from' => 'Date From',
'ui.common.advanced_search.date_to' => 'Date To',
'ui.common.advanced_search.date_range' => 'Date Range',
'ui.common.advanced_search.fill_one_field' => 'Please fill in at least one field (minimum 2 characters for text fields).',
'ui.common.advanced_search.message_id' => 'Message ID',
'ui.common.advanced_search.message_id_placeholder' => 'Search by message ID...',
'ui.cron_builder.open_builder' => 'Build schedule',
'ui.cron_builder.field.minute' => 'Minute',
'ui.cron_builder.field.hour' => 'Hour',
'ui.cron_builder.field.day' => 'Day',
'ui.cron_builder.field.month' => 'Month',
'ui.cron_builder.field.weekday' => 'Weekday',
'ui.cron_builder.hint.minute' => '0?59',
'ui.cron_builder.hint.hour' => '0?23',
'ui.cron_builder.hint.day' => '1?31',
'ui.cron_builder.hint.month' => '1?12',
'ui.cron_builder.hint.weekday' => '0?6 (0=Sun)',
'ui.cron_builder.desc.every_minute' => 'Runs every minute',
'ui.cron_builder.desc.every_n_minutes' => 'Runs every {n} minutes',
'ui.cron_builder.desc.every_hour_at_minute' => 'Runs every hour at minute {min}',
'ui.cron_builder.desc.every_n_hours_at_minute' => 'Runs every {n} hours at minute {min}',
'ui.cron_builder.desc.daily_at' => 'Runs daily at {time}',
'ui.cron_builder.desc.weekly_on' => 'Runs weekly on {day} at {time}',
'ui.cron_builder.desc.monthly_on_day' => 'Runs monthly on day {dom} at {time}',
'ui.cron_builder.desc.every_n_hours' => 'Runs every {n} hours',
'ui.cron_builder.desc.every_n_minutes_every_m_hours' => 'Runs every {n} minutes, every {m} hours',
'ui.cron_builder.desc.every_n_days_at' => 'Runs every {n} days at {time}',
'ui.cron_builder.desc.on_days_at' => 'Runs on {days} at {time}',
'ui.cron_builder.desc.weekdays' => 'weekdays',
'ui.cron_builder.desc.weekends' => 'weekends',
'ui.cron_builder.desc.yearly_on' => 'Runs on {month} {dom} at {time}',
'ui.cron_builder.desc.custom' => 'Custom schedule',
'ui.common.all' => 'All',
'ui.common.all_messages' => 'All Messages',
'ui.common.unread' => 'Unread',
'ui.common.read' => 'Read',
'ui.common.sent' => 'Sent',
'ui.common.drafts' => 'Drafts',
'ui.common.has_attachment' => 'Has attachment',
'ui.common.select' => 'Select',
'ui.common.selected' => 'Selected',
'ui.common.total' => 'Total',
'ui.common.recent' => 'Recent',
'ui.common.statistics' => 'Statistics',
'ui.common.manage' => 'Manage',
'ui.common.mark_as_read' => 'Mark as Read',
'ui.common.message' => 'Message',
'ui.common.delete' => 'Delete',
'ui.common.confirm_delete' => 'Confirm Delete',
'ui.common.edit' => 'Edit',
'ui.common.close' => 'Close',
'ui.common.refresh' => 'Refresh',
'ui.common.hostname' => 'Hostname',
'ui.common.port' => 'Port',
'ui.common.password' => 'Password',
'ui.common.show_password' => 'Show password',
'ui.common.hide_password' => 'Hide password',
'ui.common.reply' => 'Reply',
'ui.common.repost' => 'Re-Post',
'ui.common.forward_by_netmail' => 'Forward by Netmail',
'ui.common.username' => 'Username',
'ui.common.real_name' => 'Real Name',
'ui.common.email' => 'Email',
'ui.common.email_address' => 'Email Address',
'ui.common.location' => 'Location',
'ui.common.address' => 'Address',
'ui.common.domain' => 'Domain',
'ui.common.ip_address' => 'IP Address',
'ui.common.status' => 'Status',
'ui.common.time' => 'Time',
'ui.common.subject' => 'Subject',
'ui.common.from' => 'From',
'ui.common.actions' => 'Actions',
'ui.common.view' => 'View',
'ui.common.active' => 'Active',
'ui.common.inactive' => 'Inactive',
'ui.common.none' => 'None',
'ui.common.disabled' => 'Disabled',
'ui.common.user' => 'User',
'ui.common.admin' => 'Admin',
'ui.common.created' => 'Created',
'ui.common.last_login' => 'Last Login',
'ui.common.today' => 'Today',
'ui.common.one_day_ago' => '1 day ago',
'ui.common.days_ago' => '{count} days ago',
'ui.common.enable' => 'Enable',
'ui.common.disable' => 'Disable',
'ui.common.previous' => 'Previous',
'ui.common.next' => 'Next',
'ui.common.go_back' => 'Go Back',
'ui.common.previous_message' => 'Previous message',
'ui.common.next_message' => 'Next message',
'ui.common.toggle_fullscreen' => 'Toggle fullscreen',
'ui.common.print' => 'Print message',
'ui.common.add' => 'Add',
'ui.common.cancel' => 'Cancel',
'ui.common.apply' => 'Apply',
'ui.common.back' => 'Back',
'ui.common.clear_search' => 'Clear Search',
'ui.common.save' => 'Save',
'ui.common.save_changes' => 'Save Changes',
'ui.common.saved' => 'Saved!',
'ui.common.saved_short' => 'Saved',
'ui.common.error_click_retry' => 'Error - click to retry',
'ui.common.share' => 'Share',
'ui.common.browse' => 'Browse',
'ui.common.share_url' => 'Share URL:',
'ui.common.copy' => 'Copy',
'ui.common.optional' => 'optional',
'ui.common.never' => 'Never',
'ui.common.unknown' => 'Unknown',
'ui.common.not_configured' => 'Not configured',
'ui.common.name' => 'Name',
'ui.common.title' => 'Title',
'ui.common.description' => 'Description',
'ui.common.enabled' => 'Enabled',
'ui.common.label' => 'Label',
'ui.common.url' => 'URL',
'ui.common.new_tab' => 'New Tab',
'ui.common.key' => 'Key',
'ui.common.id' => 'ID',
'ui.common.preview' => 'Preview',
'ui.common.yes' => 'Yes',
'ui.common.no' => 'No',
'ui.common.not_applicable' => 'n/a',
'ui.common.sort.newest_first' => 'Newest First',
'ui.common.sort.oldest_first' => 'Oldest First',
'ui.common.sort.by_subject' => 'By Subject',
'ui.common.sort.by_author' => 'By Author',
'ui.common.threading.show_threaded' => 'Show Threaded',
'ui.common.threading.show_flat' => 'Show Flat',
'ui.common.show_entire_conversation' => 'Show Entire Conversation',
'ui.common.showing_entire_conversation' => 'Showing Entire Conversation',
'ui.common.back_to_message_list' => 'Back to Message List',
'ui.common.view_conversation' => 'View Conversation',
'ui.common.download_message' => 'Download Message',
'ui.common.forward_to_me_by_email' => 'Forward to me by EMail',
'ui.common.forwarded_to_email' => 'Message forwarded to your email',
'ui.common.from_label' => 'From:',
'ui.common.to_label' => 'To:',
'ui.common.date_label' => 'Date:',
'ui.common.subject_label' => 'Subject:',
'ui.common.subject_label_short' => 'Subject',
'ui.common.area_label' => 'Area:',
'ui.common.sent_prefix' => 'Sent:',
'ui.common.received_prefix' => 'Received:',
'ui.common.written_prefix' => 'Written:',
'ui.common.shared' => 'Shared',
'ui.common.remove_from_saved' => 'Remove from saved',
'ui.common.save_for_later' => 'Save for later',
'ui.echomail.ignore.open_action' => 'Ignore message',
'ui.echomail.ignore.modal_title' => 'Ignore Echomail Message',
'ui.echomail.ignore.help' => 'Messages will be hidden when the sender matches exactly and the subject contains this text. Leave the subject blank to block this sender entirely.',
'ui.echomail.ignore.sender_label' => 'Sender (name and node)',
'ui.echomail.ignore.subject_contains_label' => 'Subject contains',
'ui.echomail.ignore.save_button' => 'Ignore message',
'ui.echomail.ignore.saved' => 'Messages from {sender} with matching subject text will now be hidden',
'ui.echomail.ignore.removed' => 'Ignore rule removed',
'ui.common.delete_message' => 'Delete message',
'ui.common.delete_draft' => 'Delete draft',
'ui.common.already_in_address_book' => 'Already in address book',
'ui.common.save_to_address_book' => 'Save to address book',
'ui.common.file_attachments_with_count' => 'File Attachments ({count})',
'ui.common.send_netmail_to' => 'Send netmail to {name}',
'ui.common.replies_with_count' => '{count} replies',
'ui.common.unknown_size' => 'Unknown size',
'ui.common.kludge_lines' => 'Kludge Lines',
'ui.common.show_kludge_lines' => 'Show Kludge Lines',
'ui.common.hide_kludge_lines' => 'Hide Kludge Lines',
'ui.common.no_kludge_lines_found' => 'No kludge lines found',
'ui.common.time.1_hour' => '1 hour',
'ui.common.time.24_hours' => '24 hours',
'ui.common.time.1_week' => '1 week',
'ui.common.time.30_days' => '30 days',
// About Page
'ui.about.title' => 'About',
'ui.about.about_system' => 'About {system_name}',
'ui.about.system_name' => 'System Name',
'ui.about.sysop' => 'Sysop',
'ui.about.network_addresses' => 'Network Addresses',
'ui.about.fidonet_address' => 'Fidonet Address',
'ui.about.software' => 'Software',
'ui.about.links' => 'Links',
'ui.about.house_rules' => 'House Rules',
'ui.footer.powered_by' => 'Powered by',
'ui.footer.registered_to' => 'Registered to {name}',
// 403 Page
'ui.error403.title' => 'Registered Feature',
'ui.error403.heading' => 'This feature requires registration',
'ui.error403.description' => 'This page is only available to registered installations. Visit the Licensing page to learn more about registration and the benefits it provides.',
'ui.error403.licensing_link' => 'Licensing',
// 404 Page
'ui.error404.title' => 'Page Not Found',
'ui.error404.description' => "The page you're looking for doesn't exist or has been moved to another location.",
'ui.error404.requested_prefix' => 'Requested:',
'ui.error404.dashboard' => 'Dashboard',
'ui.error404.go_back' => 'Go Back',
'ui.error404.contact_sysop' => 'If you believe this is an error, please contact the System Operator.',
// Generic Error Page
'ui.error.title' => 'Error',
'ui.error.not_found' => 'Not Found',
'ui.error.access_error' => 'Access Error',
'ui.error.processing_request_failed' => 'An error occurred while processing your request.',
'ui.error.return_to_dashboard' => 'Return to Dashboard',
'ui.web.errors.binkp_admin_only' => 'Only administrators can access BinkP functionality.',
'ui.web.errors.chat_disabled' => 'Sorry, chat is not enabled.',
'ui.web.errors.user_management_admin_only' => 'Only administrators can access user management.',
'ui.web.errors.profile_user_not_found' => 'User not found or inactive.',
'ui.web.errors.echoareas_admin_only' => 'Only administrators can manage echo areas.',
'ui.web.errors.fileareas_admin_only' => 'Only administrators can manage file areas.',
'ui.web.errors.files_feature_disabled' => 'File areas are disabled.',
'ui.web.errors.polls_disabled' => 'Voting booth is disabled.',
'ui.web.errors.shoutbox_disabled' => 'Shoutbox is disabled.',
'ui.web.errors.compose_type_invalid' => 'Invalid compose destination.',
'ui.web.errors.not_found' => 'The page you requested could not be found.',
'ui.web.fallback.system_name' => 'BinktermPHP System',
// Base Layout / Navigation
'ui.base.update_available' => 'Update Available',
'ui.base.new_version_ready' => 'A new version is ready',
'ui.base.reload_now' => 'Reload Now',
'ui.base.messaging' => 'Messaging',
'ui.base.netmail' => 'Netmail',
'ui.base.echomail' => 'Echomail',
'ui.base.email_link' => 'E-mail',
'ui.base.local_chat' => 'Local Chat',
'ui.base.mrc_chat' => 'MRC Chat',
'ui.base.doors_games' => 'Doors',
'ui.base.files' => 'Files',
'ui.base.file_approvals' => 'File Approvals',
'ui.base.nodelist' => 'Nodelist',
'ui.base.admin' => 'Admin',
'ui.base.profile' => 'Profile',
'ui.base.settings' => 'Settings',
'ui.base.subscriptions' => 'Subscriptions',
'ui.base.logout' => 'Logout',
'ui.base.login' => 'Login',
'ui.base.guest_doors' => 'Guest Doors',
'ui.base.public_files' => 'Public Files',
'ui.base.admin.whos_online' => "Who's Online",
'ui.base.admin.dashboard' => 'Dashboard',
'ui.base.admin.binkp_status' => 'Binkp Status',
'ui.base.admin.manage_users' => 'Manage Users',
'ui.base.admin.ads' => 'Content Library',
'ui.base.admin.ads_menu' => 'Ads and Bulletins',
'ui.base.admin.ad_campaigns' => 'Broadcast Manager',
'ui.base.admin.area_management' => 'Area Management',
'ui.base.admin.echo_areas' => 'Echo Areas',
'ui.base.admin.file_areas' => 'File Areas',
'ui.base.admin.file_approvals' => 'File Approvals',
'ui.base.admin.file_area_rules' => 'File Area Rules',
'ui.base.admin.subscriptions' => 'Subscriptions',
'ui.base.admin.auto_feed' => 'Auto Feed',
'ui.base.admin.chat' => 'Chat',
'ui.base.admin.chat_rooms' => 'Chat Rooms',
'ui.base.admin.mrc_settings' => 'MRC Settings',
'ui.base.admin.packet_bbs' => 'Packet BBS Nodes',
'ui.base.admin.polls' => 'Polls',
'ui.base.admin.shoutbox' => 'Shoutbox',
'ui.base.admin.weather_config' => 'Weather Report',
'ui.base.admin.doors' => 'Doors',
'ui.base.admin.doors_dos' => 'DOS Doors',
'ui.base.admin.doors_native' => 'Native Doors',
'ui.base.admin.doors_web' => 'Web Doors',
'ui.base.admin.doors_jsdos' => 'JS-DOS Doors',
'ui.base.admin.analytics' => 'Analytics',
'ui.base.admin.community' => 'Community',
'ui.base.admin.registered_feature' => 'Registered Feature',
'ui.base.admin.activity_stats' => 'Activity Statistics',
'ui.base.admin.ad_analytics' => 'Ad Analytics',
'ui.base.admin.sse_test' => 'BinkStream Test',
'ui.base.admin.ai_usage' => 'AI Usage',
'ui.base.admin.ai_bots' => 'AI Bots',
'ui.base.admin.ai_settings' => 'AI Settings',
'ui.base.admin.sharing' => 'Sharing',
'ui.base.admin.economy_viewer' => 'Economy Viewer',
'ui.base.admin.referrals' => 'Referral Analytics',
'ui.base.admin.licensing' => 'Licensing',
'ui.base.admin.bbs_settings' => 'BBS Settings',
'ui.base.admin.appearance' => 'Appearance',
'ui.base.admin.binkp_configuration' => 'Binkp Configuration',
'ui.base.admin.template_editor' => 'Template Editor',
'ui.base.admin.i18n_overrides' => 'Language Overrides',
'ui.base.admin.docs' => 'Documentation',
'ui.admin.docs.title' => 'Documentation',
'ui.admin.docs.back_to_index' => 'Back to Index',
'ui.admin.docs.not_found' => 'Document not found.',
'ui.base.admin.help' => 'Help',
'ui.base.admin.readme' => 'README',
'ui.base.admin.faq' => 'FAQ',
'ui.base.admin.upgrade_notes' => 'Upgrade Notes v{version}',
'ui.base.admin.claudes_bbs' => "Claude's BBS",
'ui.base.admin.report_issue' => 'Report Issue',
'ui.base.admin.register' => 'Register BinktermPHP',
// Admin Licensing
'ui.admin.licensing.page_title' => 'Licensing',
'ui.admin.licensing.heading' => 'Licensing',
'ui.admin.licensing.current_status' => 'Current License Status',
'ui.admin.licensing.upload_heading' => 'Install or Replace License',
'ui.admin.licensing.upload_help' => 'Paste the contents of your license.json below or upload a license.json / ZIP file. The license will be verified before being saved.',
'ui.admin.licensing.license_json_label' => 'License JSON',
'ui.admin.licensing.license_file_label' => 'License File',
'ui.admin.licensing.license_file_help' => 'Accepts a license.json file or a ZIP archive containing license.json.',
'ui.admin.licensing.upload_missing_input' => 'Please paste the license JSON or choose a license.json / ZIP file.',
'ui.admin.licensing.invalid_json_prefix' => 'Invalid JSON: {message}',
'ui.admin.licensing.upload_btn' => 'Install License',
'ui.admin.licensing.remove_btn' => 'Remove License',
'ui.admin.licensing.tiers_heading' => 'License Tiers',
'ui.admin.licensing.tier_col' => 'Tier',
'ui.admin.licensing.access_col' => 'Description',
'ui.admin.licensing.tier_community' => 'Community',
'ui.admin.licensing.tier_community_desc' => 'Full BBS, netmail, echomail, and packet processing. Free for everyone.',
'ui.admin.licensing.tier_registered' => 'Registered',
'ui.admin.licensing.tier_registered_desc' => 'Advanced admin tools, supporter badge.',
'ui.admin.licensing.tier_sponsor' => 'Sponsor',
'ui.admin.licensing.tier_sponsor_desc' => 'All registered features plus priority support.',
'ui.admin.licensing.how_to_heading' => 'Why Register?',
'ui.admin.licensing.why_intro' => 'BinktermPHP is open source and the community edition is fully functional. Registration is how sysops who find value in the project can support its continued development.',
'ui.admin.licensing.why_sustain' => 'Sustain development ? registration directly supports bug fixes, new features, and protocol compatibility work.',
'ui.admin.licensing.why_branding' => 'Unlock branding control ? present a fully branded experience without BinktermPHP attribution in the footer.',
'ui.admin.licensing.why_features' => 'Access premium tools ? registered installations receive new premium features automatically as they are released.',
'ui.admin.licensing.why_perpetual' => 'Perpetual license ? register once. No subscription or recurring fee.',
'ui.admin.licensing.remove_confirm' => 'Remove the current license file? The system will revert to Community Edition.',
'ui.admin.licensing.how_to_register_link' => 'How to Register',
'ui.admin.licensing.register_modal_title' => 'Register BinktermPHP',
// Admin Users
'ui.admin_users.pending_users_error' => 'Pending users error:',
'ui.admin_users.pending_users_load_failed_prefix' => 'Failed to load pending users: ',
'ui.admin_users.all_users_error' => 'All users error:',
'ui.admin_users.users_load_failed_prefix' => 'Failed to load users: ',
'ui.admin_users.processing' => 'Processing...',
'ui.admin_users.user_approved_success' => 'User approved successfully!',
'ui.admin_users.user_rejected_success' => 'User rejected successfully!',
'ui.admin_users.user_action_failed_prefix' => 'Failed to {action} user: ',
'ui.admin_users.user_action_failed_short' => 'Failed to {action} user',
'ui.admin_users.success_prefix' => 'Success: ',
'ui.admin_users.error_prefix' => 'Error: ',
'ui.admin_users.user_data_load_failed_prefix' => 'Failed to load user data: ',
'ui.admin_users.password_min_length' => 'Password must be at least 8 characters long',
'ui.admin_users.user_updated_success' => 'User updated successfully!',
'ui.admin_users.user_update_failed_prefix' => 'Failed to update user: ',
'ui.admin_users.user_toggle_confirm' => 'Are you sure you want to {action} this user?',
'ui.admin_users.user_toggled_success' => 'User {action}d successfully!',
'ui.admin_users.required_fields' => 'Username, real name, and password are required',
'ui.admin_users.username_validation' => 'Username must be 3-20 characters, letters, numbers, and underscores only',
'ui.admin_users.creating' => 'Creating...',
'ui.admin_users.user_created_success' => 'User created successfully!',
'ui.admin_users.user_create_failed_prefix' => 'Failed to create user: ',
'ui.admin_users.user_create_failed' => 'Failed to create user',
'ui.admin_users.cleanup_confirm' => 'This will remove all approved registration records and old rejected registrations (30+ days). Are you sure?',
'ui.admin_users.cleaning' => 'Cleaning...',
'ui.admin_users.cleanup_success' => 'Cleanup completed! Removed {approved} approved and {rejected} old rejected registrations ({total} total).',
'ui.admin_users.cleanup_failed_prefix' => 'Failed to cleanup registrations: ',
'ui.admin_users.send_reminder_confirm' => 'Send account reminder to {username}? This will send a reminder message via netmail and email (if available).',
'ui.admin_users.reminder_sent_netmail_email_suffix' => ' (sent via netmail and email)',
'ui.admin_users.reminder_sent_netmail_only_suffix' => ' (sent via netmail only)',
'ui.admin_users.send_reminder_failed_prefix' => 'Failed to send reminder: ',
'ui.admin_users.send_reminder_failed' => 'Failed to send reminder',
'ui.admin_users.no_reminders_needed' => 'No users currently need account reminders. All users have logged in!',
'ui.admin_users.reminders_found_header' => "Found {count} user(s) who haven't logged in yet:\n\n",
'ui.admin_users.reminder_user_line' => '- {username} ({real_name}) - created {created_date}' . "\n",
'ui.admin_users.no_real_name' => 'No real name',
'ui.admin_users.reminders_found_footer' => "\nYou can send individual reminders using the \"Remind\" buttons in the user list below.",
'ui.admin_users.reminders_load_failed_prefix' => 'Failed to load users needing reminders: ',
'ui.admin_users.page_title' => 'User Management',
'ui.admin_users.heading' => 'User Management',
'ui.admin_users.create_new_user' => 'Create New User',
'ui.admin_users.need_reminders' => 'Need Reminders',
'ui.admin_users.cleanup' => 'Cleanup',
'ui.admin_users.pending_registrations' => 'Pending Registrations',
'ui.admin_users.loading_pending_registrations' => 'Loading pending registrations...',
'ui.admin_users.all_users' => 'All Users',
'ui.admin_users.search_users_placeholder' => 'Search users...',
'ui.admin_users.per_page_25' => '25 per page',
'ui.admin_users.per_page_50' => '50 per page',
'ui.admin_users.per_page_100' => '100 per page',
'ui.admin_users.loading_users' => 'Loading users...',
'ui.admin_users.approve_user' => 'Approve User',
'ui.admin_users.admin_notes' => 'Admin Notes',
'ui.admin_users.optional_notes_placeholder' => 'Optional notes about this decision...',
'ui.admin_users.approve' => 'Approve',
'ui.admin_users.reject' => 'Reject',
'ui.admin_users.create_user' => 'Create User',
'ui.admin_users.edit_user' => 'Edit User',
'ui.admin_users.account_is_active' => 'Account is active',
'ui.admin_users.inactive_cannot_login' => 'Inactive users cannot log in',
'ui.admin_users.admin_privileges' => 'Administrator privileges',
'ui.admin_users.admin_privileges_help' => 'Admins can manage users and system settings',
'ui.admin_users.is_system_account' => 'Is System Account',
'ui.admin_users.is_system_account_help' => 'System accounts are hidden from the normal user list and reserved for internal or service use.',
'ui.admin_users.email_optional_help' => 'Optional - for account recovery and notifications',
'ui.admin_users.min_8_characters' => 'Minimum 8 characters',
'ui.admin_users.username_cannot_change' => 'Username cannot be changed',
'ui.admin_users.real_name_cannot_change' => 'Real name cannot be changed',
'ui.admin_users.new_password' => 'New Password',
'ui.admin_users.new_password_help' => 'Leave blank to keep current password. Minimum 8 characters if changing.',
'ui.admin_users.no_pending_registrations' => 'No pending registrations',
'ui.admin_users.requested' => 'Requested',
'ui.admin_users.source' => 'Source',
'ui.admin_users.last_reminded' => 'Last Reminded',
'ui.admin_users.not_provided' => 'Not provided',
'ui.admin_users.view_profile' => 'View Profile',
'ui.admin_users.send_account_reminder' => 'Send account reminder',
'ui.admin_users.remind' => 'Remind',
'ui.admin_users.referred_by' => 'Referred By:',
'ui.admin_users.basic_information' => 'Basic Information',
'ui.admin_users.request_details' => 'Request Details',
'ui.admin_users.reason_for_joining' => 'Reason for joining:',
'ui.admin_users.no_reason_provided' => 'No reason provided',
'ui.admin_users.user_agent' => 'User Agent:',
'ui.admin_users.not_available' => 'Not available',
'ui.admin_users.user_details' => 'User Details',
'ui.admin_users.approve_user_registration' => 'Approve User Registration',
'ui.admin_users.reject_user_registration' => 'Reject User Registration',
'ui.admin_users.users_pagination_aria' => 'Users pagination',
'ui.admin_users.showing_users_range' => 'Showing {start}-{end} of {total} users',
// Admin Appearance
'ui.admin.appearance.load_failed_prefix' => 'Failed to load appearance config: ',
'ui.admin.appearance.save_failed' => 'Save failed',
'ui.admin.appearance.reset_menu_confirm' => 'Reset menu items to default?',
'ui.admin.appearance.shell_saved_reload' => 'Saved! Reload the page to see the new shell.',
'ui.admin.appearance.upload_failed_prefix' => 'Upload failed: ',
'ui.admin.appearance.delete_shell_art_confirm' => 'Delete {name}?',
'ui.admin.appearance.delete_failed_prefix' => 'Delete failed: ',
'ui.admin.appearance.error_prefix' => 'Error: ',
'ui.admin.appearance.request_failed' => 'Request failed',
'ui.admin.appearance.page_title' => 'Appearance & Content - Admin',
'ui.admin.appearance.heading' => 'Appearance & Content',
'ui.admin.appearance.tab_dashboard' => 'Dashboard',
'ui.admin.appearance.tab_branding' => 'Branding',
'ui.admin.appearance.tab_content' => 'Content',
'ui.admin.appearance.tab_navigation' => 'Navigation',
'ui.admin.appearance.tab_seo' => 'SEO & Public',
'ui.admin.appearance.tab_shell' => 'Shell',
'ui.admin.appearance.tab_login' => 'Login',
'ui.admin.appearance.tab_term_server' => 'Term Server',
'ui.admin.appearance.tab_message_reader' => 'Message Reader',
'ui.admin.appearance.tab_file_areas' => 'File Areas',
'ui.admin.appearance.invalid_hex_color' => 'Invalid hex color',
'ui.admin.appearance.no_content' => 'No content',
'ui.admin.appearance.preview' => 'Preview',
'ui.admin.appearance.preview_failed' => 'Preview failed',
'ui.admin.appearance.branding.title' => 'Branding',
'ui.admin.appearance.branding.accent_color' => 'Accent Color',
'ui.admin.appearance.branding.pick_accent_color' => 'Pick accent color',
'ui.admin.appearance.branding.reset' => 'Reset',
'ui.admin.appearance.branding.accent_help' => 'Override the primary navigation and button color site-wide. Leave blank for default.',
'ui.admin.appearance.branding.default_theme' => 'Default Theme',
'ui.admin.appearance.branding.system_default' => '(System default)',
'ui.admin.appearance.branding.default_theme_help' => 'Theme applied to all users by default.',
'ui.admin.appearance.branding.lock_theme' => 'Lock theme (prevent users from overriding)',
'ui.admin.appearance.branding.logo_url' => 'Logo URL',
'ui.admin.appearance.branding.logo_url_help' => 'URL to a logo image shown in the navbar. Leave blank to use the system name text.',
'ui.admin.appearance.branding.footer_text' => 'Footer Text',
'ui.admin.appearance.branding.footer_placeholder' => 'Leave blank for default node/sysop line',
'ui.admin.appearance.branding.footer_help' => 'Custom text for the footer. Leave blank for the default system information line.',
'ui.admin.appearance.branding.hide_powered_by' => 'Hide "Powered by BinktermPHP" footer line',
'ui.admin.appearance.branding.hide_powered_by_help' => 'Remove the BinktermPHP attribution line from the site footer. Requires a valid license.',
'ui.admin.appearance.branding.show_registration_badge' => 'Show registration status in footer',
'ui.admin.appearance.branding.show_registration_badge_help' => 'Display "Registered to [system name]" in the site footer. Requires a valid license with the registered_badge feature.',
'ui.admin.appearance.branding.premium_branding_locked' => 'Custom footer text and branding options are available to registered installations.',
'ui.admin.appearance.branding.premium_branding_register' => 'Register ?',
'ui.admin.appearance.branding.save' => 'Save Branding',
'ui.admin.appearance.content.system_news_title' => 'System News (MOTD)',
'ui.admin.appearance.content.system_news_placeholder' => 'Enter system news in Markdown format...',
'ui.admin.appearance.content.system_news_help' => 'Supports Markdown. Shown on the dashboard. Leave blank to show the built-in default or custom systemnews.twig.',
'ui.admin.appearance.content.house_rules_title' => 'House Rules',
'ui.admin.appearance.content.house_rules_placeholder' => 'Enter house rules in Markdown format...',
'ui.admin.appearance.content.house_rules_help' => 'Supports Markdown. Displayed in the House Rules modal linked from the footer.',
'ui.admin.appearance.content.site_announcement_title' => 'Site Announcement',
'ui.admin.appearance.content.show_announcement_banner' => 'Show announcement banner',
'ui.admin.appearance.content.announcement_text' => 'Announcement Text',
'ui.admin.appearance.content.type' => 'Type',
'ui.admin.appearance.content.type_info' => 'Info (blue)',
'ui.admin.appearance.content.type_success' => 'Success (green)',
'ui.admin.appearance.content.type_warning' => 'Warning (yellow)',
'ui.admin.appearance.content.type_danger' => 'Danger (red)',
'ui.admin.appearance.content.type_primary' => 'Primary',
'ui.admin.appearance.content.expires_at_optional' => 'Expires At (optional)',
'ui.admin.appearance.content.expires_help' => 'Leave blank to never expire.',
'ui.admin.appearance.content.dismissible' => 'Dismissible',
'ui.admin.appearance.content.save' => 'Save Content',
'ui.admin.appearance.navigation.title' => 'Custom Navigation Links',
'ui.admin.appearance.navigation.add_link' => 'Add Link',
'ui.admin.appearance.navigation.help' => 'Up to 3 links appear inline in the navbar; 4 or more are grouped into a "Links" dropdown.',
'ui.admin.appearance.navigation.url_placeholder' => '/page or https://...',
'ui.admin.appearance.navigation.save' => 'Save Navigation',
'ui.admin.appearance.seo.title' => 'SEO & Public Pages',
'ui.admin.appearance.seo.enable_about_page' => 'Enable /about public page',
'ui.admin.appearance.seo.about_page_help' => 'When enabled, a publicly accessible /about page shows your system info and house rules. Disabled returns 404.',
'ui.admin.appearance.seo.site_description' => 'Site Description',
'ui.admin.appearance.seo.max_300_chars' => '(max 300 chars)',
'ui.admin.appearance.seo.description_help' => 'Used in meta description and OG tags for search engines and link previews.',
'ui.admin.appearance.seo.og_image_url' => 'OG Image URL',
'ui.admin.appearance.seo.og_image_placeholder' => 'https://example.com/preview.png',
'ui.admin.appearance.seo.og_image_help' => 'Image shown when your site is shared on social media. Should be at least 1200x630px.',
'ui.admin.appearance.seo.save' => 'Save SEO Settings',
'ui.admin.appearance.shell.title' => 'Interface Shell',
'ui.admin.appearance.shell.default_interface_style' => 'Default Interface Style',
'ui.admin.appearance.shell.web_interface' => 'Web Interface',
'ui.admin.appearance.shell.web_interface_help' => 'Full navbar, dropdown menus, standard web layout',
'ui.admin.appearance.shell.bbs_menu' => 'BBS Menu',
'ui.admin.appearance.shell.bbs_menu_help' => 'Minimal header, hotkey navigation, card/text/ANSI menu',
'ui.admin.appearance.shell.lock_shell' => 'Lock shell (prevent users from overriding in their settings)',
'ui.admin.appearance.shell.bbs_menu_config' => 'BBS Menu Configuration',
'ui.admin.appearance.shell.menu_variant' => 'Menu Variant',
'ui.admin.appearance.shell.variant_cards' => 'Card Grid',
'ui.admin.appearance.shell.variant_text' => 'Terminal Text',
'ui.admin.appearance.shell.variant_ansi' => 'ANSI Art',
'ui.admin.appearance.shell.ansi_art_file' => 'ANSI Art File',
'ui.admin.appearance.shell.ansi_art_size' => 'ANSI Art Size',
'ui.admin.appearance.shell.ansi_art_size_help' => 'Choose the canvas size passed to the ANSI renderer for the BBS menu art.',
'ui.admin.appearance.shell.ansi_art_size_full' => 'Full Screen',
'ui.admin.appearance.shell.none_selected' => '(none selected)',
'ui.admin.appearance.shell.ansi_file_help' => 'Select an uploaded .ans file to display above the menu.',
'ui.admin.appearance.shell.upload_ans' => 'Upload .ans',
'ui.admin.appearance.shell.max_512_kb' => 'Max 512 KB.',
'ui.admin.appearance.shell.delete_selected' => 'Delete Selected',
'ui.admin.appearance.shell.menu_items' => 'Menu Items',
'ui.admin.appearance.shell.menu_items_help' => 'Define the hotkeys and destinations for the main menu.',
'ui.admin.appearance.shell.icon' => 'Icon',
'ui.admin.appearance.shell.icon_help' => '(Font Awesome name)',
'ui.admin.appearance.shell.icon_placeholder' => 'envelope',
'ui.admin.appearance.shell.add_item' => 'Add Item',
'ui.admin.appearance.shell.reset_to_defaults' => 'Reset to Defaults',
'ui.admin.appearance.shell.save' => 'Save Shell Settings',
'ui.admin.appearance.shell.could_not_load_file_list' => 'Could not load file list.',
'ui.admin.appearance.shell.uploading' => 'Uploading...',
'ui.admin.appearance.shell.uploaded_prefix' => 'Uploaded: ',
'ui.admin.appearance.shell.deleted_prefix' => 'Deleted: ',
'ui.admin.appearance.login.title' => 'Login Screen',
'ui.admin.appearance.login.help' => 'Choose how the shared login page is displayed for every shell. ANSI mode renders your art first, then appends the username, password, and registration prompts below it.',
'ui.admin.appearance.login.display_mode' => 'Display Mode',
'ui.admin.appearance.login.mode_standard' => 'Standard Form',
'ui.admin.appearance.login.mode_ansi_prompt' => 'ANSI Screen + Prompt',
'ui.admin.appearance.login.display_mode_help' => 'Use the normal login card or show ANSI art with the login prompt appended at the end.',
'ui.admin.appearance.login.ansi_art_size' => 'ANSI Art Size',
'ui.admin.appearance.login.ansi_art_size_help' => 'Choose the canvas size passed to the ANSI renderer for the login art.',
'ui.admin.appearance.login.ansi_content' => 'ANSI Login Art',
'ui.admin.appearance.login.ansi_placeholder' => 'Paste ANSI login art here...',
'ui.admin.appearance.login.ansi_help' => 'Use the ANSI editor to build the shared login screen shown before the prompt.',
'ui.admin.appearance.login.preview_title' => 'Login Screen Preview',
'ui.admin.appearance.term_server.title' => 'Terminal Server Screens',
'ui.admin.appearance.term_server.help' => 'Manage the built-in ANSI screens used by the telnet and SSH terminal server.',
'ui.admin.appearance.term_server.screen_slot' => 'Screen Slot',
'ui.admin.appearance.term_server.upload' => 'Upload Screen File',
'ui.admin.appearance.term_server.reset_default' => 'Reset to Default',
'ui.admin.appearance.term_server.placeholder' => 'Paste ANSI or text screen content here...',
'ui.admin.appearance.term_server.editor_help' => 'Supported slots map to the terminal server screens it already knows how to display.',
'ui.admin.appearance.term_server.default_active' => 'default',
'ui.admin.appearance.term_server.list_failed' => 'Failed to load terminal screens',
'ui.admin.appearance.term_server.load_failed' => 'Failed to load terminal screen',
'ui.admin.appearance.term_server.save_failed' => 'Failed to save terminal screen',
'ui.admin.appearance.term_server.uploading' => 'Uploading...',
'ui.admin.appearance.term_server.upload_failed' => 'Failed to upload terminal screen',
'ui.admin.appearance.term_server.delete_failed' => 'Failed to reset terminal screen',
'ui.admin.appearance.term_server.reset_confirm' => 'Reset this terminal screen to the default behavior?',
'ui.admin.appearance.term_server.screen.welcome' => 'Welcome',
'ui.admin.appearance.term_server.screen.welcome_help' => 'Shown when a user first connects to the terminal server.',
'ui.admin.appearance.term_server.screen.main_menu' => 'Main Menu',
'ui.admin.appearance.term_server.screen.main_menu_help' => 'Shown behind the terminal main menu after login.',
'ui.admin.appearance.term_server.screen.goodbye' => 'Goodbye',
'ui.admin.appearance.term_server.screen.goodbye_help' => 'Shown when a user disconnects from the terminal server.',
'ui.admin.appearance.term_menu_keys.title' => 'Main Menu Keys',
'ui.admin.appearance.term_menu_keys.help' => 'Assign a single letter or digit to each terminal main menu action. Leave a key blank to remove that option from the menu. Ensure your mainmenu.ans matches the keys configured here.',
'ui.admin.appearance.term_menu_keys.reset_defaults' => 'Reset to Defaults',
'ui.admin.appearance.term_menu_keys.col_action' => 'Action',
'ui.admin.appearance.term_menu_keys.col_key' => 'Key',
'ui.admin.appearance.term_menu_keys.col_default' => 'Default',
'ui.admin.appearance.term_menu_keys.quit_required_notice' => 'Quit must always have a key assigned.',
'ui.admin.appearance.term_menu_keys.action.netmail' => 'Netmail',
'ui.admin.appearance.term_menu_keys.action.echomail' => 'Echomail',
'ui.admin.appearance.term_menu_keys.action.shoutbox' => 'Shoutbox',
'ui.admin.appearance.term_menu_keys.action.bulletins' => 'Bulletins',
'ui.admin.appearance.term_menu_keys.action.polls' => 'Polls',
'ui.admin.appearance.term_menu_keys.action.doors' => 'Door Games',
'ui.admin.appearance.term_menu_keys.action.files' => 'Files',
'ui.admin.appearance.term_menu_keys.action.settings' => 'Settings',
'ui.admin.appearance.term_menu_keys.action.interests' => 'Interests',
'ui.admin.appearance.term_menu_keys.action.whosonline' => 'Who\'s Online',
'ui.admin.appearance.term_menu_keys.action.qwk' => 'QWK Offline Mail',
'ui.admin.appearance.term_menu_keys.action.bbslist' => 'BBS Directory',
'ui.admin.appearance.term_menu_keys.action.nodelist' => 'Node List',
'ui.admin.appearance.term_menu_keys.action.localchat' => 'Local Chat',
'ui.admin.appearance.term_menu_keys.action.quit' => 'Quit',
'ui.admin.appearance.term_border.title' => 'Border Style',
'ui.admin.appearance.term_border.help' => 'Choose the box-drawing style used for frames and borders in the terminal server. Styles that require characters outside the selected character set will automatically fall back to a compatible style.',
'ui.admin.appearance.term_border.label' => 'Style',
'ui.admin.appearance.term_border.charset_note' => 'Heavy and Rounded require a UTF-8 capable terminal. Shadow requires Unicode. ASCII is always safe for any terminal.',
'ui.admin.appearance.term_border.style.classic' => 'Classic (double corners, single sides)',
'ui.admin.appearance.term_border.style.double' => 'Double (full double-line)',
'ui.admin.appearance.term_border.style.single' => 'Single (thin single-line)',
'ui.admin.appearance.term_border.style.heavy' => 'Heavy (bold single-line, UTF-8)',
'ui.admin.appearance.term_border.style.rounded' => 'Rounded (curved corners, UTF-8)',
'ui.admin.appearance.term_border.style.minimal' => 'Minimal (top/bottom rule only)',
'ui.admin.appearance.term_border.style.mixed' => 'Mixed (double horizontal, single vertical)',
'ui.admin.appearance.term_border.style.shadow' => 'Shadow (classic + drop shadow)',
'ui.admin.appearance.term_border.style.ascii' => 'ASCII (safe for all terminals)',
'ui.admin.appearance.sixel.title' => 'Sixel Graphics',
'ui.admin.appearance.sixel.help' => 'Upload sixel image files to display on sixel-capable terminal clients. These are shown instead of the ANSI screen when the connecting client supports sixel graphics.',
'ui.admin.appearance.sixel.upload' => 'Upload Sixel File',
'ui.admin.appearance.sixel.delete' => 'Remove',
'ui.admin.appearance.sixel.not_installed' => 'not installed',
'ui.admin.appearance.sixel.sixel_clients_only' => '(Sixel-capable clients only.)',
'ui.admin.appearance.sixel.delete_confirm' => 'Remove this sixel screen?',
'ui.admin.appearance.sixel.list_failed' => 'Failed to load sixel screens',
'ui.admin.appearance.sixel.upload_failed' => 'Failed to upload sixel screen',
'ui.admin.appearance.sixel.delete_failed' => 'Failed to delete sixel screen',
'ui.ansi_editor.insert_escape_prefix' => 'Insert ESC[',
'ui.ansi_editor.insert_sequence' => 'Insert Sequence',
'ui.ansi_editor.select_sequence' => 'Select ANSI sequence',
'ui.ansi_editor.custom_sequence' => 'Custom ANSI sequence',
'ui.ansi_editor.custom_sequence_placeholder' => 'e.g. 10;20H or 44m',
'ui.ansi_editor.preview_panel' => 'Preview',
'ui.ansi_editor.preview_empty' => 'Nothing to preview yet.',
'ui.ansi_editor.cheatsheet_title' => 'ANSI Cheatsheet',
'ui.ansi_editor.insert_file' => 'Insert File',
'ui.ansi_editor.cheatsheet_help' => 'Use these sequences in the editor. ESC means the escape character (ASCII 27).',
'ui.ansi_editor.cheatsheet_sequence' => 'Sequence',
'ui.ansi_editor.cheatsheet_description' => 'Description',
'ui.ansi_editor.cheatsheet_preview' => 'Preview',
'ui.ansi_editor.group.formatting' => 'Formatting',
'ui.ansi_editor.group.foreground' => 'Text Colors',
'ui.ansi_editor.group.background' => 'Background Colors',
'ui.ansi_editor.group.cursor' => 'Screen and Cursor',
'ui.ansi_editor.sequence_reset' => 'Reset (ESC[0m)',
'ui.ansi_editor.sequence_bold' => 'Bold (ESC[1m)',
'ui.ansi_editor.sequence_blink' => 'Blink (ESC[5m)',
'ui.ansi_editor.sequence_reverse' => 'Reverse Video (ESC[7m)',
'ui.ansi_editor.sequence_fg_black' => 'Black (ESC[30m)',
'ui.ansi_editor.sequence_fg_red' => 'Red (ESC[31m)',
'ui.ansi_editor.sequence_fg_green' => 'Green (ESC[32m)',
'ui.ansi_editor.sequence_fg_yellow' => 'Yellow (ESC[33m)',
'ui.ansi_editor.sequence_fg_blue' => 'Blue (ESC[34m)',
'ui.ansi_editor.sequence_fg_magenta' => 'Magenta (ESC[35m)',
'ui.ansi_editor.sequence_fg_cyan' => 'Cyan (ESC[36m)',
'ui.ansi_editor.sequence_fg_white' => 'White (ESC[37m)',
'ui.ansi_editor.sequence_bg_black' => 'Black Background (ESC[40m)',
'ui.ansi_editor.sequence_bg_red' => 'Red Background (ESC[41m)',
'ui.ansi_editor.sequence_bg_green' => 'Green Background (ESC[42m)',
'ui.ansi_editor.sequence_bg_yellow' => 'Yellow Background (ESC[43m)',
'ui.ansi_editor.sequence_bg_blue' => 'Blue Background (ESC[44m)',
'ui.ansi_editor.sequence_bg_magenta' => 'Magenta Background (ESC[45m)',
'ui.ansi_editor.sequence_bg_cyan' => 'Cyan Background (ESC[46m)',
'ui.ansi_editor.sequence_bg_white' => 'White Background (ESC[47m)',
'ui.ansi_editor.sequence_clear_screen' => 'Clear Screen (ESC[2J)',
'ui.ansi_editor.sequence_clear_line' => 'Clear Line (ESC[K)',
'ui.ansi_editor.sequence_cursor_home' => 'Cursor Home (ESC[H)',
'ui.ansi_editor.sequence_cursor_save' => 'Save Cursor (ESC[s)',
'ui.ansi_editor.sequence_cursor_restore' => 'Restore Cursor (ESC[u)',
'ui.ansi_editor.sequence_cursor_up' => 'Cursor Up (ESC[1A)',
'ui.ansi_editor.sequence_cursor_down' => 'Cursor Down (ESC[1B)',
'ui.ansi_editor.sequence_cursor_right' => 'Cursor Right (ESC[1C)',
'ui.ansi_editor.sequence_cursor_left' => 'Cursor Left (ESC[1D)',
'ui.ansi_editor.example_position' => 'Position Cursor (ESC[10;20H)',
'ui.admin.appearance.default_menu.messages' => 'Messages',
'ui.admin.appearance.default_menu.netmail' => 'Netmail',
'ui.admin.appearance.default_menu.files' => 'Files',
'ui.admin.appearance.default_menu.games_doors' => 'Games & Doors',
'ui.admin.appearance.default_menu.settings' => 'Settings',
'ui.admin.appearance.message_reader.title' => 'Message Reader',
'ui.admin.appearance.message_reader.layout' => 'Layout',
'ui.admin.appearance.message_reader.scrollable_body' => 'Scrollable message body',
'ui.admin.appearance.message_reader.scrollable_body_help' => 'When enabled, the message header (From, To, Subject, Date) remains fixed at the top while the message body scrolls independently. When disabled, the entire modal scrolls together (default behavior).',
'ui.admin.appearance.message_reader.email_link_url' => 'E-mail link URL',
'ui.admin.appearance.message_reader.email_link_url_placeholder' => 'https://mail.example.com/',
'ui.admin.appearance.message_reader.email_link_url_help' => 'Optional link shown in the Messaging menu directly under Echomail.',
'ui.admin.appearance.message_reader.discord_url' => 'Discord',
'ui.admin.appearance.message_reader.discord_url_placeholder' => 'https://discord.gg/...',
'ui.admin.appearance.message_reader.discord_url_help' => 'Optional Discord invite link shown in the Messaging menu.',
'ui.admin.appearance.message_reader.save' => 'Save Message Reader Settings',
// Appearance - File Areas tab
'ui.admin.appearance.file_areas.title' => 'File Areas',
'ui.admin.appearance.file_areas.help' => 'Add custom information to the file area pages. Markdown is supported. Leave blank to show nothing.',
'ui.admin.appearance.file_areas.sidebar_section' => 'Sidebar Info Panel',
'ui.admin.appearance.file_areas.sidebar_info_title' => 'Panel title',
'ui.admin.appearance.file_areas.sidebar_info_title_placeholder' => 'e.g. Upload Policy',
'ui.admin.appearance.file_areas.sidebar_info_title_help' => 'Optional heading shown at the top of the sidebar info panel. Leave blank to display no heading.',
'ui.admin.appearance.file_areas.sidebar_info_markdown' => 'Sidebar content (Markdown)',
'ui.admin.appearance.file_areas.sidebar_info_markdown_placeholder' => "**Upload ratio:** 1:3 ? for every 1 MB uploaded you may download 3 MB.",
'ui.admin.appearance.file_areas.sidebar_info_markdown_help' => 'Markdown shown in a card on the right-hand sidebar of the file area. Leave blank to hide the panel.',
'ui.admin.appearance.file_areas.footer_section' => 'Footer',
'ui.admin.appearance.file_areas.footer_markdown' => 'Footer content (Markdown)',
'ui.admin.appearance.file_areas.footer_markdown_placeholder' => "DMCA contact: dmca@example.com",
'ui.admin.appearance.file_areas.footer_markdown_help' => 'Markdown shown in a card below the file list. Useful for DMCA notices, upload ratio policies, or other notices. Leave blank to hide the footer.',
'ui.admin.appearance.file_areas.save' => 'Save File Areas Settings',
// Appearance - Dashboard tab
'ui.admin.appearance.dashboard.title' => 'Default Dashboard Layout',
'ui.admin.appearance.dashboard.description' => 'Configure the default card layout shown to users who have not customized their dashboard. Cards with feature or admin requirements will only appear for users with access.',
'ui.admin.appearance.dashboard.drag_hint' => 'Drag cards between columns to set the default layout.',
'ui.admin.appearance.dashboard.main_column' => 'Main Column',
'ui.admin.appearance.dashboard.sidebar_column' => 'Sidebar Column',
'ui.admin.appearance.dashboard.hidden_column' => 'Hidden by Default',
'ui.admin.appearance.dashboard.required_badge' => 'Required',
'ui.admin.appearance.dashboard.admin_badge' => 'Admin Only',
'ui.admin.appearance.dashboard.save' => 'Save Dashboard Layout',
'ui.admin.appearance.dashboard.reset' => 'Reset to Defaults',
'ui.admin.appearance.dashboard.reset_confirm' => 'Reset dashboard layout to system defaults?',
'ui.admin.appearance.dashboard.saving' => 'Saving...',
// Appearance - Splash Pages tab
'ui.admin.appearance.tab_splash' => 'Splash Pages',
'ui.admin.appearance.splash.title' => 'Custom Splash Pages',
'ui.admin.appearance.splash.help' => 'Add custom content that appears above the login and registration forms. Supports Markdown. Leave blank to show nothing.',
'ui.admin.appearance.splash.login_label' => 'Login Page Splash',
'ui.admin.appearance.splash.login_help' => 'Displayed above the login form on /login.',
'ui.admin.appearance.splash.register_label' => 'Registration Page Splash',
'ui.admin.appearance.splash.register_help' => 'Displayed above the registration form on /register.',
'ui.admin.appearance.splash.placeholder' => '## Welcome\n\nThis is a **custom splash** message.',
'ui.admin.appearance.splash.locked_heading' => 'Registered Feature',
'ui.admin.appearance.splash.locked_description' => 'Custom splash pages are available to registered installations.',
// Admin Binkp Config
'ui.admin.binkp_config.load_failed' => 'Failed to load config',
'ui.admin.binkp_config.save_failed' => 'Failed to save config',
'ui.admin.binkp_config.reload_confirm' => 'Reload binkp daemon configuration? This will send SIGHUP to the daemon.',
'ui.admin.binkp_config.reload_failed' => 'Failed to reload config',
'ui.admin.binkp_config.remove_uplink_confirm' => 'Remove this uplink?',
'ui.admin.binkp_config.page_title' => 'Binkp Configuration',
'ui.admin.binkp_config.heading' => 'Binkp Configuration',
'ui.admin.binkp_config.restart_notice' => 'After saving, restart the daemons to apply changes.',
'ui.admin.binkp_config.save_configuration' => 'Save Configuration',
'ui.admin.binkp_config.reload_config' => 'Reload Config',
'ui.admin.binkp_config.reload_title' => 'Reload configuration without restarting daemon',
'ui.admin.binkp_config.config_not_loaded' => 'Config not loaded.',
'ui.admin.binkp_config.configuration_saved' => 'Configuration saved.',
'ui.admin.binkp_config.reloading' => 'Reloading configuration...',
'ui.admin.binkp_config.reloaded_success' => 'Configuration reloaded successfully. Daemon has picked up changes.',
'ui.admin.binkp_config.current' => 'current',
'ui.admin.binkp_config.system.title' => 'System',
'ui.admin.binkp_config.system.system_name' => 'System Name',
'ui.admin.binkp_config.system.system_address' => 'System Address',
'ui.admin.binkp_config.system.sysop_name' => 'Sysop Name',
'ui.admin.binkp_config.system.select_admin_user' => 'Select an admin user.',
'ui.admin.binkp_config.system.location' => 'Location',
'ui.admin.binkp_config.system.timezone' => 'Timezone',
'ui.admin.binkp_config.system.origin_line' => 'Origin Line',
'ui.admin.binkp_config.binkp.title' => 'Binkp',
'ui.admin.binkp_config.binkp.timeout_seconds' => 'Timeout (seconds)',
'ui.admin.binkp_config.binkp.max_connections' => 'Max Connections',
'ui.admin.binkp_config.binkp.outbound_queue_timer' => 'Outbound Queue Timer (minutes)',
'ui.admin.binkp_config.binkp.outbound_queue_timer_help' => 'When outbound packets are queued, the scheduler tries once immediately and then waits this long before trying again.',
'ui.admin.binkp_config.binkp.bind_address' => 'Bind Address',
'ui.admin.binkp_config.binkp.preserve_processed_packets' => 'Preserve Processed Packets',
'ui.admin.binkp_config.binkp.preserve_sent_packets' => 'Preserve Sent Packets',
'ui.admin.binkp_config.security.title' => 'Security',
'ui.admin.binkp_config.security.allow_insecure_inbound' => 'Allow Insecure Inbound',
'ui.admin.binkp_config.security.insecure_receive_only' => 'Insecure Receive Only',
'ui.admin.binkp_config.security.insecure_allow_freq' => 'Allow FREQs During Insecure Sessions',
'ui.admin.binkp_config.security.require_allowlist_for_insecure' => 'Require Allowlist For Insecure',
'ui.admin.binkp_config.security.max_insecure_sessions_per_hour' => 'Max Insecure Sessions / Hour',
'ui.admin.binkp_config.security.allow_plaintext_fallback' => 'Allow Plaintext Fallback',
'ui.admin.binkp_config.crashmail.title' => 'Crashmail',
'ui.admin.binkp_config.crashmail.enable_crashmail' => 'Enable Crashmail',
'ui.admin.binkp_config.crashmail.max_attempts' => 'Max Attempts',
'ui.admin.binkp_config.crashmail.retry_interval_minutes' => 'Retry Interval (minutes)',
'ui.admin.binkp_config.crashmail.use_nodelist_for_routing' => 'Use Nodelist For Routing',
'ui.admin.binkp_config.crashmail.fallback_port' => 'Fallback Port',
'ui.admin.binkp_config.crashmail.allow_insecure_crash_delivery' => 'Allow Insecure Crash Delivery',
'ui.admin.binkp_config.uplinks.title' => 'Uplinks',
'ui.admin.binkp_config.uplinks.add_uplink' => 'Add Uplink',
'ui.admin.binkp_config.uplinks.edit_uplink' => 'Edit Uplink',
'ui.admin.binkp_config.uplinks.not_found' => 'Uplink not found.',
'ui.admin.binkp_config.uplinks.none_configured' => 'No uplinks configured.',
'ui.admin.binkp_config.uplinks.check_failed' => 'Connectivity check failed',
'ui.admin.binkp_config.uplinks.check_success' => 'Connectivity check succeeded',
'ui.admin.binkp_config.uplinks.real_name' => 'Real Name',
'ui.admin.binkp_config.uplinks.username' => 'Username',
'ui.admin.binkp_config.uplinks.table.me' => 'Me',
'ui.admin.binkp_config.uplinks.table.uplink' => 'Uplink',
'ui.admin.binkp_config.uplinks.table.domain' => 'Domain',
'ui.admin.binkp_config.uplinks.table.host' => 'Host',
'ui.admin.binkp_config.uplinks.table.schedule' => 'Schedule',
'ui.admin.binkp_config.uplinks.table.status' => 'Status',
'ui.admin.binkp_config.uplinks.table.enabled' => 'Enabled',
'ui.admin.binkp_config.uplinks.table.disabled' => 'Disabled',
'ui.admin.binkp_config.uplinks.table.default' => 'Default',
'ui.admin.binkp_config.uplinks.table.actions' => 'Actions',
'ui.admin.binkp_config.uplinks.modal.uplink' => 'Uplink',
'ui.admin.binkp_config.uplinks.modal.me_address' => 'Me Address',
'ui.admin.binkp_config.uplinks.modal.uplink_address' => 'Uplink Address',
'ui.admin.binkp_config.uplinks.modal.domain' => 'Domain',
'ui.admin.binkp_config.uplinks.modal.binkp_session_password' => 'BinkP Session Password',
'ui.admin.binkp_config.uplinks.modal.packet_password' => 'Packet Password',
'ui.admin.binkp_config.uplinks.modal.packet_password_help' => 'FTN .pkt header password (max 8 chars)',
'ui.admin.binkp_config.uplinks.modal.tic_password' => 'TIC Password',
'ui.admin.binkp_config.uplinks.modal.tic_password_help' => 'Default TIC file password; overridden per file area',
'ui.admin.binkp_config.uplinks.modal.areafix_password' => 'AreaFix Password',
'ui.admin.binkp_config.uplinks.modal.areafix_password_help' => 'Password for the AreaFix robot at this uplink (echomail subscription management)',
'ui.admin.binkp_config.uplinks.modal.filefix_password' => 'FileFix Password',
'ui.admin.binkp_config.uplinks.modal.filefix_password_help' => 'Password for the FileFix robot at this uplink (file echo subscription management)',
'ui.admin.binkp_config.uplinks.modal.poll_schedule' => 'Poll Schedule',
'ui.admin.binkp_config.uplinks.modal.poll_schedule_help' => 'Keep polling infrequent. Use at least 1 hour, or at least 4 hours for hubs that crash mail to us. When an uplink crash-mails to us, it will push mail immediately, so polling is mainly a catch-up in case something went wrong.',
'ui.admin.binkp_config.uplinks.modal.networks_one_per_line' => 'Networks (one per line)',
'ui.admin.binkp_config.uplinks.modal.feature_flags' => 'Feature Flags',
'ui.admin.binkp_config.uplinks.modal.allow_markup' => 'Allow Markup',
'ui.admin.binkp_config.uplinks.modal.allow_markup_help' => 'Enables Markup support (Markdown, StyleCodes, etc.) on compatible/supporting networks',
'ui.admin.binkp_config.uplinks.modal.allow_media' => 'Allow Inline Media',
'ui.admin.binkp_config.uplinks.modal.allow_media_help' => 'Allow inline media embeds (YouTube, SoundCloud, etc.) when reading messages from this network',
'ui.admin.binkp_config.uplinks.modal.posting_name_policy' => 'Posting Name Policy',
'ui.admin.binkp_config.uplinks.modal.send_domain' => 'Send @Domain In ADR',
'ui.admin.binkp_config.uplinks.modal.send_domain_help' => 'Include the @Domain portion when sending the ADR address to this uplink',
'ui.admin.binkp_config.uplinks.modal.enabled_help' => 'Enables this uplink for normal routing, polling, and outbound delivery',
'ui.admin.binkp_config.uplinks.modal.compression' => 'Compression',
'ui.admin.binkp_config.uplinks.modal.compression_help' => 'Requests compressed transfers when the remote system supports them',
'ui.admin.binkp_config.uplinks.modal.crypt' => 'Crypt',
'ui.admin.binkp_config.uplinks.modal.crypt_help' => 'Uses CRAM-MD5 style authentication for this uplink when supported',
'ui.admin.binkp_config.uplinks.modal.default_help' => 'Marks this as the default uplink when no more specific route matches',
'ui.admin.binkp_config.uplinks.modal.allow_insecure_echomail' => 'Allow insecure echomail delivery',
'ui.admin.binkp_config.uplinks.modal.allow_insecure_echomail_help' => 'Allow this node to deliver echomail without authenticating. Use when the remote system does not support passwords but is a trusted uplink.',
'ui.admin.binkp_config.uplinks.modal.default_charset' => 'Default Charset Override',
'ui.admin.binkp_config.uplinks.modal.default_charset_help' => 'When set, outgoing messages via this uplink use this charset instead of the BBS-wide default. Leave blank to use the BBS default.',
'ui.admin.binkp_config.uplinks.modal.charset_use_bbs_default' => 'Use BBS default',
'ui.admin.binkp_config.uplinks.modal.save_uplink' => 'Save Uplink',
'ui.admin.binkp_config.validation.system_required' => 'System name, address, and sysop are required.',
'ui.admin.binkp_config.validation.port_range' => 'Binkp port must be between 1 and 65535.',
'ui.admin.binkp_config.validation.timeout_positive' => 'Binkp timeout must be a positive number.',
'ui.admin.binkp_config.validation.max_connections_positive' => 'Max connections must be a positive number.',
'ui.admin.binkp_config.validation.outbound_queue_timer_positive' => 'Outbound queue timer must be a positive number of minutes.',
'ui.admin.binkp_config.validation.uplink_hostname_required' => 'Uplink hostname is required.',
'ui.admin.binkp_config.validation.uplink_port_range' => 'Uplink port must be between 1 and 65535.',
// Admin Ads
'ui.admin.ads.load_failed_with_status' => 'Failed to load ads ({status})',
'ui.admin.ads.load_failed' => 'Failed to load ads',
'ui.admin.ads.select_file_to_upload' => 'Select an advertisement file to upload, or enter a content command.',
'ui.admin.ads.upload_failed_with_status' => 'Upload failed ({status})',
'ui.admin.ads.uploaded' => 'Advertisement uploaded.',
'ui.admin.ads.upload_failed' => 'Upload failed',
'ui.admin.ads.form_hidden_warning' => 'A browser extension appears to be hiding parts of this form. If fields are missing, disable content blocking for this admin page.',
'ui.admin.ads.delete_confirm' => 'Delete {name}?',
'ui.admin.ads.delete_failed_with_status' => 'Delete failed ({status})',
'ui.admin.ads.deleted' => 'Advertisement deleted.',
'ui.admin.ads.delete_failed' => 'Delete failed',
'ui.admin.ads.create_dynamic_failed' => 'Failed to create dynamic ad',
'ui.admin.ads.unexpected_response' => 'Unexpected response ({status})',
'ui.admin.ads.page_title' => 'Content Library',
'ui.admin.ads.heading' => 'Content Library',
'ui.admin.ads.library_info' => 'Manage ANSI advertisements in the library. Imported legacy ads remain available here for dashboard display and auto-post selection.',
'ui.admin.ads.info_text_prefix' => 'Upload ANSI ads (`.ans`) to the',
'ui.admin.ads.info_text_suffix' => 'directory. Ads are displayed randomly on the dashboard.',
'ui.admin.ads.upload_new' => 'Upload New Content',
'ui.admin.ads.ansi_file' => 'Advertisement File (.ans, .rip, .six, .txt)',
'ui.admin.ads.ansi_content' => 'ANSI Content',
'ui.admin.ads.slug_optional' => 'Slug (optional)',
'ui.admin.ads.slug' => 'Slug',
'ui.admin.ads.tags' => 'Tags',
'ui.admin.ads.tags_placeholder' => 'general, door, network',
'ui.admin.ads.dashboard_weight' => 'Dashboard Weight',
'ui.admin.ads.dashboard_priority' => 'Dashboard Priority',
'ui.admin.ads.show_on_dashboard' => 'Show as Ad on Dashboard',
'ui.admin.ads.allow_auto_post' => 'Allow Auto-Post',
'ui.admin.ads.content_command' => 'Content Command',
'ui.admin.ads.content_command_help' => 'Select a script to generate the post body dynamically. If set, static content is ignored. The post is skipped if the script exits non-zero or produces no output.',
'ui.admin.ads.content_command_upload_help' => 'Use instead of a file to generate content dynamically at post time.',
'ui.admin.ads.content_command_none' => 'None (static content only)',
'ui.admin.ads.content_command_args' => 'Arguments',
'ui.admin.ads.content_command_invalid_stored' => 'This ad has a content command that is no longer allowed. Please select a valid command or clear it.',
'ui.admin.ads.insert_escape_prefix' => 'Insert ESC[',
'ui.admin.ads.insert_sequence' => 'Insert Sequence',
'ui.admin.ads.select_sequence' => 'Select ANSI sequence',
'ui.admin.ads.sequence_reset' => 'Reset (ESC[0m)',
'ui.admin.ads.sequence_bold' => 'Bold (ESC[1m)',
'ui.admin.ads.sequence_red' => 'Red (ESC[31m)',
'ui.admin.ads.sequence_green' => 'Green (ESC[32m)',
'ui.admin.ads.sequence_yellow' => 'Yellow (ESC[33m)',
'ui.admin.ads.sequence_blue' => 'Blue (ESC[34m)',
'ui.admin.ads.sequence_white' => 'White (ESC[37m)',
'ui.admin.ads.sequence_clear_screen' => 'Clear Screen (ESC[2J)',
'ui.admin.ads.sequence_clear_line' => 'Clear Line (ESC[K)',
'ui.admin.ads.sequence_cursor_home' => 'Cursor Home (ESC[H)',
'ui.admin.ads.escape_helper_help' => 'Insert a raw ESC[ prefix or a common ANSI sequence at the current cursor position.',
'ui.admin.ads.library_list' => 'Content Library',
'ui.admin.ads.dashboard' => 'Dashboard',
'ui.admin.ads.auto_post' => 'Auto-Post',
'ui.admin.ads.edit_advertisement' => 'Edit Advertisement',
'ui.admin.ads.legacy_filename' => 'Legacy Filename',
'ui.admin.ads.manage_campaigns' => 'Manage Campaigns',
'ui.admin.ads.save_as_optional' => 'Save As (optional)',
'ui.admin.ads.save_as_placeholder' => 'retro-sale.ans',
'ui.admin.ads.save_as_help' => 'Only letters, numbers, dot, dash, underscore.',
'ui.admin.ads.upload' => 'Upload',
'ui.admin.ads.current_advertisements' => 'Content Library',
'ui.admin.ads.size' => 'Size',
'ui.admin.ads.updated' => 'Updated',
'ui.admin.ads.actions' => 'Actions',
'ui.admin.ads.loading_ads' => 'Loading ads...',
'ui.admin.ads.none_uploaded' => 'No advertisements uploaded.',
'ui.admin.ads.view' => 'View',
'ui.admin.ads.saved' => 'Advertisement saved.',
'ui.admin.ads.save_failed_with_status' => 'Save failed ({status})',
'ui.admin.ads.load_one_failed' => 'Failed to load advertisement',
'ui.admin.ads.duplicate_warning' => 'Matching ANSI content already exists: {items}',
'ui.admin.ads.not_found' => 'Advertisement not found',
'ui.admin.ads.click_url' => 'Click-Through URL',
'ui.admin.ads.click_url_help' => 'Optional URL to open when a user clicks the ad.',
'ui.admin.ads.impressions' => 'imp',
'ui.admin.ads.clicks' => 'clicks',
'ui.admin.ads.stats' => 'Stats',
'ui.dashboard.advertisement_visit' => 'Visit',
// Admin Broadcast Manager
'ui.admin.ad_campaigns.page_title' => 'Broadcast Manager',
'ui.admin.ad_campaigns.heading' => 'Broadcast Manager',
'ui.admin.ad_campaigns.back_to_ads' => 'Back to Ads',
'ui.admin.ad_campaigns.add_campaign' => 'Add Campaign',
'ui.admin.ad_campaigns.edit_campaign' => 'Edit Campaign',
'ui.admin.ad_campaigns.clone_campaign' => 'Clone Campaign',
'ui.admin.ad_campaigns.copy_suffix' => ' (Copy)',
'ui.admin.ad_campaigns.campaigns' => 'Campaigns',
'ui.admin.ad_campaigns.targets' => 'Targets',
'ui.admin.ad_campaigns.ads' => 'Ads',
'ui.admin.ad_campaigns.schedule' => 'Schedule',
'ui.admin.ad_campaigns.schedules' => 'Schedules',
'ui.admin.ad_campaigns.interval' => 'Interval',
'ui.admin.ad_campaigns.last_posted' => 'Last Posted',
'ui.admin.ad_campaigns.next_run' => 'Next Run',
'ui.admin.ad_campaigns.not_scheduled' => 'Not scheduled',
'ui.admin.ad_campaigns.loading' => 'Loading broadcasts...',
'ui.admin.ad_campaigns.none' => 'No broadcasts configured.',
'ui.admin.ad_campaigns.recent_history' => 'Recent Post History',
'ui.admin.ad_campaigns.post_history' => 'Post History',
'ui.admin.ad_campaigns.no_history' => 'No post history yet.',
'ui.admin.ad_campaigns.no_history_rows' => 'No post history found for the current filters.',
'ui.admin.ad_campaigns.post_as_user' => 'Post As User',
'ui.admin.ad_campaigns.to_name' => 'To Name',
'ui.admin.ad_campaigns.all_campaigns' => 'All Campaigns',
'ui.admin.ad_campaigns.all_statuses' => 'All Statuses',
'ui.admin.ad_campaigns.status_success' => 'Success',
'ui.admin.ad_campaigns.status_failed' => 'Failed',
'ui.admin.ad_campaigns.status_dry_run' => 'Dry Run',
'ui.admin.ad_campaigns.status_skipped' => 'Skipped',
'ui.admin.ad_campaigns.campaign' => 'Campaign',
'ui.admin.ad_campaigns.ad' => 'Ad',
'ui.admin.ad_campaigns.target' => 'Target',
'ui.admin.ad_campaigns.posted_by' => 'Posted By',
'ui.admin.ad_campaigns.error' => 'Error',
'ui.admin.ad_campaigns.add_schedule' => 'Add Schedule',
'ui.admin.ad_campaigns.schedule_days' => 'Days',
'ui.admin.ad_campaigns.schedule_time' => 'Time',
'ui.admin.ad_campaigns.schedule_timezone' => 'Timezone',
'ui.admin.ad_campaigns.day_sun' => 'Sun',
'ui.admin.ad_campaigns.day_mon' => 'Mon',
'ui.admin.ad_campaigns.day_tue' => 'Tue',
'ui.admin.ad_campaigns.day_wed' => 'Wed',
'ui.admin.ad_campaigns.day_thu' => 'Thu',
'ui.admin.ad_campaigns.day_fri' => 'Fri',
'ui.admin.ad_campaigns.day_sat' => 'Sat',
'ui.admin.ad_campaigns.post_interval_minutes' => 'Post Interval Minutes',
'ui.admin.ad_campaigns.repeat_gap_minutes' => 'Repeat Gap Minutes',
'ui.admin.ad_campaigns.selection_mode' => 'Selection Mode',
'ui.admin.ad_campaigns.selection_weighted_random' => 'Weighted Random',
'ui.admin.ad_campaigns.add_target' => 'Add Target',
'ui.admin.ad_campaigns.include_tags' => 'Include Tags',
'ui.admin.ad_campaigns.include_tags_help' => 'Only ads matching at least one selected include tag are eligible.',
'ui.admin.ad_campaigns.exclude_tags' => 'Exclude Tags',
'ui.admin.ad_campaigns.exclude_tags_help' => 'Ads matching any selected exclude tag are skipped.',
'ui.admin.ad_campaigns.assigned_ads' => 'Assigned Ads',
'ui.admin.ad_campaigns.no_ads_available' => 'No ads available yet.',
'ui.admin.ad_campaigns.echoarea_domain' => 'Echoarea + Domain',
'ui.admin.ad_campaigns.select_target' => 'Select target...',
'ui.admin.ad_campaigns.subject_template' => 'Subject Template',
'ui.admin.ad_campaigns.select_user' => 'Select user...',
'ui.admin.ad_campaigns.run_now' => 'Run Now',
'ui.admin.ad_campaigns.run_now_confirm' => 'Run {name} right now?',
'ui.admin.ad_campaigns.run_complete' => 'Broadcast run complete.',
'ui.admin.ad_campaigns.this_campaign' => 'this campaign',
'ui.admin.ad_campaigns.saved' => 'Broadcast saved.',
'ui.admin.ad_campaigns.created' => 'Broadcast created.',
'ui.admin.ad_campaigns.deleted' => 'Broadcast deleted.',
'ui.admin.ad_campaigns.delete_confirm' => 'Delete {name}?',
'ui.admin.ad_campaigns.load_failed' => 'Failed to load broadcasts',
'ui.admin.ad_campaigns.meta_failed' => 'Failed to load broadcast metadata',
'ui.admin.ad_campaigns.list_failed' => 'Failed to load broadcasts',
'ui.admin.ad_campaigns.log_failed' => 'Failed to load broadcast log',
'ui.admin.ad_campaigns.load_one_failed' => 'Failed to load ad campaign',
'ui.admin.ad_campaigns.save_failed' => 'Failed to save ad campaign',
'ui.admin.ad_campaigns.delete_failed' => 'Failed to delete ad campaign',
'ui.admin.ad_campaigns.run_failed' => 'Failed to run ad campaign',
'ui.admin.ad_campaigns.end_at' => 'Expires On',
'ui.admin.ad_campaigns.end_at_help' => 'Campaign will auto-deactivate after this date. Leave blank to run indefinitely.',
'ui.admin.ad_campaigns.manual_post' => 'Manual Post',
'ui.admin.ad_campaigns.wizard_btn' => 'Quick Setup',
'ui.admin.ad_campaigns.wizard_title' => 'Campaign Quick Setup',
'ui.admin.ad_campaigns.wizard_step_of' => 'Step {current} of {total}',
'ui.admin.ad_campaigns.wizard_step1_title' => 'Choose Type',
'ui.admin.ad_campaigns.wizard_step2_title' => 'Details',
'ui.admin.ad_campaigns.wizard_step3_title' => 'Review',
'ui.admin.ad_campaigns.wizard_back' => 'Back',
'ui.admin.ad_campaigns.wizard_next' => 'Next',
'ui.admin.ad_campaigns.wizard_finish' => 'Create Campaign',
'ui.admin.ad_campaigns.wizard_campaign_name' => 'Campaign Name',
'ui.admin.ad_campaigns.wizard_select_ads' => 'Assign Ads',
'ui.admin.ad_campaigns.wizard_select_ads_help' => 'Select one or more ads to include in this campaign.',
'ui.admin.ad_campaigns.wizard_posts_to' => 'Posts to',
'ui.admin.ad_campaigns.wizard_schedule_label' => 'Schedule',
'ui.admin.ad_campaigns.wizard_frequency_label' => 'Interval',
'ui.admin.ad_campaigns.wizard_expires_label' => 'Expires',
'ui.admin.ad_campaigns.wizard_subject_label' => 'Subject Template',
'ui.admin.ad_campaigns.wizard_ads_label' => 'Ads',
'ui.admin.ad_campaigns.wizard_disable_reminder' => 'Campaign will auto-deactivate after this date.',
'ui.admin.ad_campaigns.wizard_created' => 'Campaign created successfully.',
'ui.admin.ad_campaigns.wizard_no_type' => 'Please select a campaign type.',
'ui.admin.ad_campaigns.wizard_no_name' => 'Please enter a campaign name.',
'ui.admin.ad_campaigns.wizard_no_user' => 'Please select a user.',
'ui.admin.ad_campaigns.wizard_no_target' => 'Please select an echoarea target.',
'ui.admin.ad_campaigns.wizard_no_ads' => 'Please select at least one ad.',
// Admin Dashboard
'ui.admin.dashboard.page_title' => 'Admin Dashboard',
'ui.admin.dashboard.heading' => 'Admin Dashboard',
'ui.admin.dashboard.total_users' => 'Total Users',
'ui.admin.dashboard.active_users' => 'Active Users',
'ui.admin.dashboard.total_netmail' => 'Total Netmail',
'ui.admin.dashboard.total_echomail' => 'Total Echomail',
'ui.admin.dashboard.quick_actions' => 'Quick Actions',
'ui.admin.dashboard.system_information' => 'System Information',
'ui.admin.dashboard.load_average' => 'Load Average:',
'ui.admin.dashboard.ram_usage' => 'RAM Usage:',
'ui.admin.dashboard.metric_unavailable' => 'Unavailable',
'ui.admin.dashboard.ram_usage_modal_title' => 'RAM Usage Details',
'ui.admin.dashboard.ram_usage_modal_failed' => 'Failed to load RAM usage details.',
'ui.admin.dashboard.admin_users' => 'Admin Users:',
'ui.admin.dashboard.active_sessions' => 'Active Sessions:',
'ui.admin.dashboard.system_address' => 'System Address:',
'ui.admin.dashboard.version' => 'Version:',
'ui.admin.dashboard.registration_status' => 'Registration:',
'ui.admin.dashboard.registration_registered' => 'Registered',
'ui.admin.dashboard.registration_to' => 'Registered to {system} / {licensee}',
'ui.admin.dashboard.registration_unregistered' => 'Unregistered',
'ui.admin.dashboard.registration_link' => 'Register ?',
'ui.admin.dashboard.git_branch_commit' => 'Git Branch / Commit:',
'ui.admin.dashboard.database_version' => 'Database Version:',
'ui.admin.dashboard.service_status' => 'Service Status',
'ui.admin.dashboard.service.admin_daemon' => 'Admin Daemon',
'ui.admin.dashboard.service.binkp_scheduler' => 'Binkp Scheduler',
'ui.admin.dashboard.service.binkp_server' => 'Binkp Server',
'ui.admin.dashboard.service.telnetd' => 'Telnet Server',
'ui.admin.dashboard.service.ftp_daemon' => 'FTP Server',
'ui.admin.dashboard.service.ssh_daemon' => 'SSH Server',
'ui.admin.dashboard.service.gemini_daemon' => 'Gemini Server',
'ui.admin.dashboard.service.mrc_daemon' => 'MRC Daemon',
'ui.admin.dashboard.service.multiplexing_server' => 'Multiplexing Server',
'ui.admin.dashboard.service.mcp_server' => 'MCP Server',
'ui.admin.dashboard.service.realtime_server' => 'Realtime Server',
'ui.admin.dashboard.running' => 'Running',
'ui.admin.dashboard.stopped' => 'Stopped',
'ui.admin.dashboard.not_configured' => 'Not configured',
'ui.admin.dashboard.pid' => 'PID',
'ui.admin.dashboard.db_size' => 'Database Size',
'ui.admin.dashboard.db_stats_link' => 'View Statistics',
// Admin database statistics page
'ui.admin.db_stats.page_title' => 'Database Statistics',
'ui.admin.db_stats.heading' => 'Database Statistics',
'ui.admin.db_stats.tab.size_growth' => 'Size & Growth',
'ui.admin.db_stats.tab.activity' => 'Activity',
'ui.admin.db_stats.tab.query_performance' => 'Query Performance',
'ui.admin.db_stats.tab.replication' => 'Replication',
'ui.admin.db_stats.tab.maintenance' => 'Maintenance',
'ui.admin.db_stats.tab.index_health' => 'Index Health',
'ui.admin.db_stats.db_total_size' => 'Total Database Size',
'ui.admin.db_stats.table_sizes' => 'Table Sizes (top 20)',
'ui.admin.db_stats.index_sizes' => 'Index Sizes (top 20)',
'ui.admin.db_stats.bloat' => 'Bloat Estimates (dead tuples)',
'ui.admin.db_stats.no_bloat' => 'No significant dead tuples detected.',
'ui.admin.db_stats.connections' => 'Active Connections',
'ui.admin.db_stats.used' => 'used',
'ui.admin.db_stats.cache_hit_ratio' => 'Cache Hit Ratio',
'ui.admin.db_stats.cache_hit_warning' => 'Below recommended 99%',
'ui.admin.db_stats.transactions' => 'Transactions',
'ui.admin.db_stats.committed' => 'committed',
'ui.admin.db_stats.rolled_back' => 'rolled back',
'ui.admin.db_stats.tuples' => 'Tuple Activity',
'ui.admin.db_stats.inserted' => 'Inserted',
'ui.admin.db_stats.updated' => 'Updated',
'ui.admin.db_stats.deleted' => 'Deleted',
'ui.admin.db_stats.connection_states' => 'Connection States',
'ui.admin.db_stats.pg_stat_statements_unavailable' => 'The pg_stat_statements extension is not installed. Install it to enable slow query and frequent query analysis.',
'ui.admin.db_stats.lock_waits' => 'Lock Waits',
'ui.admin.db_stats.deadlocks' => 'Deadlocks (cumulative)',
'ui.admin.db_stats.long_running' => 'Long-Running Queries (>5s)',
'ui.admin.db_stats.slow_queries' => 'Slowest Queries (by mean time)',
'ui.admin.db_stats.frequent_queries' => 'Most Frequently Called Queries',
'ui.admin.db_stats.no_replication' => 'No replication is configured on this server.',
'ui.admin.db_stats.replication_senders' => 'Replication Senders',
'ui.admin.db_stats.wal_receiver' => 'WAL Receiver',
'ui.admin.db_stats.vacuum_needed' => '{count} table(s) may need a VACUUM (>10k dead tuples or >5% dead).',
'ui.admin.db_stats.autovacuum_active' => 'Autovacuum Workers (active)',
'ui.admin.db_stats.maintenance_health' => 'Vacuum / Analyze Status',
'ui.admin.db_stats.never' => 'Never',
'ui.admin.db_stats.unused_indexes' => 'Unused Indexes',
'ui.admin.db_stats.no_unused_indexes' => 'No unused indexes found.',
'ui.admin.db_stats.duplicate_indexes' => 'Potentially Redundant Indexes',
'ui.admin.db_stats.scan_ratios' => 'Index vs Sequential Scan Ratios',
'ui.admin.db_stats.no_data' => 'No data available.',
'ui.admin.db_stats.col.table' => 'Table',
'ui.admin.db_stats.col.index' => 'Index',
'ui.admin.db_stats.col.total_size' => 'Total',
'ui.admin.db_stats.col.table_size' => 'Table',
'ui.admin.db_stats.col.index_size' => 'Indexes',
'ui.admin.db_stats.col.size' => 'Size',
'ui.admin.db_stats.col.dead_tuples' => 'Dead Tuples',
'ui.admin.db_stats.col.dead_pct' => 'Dead %',
'ui.admin.db_stats.col.state' => 'State',
'ui.admin.db_stats.col.count' => 'Count',
'ui.admin.db_stats.col.pid' => 'PID',
'ui.admin.db_stats.col.user' => 'User',
'ui.admin.db_stats.col.duration' => 'Duration',
'ui.admin.db_stats.col.query' => 'Query',
'ui.admin.db_stats.col.mean_ms' => 'Mean (ms)',
'ui.admin.db_stats.col.total_ms' => 'Total (ms)',
'ui.admin.db_stats.col.calls' => 'Calls',
'ui.admin.db_stats.col.client' => 'Client',
'ui.admin.db_stats.col.lag_bytes' => 'Lag (bytes)',
'ui.admin.db_stats.col.status' => 'Status',
'ui.admin.db_stats.col.sender' => 'Sender',
'ui.admin.db_stats.col.last_vacuum' => 'Last Vacuum',
'ui.admin.db_stats.col.last_analyze' => 'Last Analyze',
'ui.admin.db_stats.col.seq_scans' => 'Seq Scans',
'ui.admin.db_stats.col.idx_scans' => 'Idx Scans',
'ui.admin.db_stats.col.idx_pct' => 'Idx %',
'ui.admin.db_stats.tab.i18n_catalogs' => 'i18n Catalogs',
'ui.admin.db_stats.i18n.keys' => 'keys',
'ui.admin.db_stats.i18n.memory' => 'memory',
'ui.admin.db_stats.i18n.detail' => 'Catalog Detail',
'ui.admin.db_stats.i18n.total' => 'Total',
'ui.admin.db_stats.i18n.col.locale' => 'Locale',
'ui.admin.db_stats.i18n.col.file' => 'File',
'ui.admin.db_stats.i18n.col.keys' => 'Keys',
'ui.admin.db_stats.i18n.col.file_size' => 'File Size',
'ui.admin.db_stats.i18n.col.memory' => 'Memory',
// Admin Users (legacy users page)
'ui.admin.users.load_failed' => 'Error loading users',
'ui.admin.users.load_details_failed' => 'Error loading user details',
'ui.admin.users.updated_success' => 'User updated successfully',
'ui.admin.users.created_success' => 'User created successfully',
'ui.admin.users.save_failed' => 'Error saving user',
'ui.admin.users.delete_confirm' => 'Are you sure you want to delete this user? This action cannot be undone.',
'ui.admin.users.deleted_success' => 'User deleted successfully',
'ui.admin.users.delete_failed' => 'Error deleting user',
'ui.admin.users.page_title' => 'User Management',
'ui.admin.users.heading' => 'User Management',
'ui.admin.users.add_new_user' => 'Add New User',
'ui.admin.users.search_users_placeholder' => 'Search users...',
'ui.admin.users.active' => 'Active',
'ui.admin.users.inactive' => 'Inactive',
'ui.admin.users.admins' => 'Admins',
'ui.admin.users.username' => 'Username',
'ui.admin.users.real_name' => 'Real Name',
'ui.admin.users.fidonet_address' => 'Fidonet Address',
'ui.admin.users.status' => 'Status',
'ui.admin.users.admin' => 'Admin',
'ui.admin.users.created' => 'Created',
'ui.admin.users.actions' => 'Actions',
'ui.admin.users.password_help' => 'Leave blank when editing to keep current password',
'ui.admin.users.fidonet_address_placeholder' => '1:123/456.789',
'ui.admin.users.active_user' => 'Active User',
'ui.admin.users.administrator' => 'Administrator',
'ui.admin.users.save_user' => 'Save User',
'ui.admin.users.user_details' => 'User Details',
'ui.admin.users.view_details' => 'View Details',
'ui.admin.users.view_profile' => 'View Profile',
'ui.admin.users.pagination_aria' => 'Users pagination',
'ui.admin.users.previous' => 'Previous',
'ui.admin.users.next' => 'Next',
'ui.admin.users.edit_user' => 'Edit User',
'ui.admin.users.user_information' => 'User Information',
'ui.admin.users.last_login' => 'Last Login',
'ui.admin.users.statistics' => 'Statistics',
'ui.admin.users.credit_balance' => 'Credit Balance',
'ui.admin.users.netmail_received' => 'Netmail Received',
'ui.admin.users.netmail_sent' => 'Netmail Sent',
'ui.admin.users.echomail_posted' => 'Echomail Posted',
'ui.admin.users.active_sessions' => 'Active Sessions',
'ui.admin.users.grant_credits_heading' => 'Grant Credits',
'ui.admin.users.grant_credits_amount' => 'Amount',
'ui.admin.users.grant_credits_note' => 'Reason / Note',
'ui.admin.users.grant_credits_note_placeholder' => 'Manual adjustment, contest prize, support issue, etc.',
'ui.admin.users.grant_credits_action' => 'Add Credits',
'ui.admin.users.grant_credits_help' => 'Creates an admin-adjustment credit transaction with your note in the ledger.',
'ui.admin.users.grant_credits_amount_invalid' => 'Enter a positive credit amount.',
'ui.admin.users.grant_credits_note_missing' => 'Enter a note for this credit grant.',
'ui.admin.users.credit_grant_success' => 'Credits added successfully',
'ui.admin.users.credit_grant_failed' => 'Failed to add credits',
'ui.admin.users.echomail_moderation_forced' => 'Force echomail moderation',
'ui.admin.users.echomail_moderation_forced_help' => 'Hold all networked echomail posts from this user for review, regardless of global moderation settings.',
// Admin Chat Rooms
'ui.admin.chat_rooms.load_failed' => 'Error loading chat rooms',
'ui.admin.chat_rooms.not_found' => 'Chat room not found',
'ui.admin.chat_rooms.load_single_failed' => 'Error loading chat room',
'ui.admin.chat_rooms.updated_success' => 'Room updated successfully',
'ui.admin.chat_rooms.created_success' => 'Room created successfully',
'ui.admin.chat_rooms.save_failed' => 'Error saving room',
'ui.admin.chat_rooms.delete_confirm' => 'Delete this chat room? This cannot be undone.',
'ui.admin.chat_rooms.deleted_success' => 'Room deleted successfully',
'ui.admin.chat_rooms.delete_failed' => 'Error deleting room',
'ui.admin.chat_rooms.page_title' => 'Chat Rooms',
'ui.admin.chat_rooms.heading' => 'Chat Rooms',
'ui.admin.chat_rooms.add_room' => 'Add Room',
'ui.admin.chat_rooms.status' => 'Status',
'ui.admin.chat_rooms.created' => 'Created',
'ui.admin.chat_rooms.actions' => 'Actions',
'ui.admin.chat_rooms.add_chat_room' => 'Add Chat Room',
'ui.admin.chat_rooms.edit_chat_room' => 'Edit Chat Room',
'ui.admin.chat_rooms.active_room' => 'Active room',
'ui.admin.chat_rooms.save_room' => 'Save Room',
'ui.admin.chat_rooms.no_description' => '-',
'ui.admin.chat_rooms.active' => 'Active',
'ui.admin.chat_rooms.inactive' => 'Inactive',
'ui.admin.chat_rooms.bridge' => 'Bridge',
'ui.admin.chat_rooms.bridge_enabled' => 'Enabled',
'ui.admin.chat_rooms.bridge_disabled' => 'Disabled',
'ui.admin.chat_rooms.matterbridge_enabled' => 'Bridge this room through Matterbridge',
'ui.admin.chat_rooms.matterbridge_gateway' => 'Matterbridge gateway',
'ui.admin.chat_rooms.matterbridge_gateway_help' => 'Matches the Matterbridge API gateway name used by this local room.',
'ui.admin.chat_rooms.matterbridge_username_template' => 'Remote username template',
'ui.admin.chat_rooms.matterbridge_username_template_help' => 'Optional. Use {username} and {room_name}. Leave blank to use the global suffix.',
// Admin AI Bots
'ui.admin.ai_bots.page_title' => 'AI Bots',
'ui.admin.ai_bots.heading' => 'AI Bots',
'ui.admin.ai_bots.add_bot' => 'Add Bot',
'ui.admin.ai_bots.add_bot_title' => 'Add AI Bot',
'ui.admin.ai_bots.edit_bot_title' => 'Edit AI Bot',
'ui.admin.ai_bots.username' => 'Username',
'ui.admin.ai_bots.username_note' => 'Alphanumeric and underscore only. Cannot be changed after creation.',
'ui.admin.ai_bots.weekly_spend' => 'Weekly Spend',
'ui.admin.ai_bots.weekly_budget' => 'Weekly Budget',
'ui.admin.ai_bots.status' => 'Status',
'ui.admin.ai_bots.actions' => 'Actions',
'ui.admin.ai_bots.active' => 'Active',
'ui.admin.ai_bots.inactive' => 'Inactive',
'ui.admin.ai_bots.system_prompt' => 'System Prompt',
'ui.admin.ai_bots.system_prompt_note' => 'Sent as the system message to the AI provider. Defines the bot\'s persona.',
'ui.admin.ai_bots.provider' => 'AI Provider',
'ui.admin.ai_bots.provider_default' => 'Site default',
'ui.admin.ai_bots.model' => 'Model',
'ui.admin.ai_bots.model_placeholder' => 'Provider default',
'ui.admin.ai_bots.context_messages' => 'Context (msgs)',
'ui.admin.ai_bots.activities' => 'Activities',
'ui.admin.ai_bots.activity_local_chat' => 'Local Chat',
'ui.admin.ai_bots.chat_respond_dm' => 'Respond to direct messages',
'ui.admin.ai_bots.chat_respond_rooms' => 'Respond to @mentions in rooms',
'ui.admin.ai_bots.save_bot' => 'Save Bot',
'ui.admin.ai_bots.no_bots' => 'No bots configured.',
'ui.admin.ai_bots.load_failed' => 'Error loading bots',
'ui.admin.ai_bots.load_single_failed' => 'Error loading bot',
'ui.admin.ai_bots.created_success' => 'Bot created successfully',
'ui.admin.ai_bots.updated_success' => 'Bot updated successfully',
'ui.admin.ai_bots.deleted_success' => 'Bot deleted successfully',
'ui.admin.ai_bots.save_failed' => 'Error saving bot',
'ui.admin.ai_bots.delete_failed' => 'Error deleting bot',
'ui.admin.ai_bots.delete_confirm' => 'Delete this bot and its system user? This cannot be undone.',
'ui.admin.ai_bots.middleware_pipeline' => 'Middleware Pipeline',
'ui.admin.ai_bots.middleware_add' => 'Add Step',
'ui.admin.ai_bots.middleware_class' => 'Class',
'ui.admin.ai_bots.middleware_config' => 'Config (JSON)',
'ui.admin.ai_bots.middleware_custom_class' => 'Custom class (fully qualified)',
'ui.admin.ai_bots.middleware_pipeline_note' => 'Steps run in order before the AI is called. A step can short-circuit with a static reply or suppress the response entirely.',
// Admin Binkp Sessions
'ui.admin.binkp_sessions.page_title' => 'Binkp Sessions - Admin',
'ui.admin.binkp_sessions.heading' => 'Binkp Session Log',
'ui.admin.binkp_sessions.back_to_dashboard' => 'Back to Dashboard',
'ui.admin.binkp_sessions.total_24h' => 'Total (24h)',
'ui.admin.binkp_sessions.secure' => 'Secure',
'ui.admin.binkp_sessions.insecure' => 'Insecure',
'ui.admin.binkp_sessions.crash_out' => 'Crash Out',
'ui.admin.binkp_sessions.successful' => 'Successful',
'ui.admin.binkp_sessions.failed' => 'Failed',
'ui.admin.binkp_sessions.filter_sessions' => 'Filter Sessions',
'ui.admin.binkp_sessions.session_type' => 'Session Type',
'ui.admin.binkp_sessions.crash_outbound' => 'Crash Outbound',
'ui.admin.binkp_sessions.success' => 'Success',
'ui.admin.binkp_sessions.rejected' => 'Rejected',
'ui.admin.binkp_sessions.remote_address' => 'Remote Address',
'ui.admin.binkp_sessions.remote_address_placeholder' => '1:123/456 or 203.0.113.7',
'ui.admin.binkp_sessions.apply_filter' => 'Apply Filter',
'ui.admin.binkp_sessions.recent_sessions' => 'Recent Sessions',
'ui.admin.binkp_sessions.time' => 'Time',
'ui.admin.binkp_sessions.ip' => 'IP',
'ui.admin.binkp_sessions.pid' => 'PID',
'ui.admin.binkp_sessions.type' => 'Type',
'ui.admin.binkp_sessions.direction' => 'Direction',
'ui.admin.binkp_sessions.msgs_in' => 'Msgs In',
'ui.admin.binkp_sessions.msgs_out' => 'Msgs Out',
'ui.admin.binkp_sessions.files_in' => 'Files In',
'ui.admin.binkp_sessions.files_out' => 'Files Out',
'ui.admin.binkp_sessions.duration' => 'Duration',
'ui.admin.binkp_sessions.load_stats_failed' => 'Error loading stats',
'ui.admin.binkp_sessions.no_sessions_found' => 'No sessions found',
'ui.admin.binkp_sessions.in' => 'In',
'ui.admin.binkp_sessions.out' => 'Out',
'ui.admin.binkp_sessions.load_sessions_failed' => 'Error loading sessions',
'ui.admin.binkp_sessions.crash' => 'Crash',
'ui.admin.binkp_sessions.active' => 'Active',
'ui.admin.binkp_sessions.log_modal_title' => 'Session Log',
'ui.admin.binkp_sessions.loading_log' => 'Loading log...',
'ui.admin.binkp_sessions.log_file' => 'Log File',
'ui.admin.binkp_sessions.log_unavailable' => 'No PID was recorded for this session.',
'ui.admin.binkp_sessions.no_log_lines' => 'No log lines found for this session.',
'ui.admin.binkp_sessions.log_load_failed' => 'Failed to load session log',
'ui.admin.binkp_sessions.rows_per_page' => 'Rows per page',
'ui.admin.binkp_sessions.pagination_aria' => 'Binkp sessions pagination',
'ui.admin.binkp_sessions.page_status' => 'Showing {start}-{end} of {total}',
'ui.admin.binkp_sessions.page_indicator' => 'Page {page} of {pages}',
'ui.admin.binkp_sessions.page_status_empty' => '0 sessions',
'ui.admin.binkp_sessions.chart_period_label' => 'Chart period',
'ui.admin.binkp_sessions.chart_type_label' => 'Report',
'ui.admin.binkp_sessions.period_24h' => '24 Hours',
'ui.admin.binkp_sessions.period_7d' => '7 Days',
'ui.admin.binkp_sessions.period_1m' => '1 Month',
'ui.admin.binkp_sessions.total_period' => 'Total ({period})',
'ui.admin.binkp_sessions.traffic_chart' => 'Flow Files',
'ui.admin.binkp_sessions.traffic_chart_empty' => 'No file traffic recorded in the selected period.',
'ui.admin.binkp_sessions.traffic_chart_aria' => 'BinkP file traffic for the selected period',
'ui.admin.binkp_sessions.uplink_connections_chart' => 'Uplink Connections',
'ui.admin.binkp_sessions.uplink_connections_chart_empty' => 'No uplink connections recorded in the selected period.',
'ui.admin.binkp_sessions.uplink_connections_chart_aria' => 'BinkP uplink connections for the selected period',
'ui.admin.binkp_sessions.connections' => 'Connections',
// Admin Polls
'ui.admin.polls.load_failed' => 'Error loading polls',
'ui.admin.polls.not_found' => 'Poll not found',
'ui.admin.polls.load_single_failed' => 'Error loading poll',
'ui.admin.polls.min_options_required' => 'At least two options are required.',
'ui.admin.polls.question_required' => 'Question is required.',
'ui.admin.polls.provide_min_options' => 'Please provide at least two options.',
'ui.admin.polls.updated_success' => 'Poll updated successfully',
'ui.admin.polls.created_success' => 'Poll created successfully',
'ui.admin.polls.save_failed' => 'Error saving poll',
'ui.admin.polls.delete_confirm' => 'Delete this poll? This cannot be undone.',
'ui.admin.polls.deleted_success' => 'Poll deleted successfully',
'ui.admin.polls.delete_failed' => 'Error deleting poll',
'ui.admin.polls.page_title' => 'Polls',
'ui.admin.polls.heading' => 'Polls',
'ui.admin.polls.add_poll' => 'Add Poll',
'ui.admin.polls.edit_poll' => 'Edit Poll',
'ui.admin.polls.question' => 'Question',
'ui.admin.polls.status' => 'Status',
'ui.admin.polls.votes' => 'Votes',
'ui.admin.polls.created_by' => 'Created By',
'ui.admin.polls.created' => 'Created',
'ui.admin.polls.actions' => 'Actions',
'ui.admin.polls.options' => 'Options',
'ui.admin.polls.add_option' => 'Add Option',
'ui.admin.polls.active_poll' => 'Active poll',
'ui.admin.polls.editing_options_resets_votes' => 'Editing options will reset votes for this poll.',
'ui.admin.polls.save_poll' => 'Save Poll',
'ui.admin.polls.active' => 'Active',
'ui.admin.polls.inactive' => 'Inactive',
'ui.admin.polls.option_text_placeholder' => 'Option text',
// Admin Template Editor
'ui.admin.template_editor.load_templates_failed' => 'Failed to load templates.',
'ui.admin.template_editor.no_templates_found' => 'No templates found.',
'ui.admin.template_editor.unsaved_changes_confirm' => 'You have unsaved changes. Continue and discard them?',
'ui.admin.template_editor.load_template_failed' => 'Failed to load template',
'ui.admin.template_editor.enter_template_path' => 'Enter a template path (e.g., systemnews.twig).',
'ui.admin.template_editor.save_template_failed' => 'Failed to save template',
'ui.admin.template_editor.template_saved_success' => 'Template saved successfully.',
'ui.admin.template_editor.delete_confirm' => 'Delete {template}? This cannot be undone.',
'ui.admin.template_editor.delete_template_failed' => 'Failed to delete template',
'ui.admin.template_editor.no_template_selected' => 'No template selected',
'ui.admin.template_editor.template_deleted_success' => 'Template deleted.',
'ui.admin.template_editor.install_template_failed' => 'Failed to install template',
'ui.admin.template_editor.template_installed_success' => 'Template installed from example.',
'ui.admin.template_editor.page_title_prefix' => 'Admin: Template Editor',
'ui.admin.template_editor.heading' => 'Template Editor',
'ui.admin.template_editor.restricted_edits_prefix' => 'Edits are restricted to',
'ui.admin.template_editor.custom_templates' => 'Custom Templates',
'ui.admin.template_editor.search_templates_placeholder' => 'Search templates...',
'ui.admin.template_editor.loading_templates' => 'Loading templates...',
'ui.admin.template_editor.new_template' => 'New Template',
'ui.admin.template_editor.path_relative_custom' => 'Path (relative to templates/custom)',
'ui.admin.template_editor.new_template_path_placeholder' => 'systemnews.twig',
'ui.admin.template_editor.create' => 'Create',
'ui.admin.template_editor.editor' => 'Editor',
'ui.admin.template_editor.install' => 'Install',
'ui.admin.template_editor.changes_apply_immediately' => 'Changes apply immediately after saving. Make sure your Twig syntax is valid.',
// Admin Language Overlay Editor
'ui.admin.i18n_overrides.page_title' => 'Admin: Language Overrides',
'ui.admin.i18n_overrides.heading' => 'Language Overrides',
'ui.admin.i18n_overrides.description' => 'Customize individual phrases without editing the base translation files. Overrides are applied on top of the base catalog for the selected locale.',
'ui.admin.i18n_overrides.locale_label' => 'Locale',
'ui.admin.i18n_overrides.catalog_label' => 'Catalog',
'ui.admin.i18n_overrides.load_btn' => 'Load',
'ui.admin.i18n_overrides.search_placeholder' => 'Filter keys...',
'ui.admin.i18n_overrides.show_overrides_only' => 'Show overrides only',
'ui.admin.i18n_overrides.col_key' => 'Key',
'ui.admin.i18n_overrides.col_base' => 'Base value',
'ui.admin.i18n_overrides.col_override' => 'Your override',
'ui.admin.i18n_overrides.save_btn' => 'Save Overrides',
'ui.admin.i18n_overrides.clear_btn' => 'Clear',
'ui.admin.i18n_overrides.overridden_badge' => 'Overridden',
'ui.admin.i18n_overrides.no_keys' => 'No keys found.',
'ui.admin.i18n_overrides.loading' => 'Loading...',
'ui.admin.i18n_overrides.saved' => 'Overrides saved.',
'ui.admin.i18n_overrides.save_failed' => 'Failed to save overrides.',
'ui.admin.i18n_overrides.load_failed' => 'Failed to load catalog.',
'ui.admin.i18n_overrides.select_locale_catalog' => 'Select a locale and catalog, then click Load.',
'ui.admin.i18n_overrides.translate_btn' => 'Translate from English',
'ui.admin.i18n_overrides.translate_failed' => 'Translation failed.',
// Admin Upgrade Notes
'ui.admin.upgrade_notes.none_for_version' => 'No upgrade notes found for version {version}.',
// Admin Insecure Nodes
'ui.admin.insecure_nodes.error_prefix' => 'Error: ',
'ui.admin.insecure_nodes.add_failed' => 'Failed to add node',
'ui.admin.insecure_nodes.added_success' => 'Node added successfully',
'ui.admin.insecure_nodes.update_failed' => 'Failed to update node',
'ui.admin.insecure_nodes.updated_success' => 'Node updated successfully',
'ui.admin.insecure_nodes.delete_confirm' => 'Delete {address} from the allowlist?',
'ui.admin.insecure_nodes.delete_failed' => 'Failed to delete node',
'ui.admin.insecure_nodes.deleted_success' => 'Node deleted successfully',
'ui.admin.insecure_nodes.page_title' => 'Insecure Nodes - Admin',
'ui.admin.insecure_nodes.heading' => 'Insecure Node Allowlist',
'ui.admin.insecure_nodes.add_node' => 'Add Node',
'ui.admin.insecure_nodes.back_to_dashboard' => 'Back to Dashboard',
'ui.admin.insecure_nodes.about_insecure_sessions' => 'About Insecure Sessions:',
'ui.admin.insecure_nodes.info_text_1' => 'Nodes in this allowlist can connect via binkp without password authentication.',
'ui.admin.insecure_nodes.info_text_2' => 'Use with caution - insecure sessions are typically receive-only (they can deliver mail to you, but cannot pick up mail).',
'ui.admin.insecure_nodes.allowed_nodes' => 'Allowed Nodes',
'ui.admin.insecure_nodes.address' => 'Address',
'ui.admin.insecure_nodes.receive' => 'Receive',
'ui.admin.insecure_nodes.send' => 'Send',
'ui.admin.insecure_nodes.max_msgs' => 'Max Msgs',
'ui.admin.insecure_nodes.last_session' => 'Last Session',
'ui.admin.insecure_nodes.active' => 'Active',
'ui.admin.insecure_nodes.inactive' => 'Inactive',
'ui.admin.insecure_nodes.actions' => 'Actions',
'ui.admin.insecure_nodes.add_node_to_allowlist' => 'Add Node to Allowlist',
'ui.admin.insecure_nodes.ftn_address' => 'FTN Address',
'ui.admin.insecure_nodes.address_placeholder' => '1:123/456',
'ui.admin.insecure_nodes.description_placeholder' => 'Node description',
'ui.admin.insecure_nodes.ftn_address_help' => 'The FidoNet address of the node (e.g., 1:123/456)',
'ui.admin.insecure_nodes.max_messages_per_session' => 'Max Messages Per Session',
'ui.admin.insecure_nodes.allow_receive' => 'Allow Receive',
'ui.admin.insecure_nodes.allow_receive_help' => 'Allow this node to deliver mail to us',
'ui.admin.insecure_nodes.allow_send_pickup' => 'Allow Send (Pickup)',
'ui.admin.insecure_nodes.allow_send_help' => 'Allow this node to pick up mail from us (use with caution)',
'ui.admin.insecure_nodes.edit_node' => 'Edit Node',
'ui.admin.insecure_nodes.save_changes' => 'Save Changes',
'ui.admin.insecure_nodes.no_nodes' => 'No nodes in allowlist',
'ui.admin.insecure_nodes.load_nodes_failed' => 'Error loading nodes',
// Admin Crashmail Queue
'ui.admin.crashmail_queue.attempt_delivery_confirm' => 'Attempt delivery for pending crashmail now?',
'ui.admin.crashmail_queue.delivery_attempt_started' => 'Delivery attempt started.',
'ui.admin.crashmail_queue.delivery_attempt_failed_prefix' => 'Delivery attempt failed: ',
'ui.admin.crashmail_queue.error_prefix' => 'Error: ',
'ui.admin.crashmail_queue.retry_confirm' => 'Retry this crashmail delivery?',
'ui.admin.crashmail_queue.retry_success' => 'Crashmail retry queued.',
'ui.admin.crashmail_queue.retry_failed_prefix' => 'Failed to retry: ',
'ui.admin.crashmail_queue.cancel_confirm' => "Cancel this crashmail? The message will remain in your outbox but won't be crash-delivered.",
'ui.admin.crashmail_queue.cancel_success' => 'Crashmail cancelled.',
'ui.admin.crashmail_queue.cancel_failed_prefix' => 'Failed to cancel: ',
'ui.admin.crashmail_queue.page_title' => 'Crashmail Queue - Admin',
'ui.admin.crashmail_queue.heading' => 'Crashmail Queue',
'ui.admin.crashmail_queue.attempt_delivery' => 'Attempt Delivery',
'ui.admin.crashmail_queue.back_to_dashboard' => 'Back to Dashboard',
'ui.admin.crashmail_queue.pending' => 'Pending',
'ui.admin.crashmail_queue.attempting' => 'Attempting',
'ui.admin.crashmail_queue.sent_24h' => 'Sent (24h)',
'ui.admin.crashmail_queue.sent' => 'Sent',
'ui.admin.crashmail_queue.failed' => 'Failed',
'ui.admin.crashmail_queue.filter_queue' => 'Filter Queue',
'ui.admin.crashmail_queue.status' => 'Status',
'ui.admin.crashmail_queue.limit' => 'Limit',
'ui.admin.crashmail_queue.apply_filter' => 'Apply Filter',
'ui.admin.crashmail_queue.queue_items' => 'Queue Items',
'ui.admin.crashmail_queue.to' => 'To',
'ui.admin.crashmail_queue.subject' => 'Subject',
'ui.admin.crashmail_queue.destination' => 'Destination',
'ui.admin.crashmail_queue.attempts' => 'Attempts',
'ui.admin.crashmail_queue.next_attempt' => 'Next Attempt',
'ui.admin.crashmail_queue.actions' => 'Actions',
'ui.admin.crashmail_queue.no_items' => 'No items in queue',
'ui.admin.crashmail_queue.no_subject' => '(no subject)',
'ui.admin.crashmail_queue.unresolved' => 'Unresolved',
'ui.admin.crashmail_queue.load_stats_failed' => 'Error loading stats',
'ui.admin.crashmail_queue.load_queue_failed' => 'Error loading queue',
// Admin File Area Rules
'ui.admin.filearea_rules.load_failed' => 'Failed to load rules',
'ui.admin.filearea_rules.active' => 'Active',
'ui.admin.filearea_rules.missing_config' => 'Missing config',
'ui.admin.filearea_rules.error' => 'Error',
'ui.admin.filearea_rules.invalid_json' => 'Rules JSON is invalid. Please fix errors before saving.',
'ui.admin.filearea_rules.save_failed' => 'Failed to save rules',
'ui.admin.filearea_rules.saved_success' => 'Rules saved successfully.',
'ui.admin.filearea_rules.reset_confirm' => 'Replace current rules with the example file?',
'ui.admin.filearea_rules.loaded_example' => 'Loaded example rules. Save to apply them.',
'ui.admin.filearea_rules.page_title_prefix' => 'File Area Rules',
'ui.admin.filearea_rules.heading' => 'File Area Rules',
'ui.admin.filearea_rules.config_filename' => 'filearea_rules.json',
'ui.admin.filearea_rules.reset_to_example' => 'Reset to Example',
'ui.admin.filearea_rules.save_rules' => 'Save Rules',
'ui.admin.filearea_rules.editing_requires_valid_json' => 'Editing requires valid JSON.',
'ui.admin.filearea_rules.macros' => 'Macros',
'ui.admin.filearea_rules.macro_basedir' => 'Application base directory',
'ui.admin.filearea_rules.macro_filepath' => 'Full path to file',
'ui.admin.filearea_rules.macro_filename' => 'File name only',
'ui.admin.filearea_rules.macro_filesize' => 'File size in bytes',
'ui.admin.filearea_rules.macro_domain' => 'File area domain',
'ui.admin.filearea_rules.macro_areatag' => 'File area tag',
'ui.admin.filearea_rules.macro_uploader' => 'Uploader name/address',
'ui.admin.filearea_rules.macro_ticfile' => 'TIC path (if available)',
'ui.admin.filearea_rules.macro_tempdir' => 'Temp directory',
'ui.admin.filearea_rules.tips' => 'Tips',
'ui.admin.filearea_rules.tip_1' => 'Rules run in order: global rules first, then area-specific rules.',
'ui.admin.filearea_rules.tip_2' => 'Area rules can be keyed as TAG or TAG@DOMAIN (domain-specific takes precedence).',
'ui.admin.filearea_rules.tip_3' => 'Use success_action and fail_action with +stop to halt further processing.',
'ui.admin.filearea_rules.tab_gui' => 'Visual Editor',
'ui.admin.filearea_rules.tab_json' => 'JSON Editor',
'ui.admin.filearea_rules.global_rules_section' => 'Global Rules',
'ui.admin.filearea_rules.area_rules_section' => 'Area Rules',
'ui.admin.filearea_rules.add_rule' => 'Add Rule',
'ui.admin.filearea_rules.add_area' => 'Add Area',
'ui.admin.filearea_rules.add_rule_title' => 'Add Rule',
'ui.admin.filearea_rules.edit_rule_title' => 'Edit Rule',
'ui.admin.filearea_rules.add_area_title' => 'Add File Area Tag',
'ui.admin.filearea_rules.no_rules' => 'No rules. Click Add Rule to create one.',
'ui.admin.filearea_rules.no_areas' => 'No file area tag rules. Click Add File Area Tag to create one.',
'ui.admin.filearea_rules.col_enabled' => 'Enabled',
'ui.admin.filearea_rules.col_name' => 'Name',
'ui.admin.filearea_rules.col_pattern' => 'Pattern',
'ui.admin.filearea_rules.col_domain' => 'Domain',
'ui.admin.filearea_rules.col_success' => 'On Success',
'ui.admin.filearea_rules.col_fail' => 'On Failure',
'ui.admin.filearea_rules.field_name' => 'Rule Name',
'ui.admin.filearea_rules.field_pattern' => 'Filename Pattern (regex)',
'ui.admin.filearea_rules.field_pattern_hint' => 'PHP-style regex, e.g. /^NODELIST\\.\\d+$/i',
'ui.admin.filearea_rules.field_script' => 'Script Command',
'ui.admin.filearea_rules.field_timeout' => 'Timeout (seconds)',
'ui.admin.filearea_rules.field_enabled' => 'Enabled',
'ui.admin.filearea_rules.field_success_action' => 'On Success',
'ui.admin.filearea_rules.field_fail_action' => 'On Failure',
'ui.admin.filearea_rules.field_domain' => 'Domain Filter',
'ui.admin.filearea_rules.field_domain_hint' => 'Optional. Restrict rule to a specific domain (e.g. fidonet).',
'ui.admin.filearea_rules.action_move' => 'move to area:',
'ui.admin.filearea_rules.area_tag_label' => 'File Area Tag',
'ui.admin.filearea_rules.area_tag_hint' => 'e.g. NODELIST or NODELIST@fidonet',
'ui.admin.filearea_rules.delete_area_confirm' => 'Delete this file area tag and all its rules?',
'ui.admin.filearea_rules.clone_rule' => 'Clone rule',
'ui.admin.filearea_rules.clone_rule_confirm' => 'Clone rule?',
'ui.admin.filearea_rules.delete_rule_confirm' => 'Delete this rule?',
'ui.admin.filearea_rules.json_parse_error' => 'JSON parse error ? fix syntax before switching to the visual editor.',
'ui.admin.filearea_rules.pattern_test_title' => 'Test pattern',
'ui.admin.filearea_rules.pattern_test_placeholder' => 'Enter a filename to test...',
'ui.admin.filearea_rules.pattern_match' => 'match',
'ui.admin.filearea_rules.pattern_no_match' => 'no match',
'ui.admin.filearea_rules.pattern_invalid' => 'invalid regex',
'ui.admin.filearea_rules.pattern_test_area_not_found' => 'Area not found in database.',
'ui.admin.filearea_rules.pattern_test_no_files' => 'No files in this area.',
'ui.admin.filearea_rules.pattern_test_area_files' => 'Files in area:',
// Admin DOS Doors Config
'ui.admin.dosdoors_config.load_config_failed' => 'Failed to load config',
'ui.admin.dosdoors_config.load_config_error_prefix' => 'Error loading config: ',
'ui.admin.dosdoors_config.load_doors_failed' => 'Failed to load doors',
'ui.admin.dosdoors_config.load_doors_error_prefix' => 'Error loading available doors: ',
'ui.admin.dosdoors_config.invalid_json_toggle' => 'Invalid JSON - cannot toggle door',
'ui.admin.dosdoors_config.enabled_all_editor' => 'All doors enabled in editor. Click Save to apply.',
'ui.admin.dosdoors_config.invalid_json_enable_all' => 'Invalid JSON - cannot enable all',
'ui.admin.dosdoors_config.disabled_all_editor' => 'All doors disabled in editor. Click Save to apply.',
'ui.admin.dosdoors_config.invalid_json_disable_all' => 'Invalid JSON - cannot disable all',
'ui.admin.dosdoors_config.json_formatted' => 'JSON formatted successfully',
'ui.admin.dosdoors_config.cannot_format_prefix' => 'Cannot format - invalid JSON: ',
'ui.admin.dosdoors_config.empty_config' => 'Empty configuration',
'ui.admin.dosdoors_config.valid_json' => 'Valid JSON',
'ui.admin.dosdoors_config.invalid_json_prefix' => 'Invalid JSON: ',
'ui.admin.dosdoors_config.save_failed' => 'Save failed',
'ui.admin.dosdoors_config.saved_success' => 'Configuration saved successfully!',
'ui.admin.dosdoors_config.save_error_prefix' => 'Error saving config: ',
'ui.admin.dosdoors_config.cannot_save_invalid_json_prefix' => 'Cannot save - invalid JSON: ',
'ui.admin.dosdoors_config.page_title' => 'DOS Doors Config',
'ui.admin.dosdoors_config.heading' => 'DOS Doors Configuration',
'ui.admin.dosdoors_config.info_text_1' => 'DOS doors are classic BBS door games that run in DOSBox. Configuration is stored in',
'ui.admin.dosdoors_config.info_text_2' => 'Doors are discovered by scanning',
'ui.admin.dosdoors_config.info_text_3' => 'for',
'ui.admin.dosdoors_config.info_text_4' => 'manifests.',
'ui.admin.dosdoors_config.installed_doors' => 'Installed Doors',
'ui.admin.dosdoors_config.loading_doors' => 'Loading doors...',
'ui.admin.dosdoors_config.quick_actions' => 'Quick Actions',
'ui.admin.dosdoors_config.enable_all_doors' => 'Enable All Doors',
'ui.admin.dosdoors_config.disable_all_doors' => 'Disable All Doors',
'ui.admin.dosdoors_config.config_filename' => 'dosdoors.json',
'ui.admin.dosdoors_config.format' => 'Format',
'ui.admin.dosdoors_config.loading_config' => 'Loading config...',
'ui.admin.dosdoors_config.json_validation_before_save' => 'JSON validation runs before saving',
'ui.admin.dosdoors_config.configuration_options' => 'Configuration Options',
'ui.admin.dosdoors_config.option_enabled_help' => 'Whether the door is available to users',
'ui.admin.dosdoors_config.option_credit_cost_help' => 'Credits required to play (0 = free)',
'ui.admin.dosdoors_config.option_max_time_help' => 'Maximum play time per session',
'ui.admin.dosdoors_config.option_cpu_cycles_help' => 'DOSBox CPU speed (10000 = typical)',
'ui.admin.dosdoors_config.option_max_concurrent_help' => 'Maximum simultaneous players',
'ui.admin.dosdoors_config.no_doors_found_prefix' => 'No doors found. Install doors in',
'ui.admin.dosdoors_config.no_description' => 'No description',
'ui.admin.dosdoors_config.credits' => 'credits',
'ui.admin.dosdoors_config.free' => 'Free',
'ui.admin.dosdoors_config.disable' => 'Disable',
'ui.admin.dosdoors_config.enable' => 'Enable',
// Admin Native Doors Config
'ui.admin.nativedoors_config.load_config_failed' => 'Failed to load config',
'ui.admin.nativedoors_config.load_config_error_prefix' => 'Error loading config: ',
'ui.admin.nativedoors_config.load_doors_failed' => 'Failed to load doors',
'ui.admin.nativedoors_config.load_doors_error_prefix' => 'Error loading available doors: ',
'ui.admin.nativedoors_config.invalid_json_toggle' => 'Invalid JSON - cannot toggle door',
'ui.admin.nativedoors_config.enabled_all_editor' => 'All doors enabled in editor. Click Save to apply.',
'ui.admin.nativedoors_config.invalid_json_enable_all' => 'Invalid JSON - cannot enable all',
'ui.admin.nativedoors_config.disabled_all_editor' => 'All doors disabled in editor. Click Save to apply.',
'ui.admin.nativedoors_config.invalid_json_disable_all' => 'Invalid JSON - cannot disable all',
'ui.admin.nativedoors_config.json_formatted' => 'JSON formatted successfully',
'ui.admin.nativedoors_config.cannot_format_prefix' => 'Cannot format - invalid JSON: ',
'ui.admin.nativedoors_config.empty_config' => 'Empty configuration',
'ui.admin.nativedoors_config.valid_json' => 'Valid JSON',
'ui.admin.nativedoors_config.invalid_json_prefix' => 'Invalid JSON: ',
'ui.admin.nativedoors_config.save_failed' => 'Save failed',
'ui.admin.nativedoors_config.saved_success' => 'Configuration saved successfully!',
'ui.admin.nativedoors_config.save_error_prefix' => 'Error saving config: ',
'ui.admin.nativedoors_config.cannot_save_invalid_json_prefix' => 'Cannot save - invalid JSON: ',
'ui.admin.nativedoors_config.page_title' => 'Native Doors Config',
'ui.admin.nativedoors_config.heading' => 'Native Doors Configuration',
'ui.admin.nativedoors_config.info_text_1' => 'Native doors are Linux programs that run directly via PTY (no emulator needed). Configuration is stored in',
'ui.admin.nativedoors_config.info_text_2' => 'Doors are discovered by scanning',
'ui.admin.nativedoors_config.info_text_3' => 'for',
'ui.admin.nativedoors_config.info_text_4' => 'manifests.',
'ui.admin.nativedoors_config.installed_doors' => 'Installed Doors',
'ui.admin.nativedoors_config.loading_doors' => 'Loading doors...',
'ui.admin.nativedoors_config.quick_actions' => 'Quick Actions',
'ui.admin.nativedoors_config.enable_all_doors' => 'Enable All Doors',
'ui.admin.nativedoors_config.disable_all_doors' => 'Disable All Doors',
'ui.admin.nativedoors_config.config_filename' => 'nativedoors.json',
'ui.admin.nativedoors_config.format' => 'Format',
'ui.admin.nativedoors_config.loading_config' => 'Loading config...',
'ui.admin.nativedoors_config.json_validation_before_save' => 'JSON validation runs before saving',
'ui.admin.nativedoors_config.configuration_options' => 'Configuration Options',
'ui.admin.nativedoors_config.option_enabled_help' => 'Whether the door is available to users',
'ui.admin.nativedoors_config.option_credit_cost_help' => 'Credits required to play (0 = free)',
'ui.admin.nativedoors_config.option_max_time_help' => 'Maximum play time per session',
'ui.admin.nativedoors_config.option_max_concurrent_help' => 'Maximum simultaneous players',
'ui.admin.nativedoors_config.no_doors_found_prefix' => 'No doors found. Install doors in',
'ui.admin.nativedoors_config.no_description' => 'No description',
'ui.admin.nativedoors_config.credits' => 'credits',
'ui.admin.nativedoors_config.free' => 'Free',
'ui.admin.nativedoors_config.disable' => 'Disable',
'ui.admin.nativedoors_config.enable' => 'Enable',
// Admin Webdoors Config
'ui.admin.webdoors_config.load_webdoors_failed' => 'Failed to load webdoors config',
'ui.admin.webdoors_config.load_failed' => 'Failed to load config',
'ui.admin.webdoors_config.json_valid' => 'JSON is valid',
'ui.admin.webdoors_config.json_has_errors' => 'JSON has errors',
'ui.admin.webdoors_config.invalid_json' => 'Invalid JSON.',
'ui.admin.webdoors_config.no_doors_defined' => 'No doors defined.',
'ui.admin.webdoors_config.cannot_format_invalid_json' => 'Cannot format: invalid JSON',
'ui.admin.webdoors_config.fix_json_before_save' => 'Please fix JSON errors before saving.',
'ui.admin.webdoors_config.save_failed' => 'Failed to save config',
'ui.admin.webdoors_config.saved_success' => 'Webdoors config saved.',
'ui.admin.webdoors_config.activate_failed' => 'Failed to activate webdoors',
'ui.admin.webdoors_config.activated_success' => 'Webdoors activated.',
'ui.admin.webdoors_config.page_title' => 'Webdoors Config',
'ui.admin.webdoors_config.heading' => 'Webdoors Config',
'ui.admin.webdoors_config.info_text_prefix' => 'Webdoors are enabled by having a',
'ui.admin.webdoors_config.info_text_suffix' => 'file. This page lets you activate and edit it.',
'ui.admin.webdoors_config.status' => 'Status',
'ui.admin.webdoors_config.activate_webdoors' => 'Activate Webdoors',
'ui.admin.webdoors_config.config_file' => 'Config file:',
'ui.admin.webdoors_config.config_never_deleted' => 'Once activated, the config file is never deleted.',
'ui.admin.webdoors_config.json_controls_help' => 'Editing JSON controls how doors appear in the system. Only enabled is known by the UI.',
'ui.admin.webdoors_config.doors' => 'Doors',
'ui.admin.webdoors_config.config_filename' => 'webdoors.json',
'ui.admin.webdoors_config.no_config_loaded' => 'No config loaded.',
'ui.admin.webdoors_config.format_json' => 'Format JSON',
'ui.admin.webdoors_config.waiting_for_config' => 'Waiting for config...',
'ui.admin.webdoors_config.json_validation_before_save' => 'JSON validation runs before saving.',
'ui.admin.webdoors_config.active_present' => 'Active (webdoors.json present)',
'ui.admin.webdoors_config.not_active_using_example' => 'Not active (using example)',
'ui.admin.webdoors_config.enabled_label' => 'enabled',
'ui.admin.webdoors_config.true' => 'true',
'ui.admin.webdoors_config.false' => 'false',
'ui.admin.webdoors_config.not_in_config' => '(not in config)',
// Admin JS-DOS Doors Config
'ui.admin.jsdosdoors_config.page_title' => 'JS-DOS Doors Config',
'ui.admin.jsdosdoors_config.heading' => 'JS-DOS Doors Config',
'ui.admin.jsdosdoors_config.info_text_prefix' => 'JS-DOS doors are enabled by having a',
'ui.admin.jsdosdoors_config.info_text_suffix' => 'file. This page lets you activate and edit it.',
'ui.admin.jsdosdoors_config.status' => 'Status',
'ui.admin.jsdosdoors_config.activate_jsdoors' => 'Activate JS-DOS Doors',
'ui.admin.jsdosdoors_config.config_file' => 'Config file:',
'ui.admin.jsdosdoors_config.config_never_deleted' => 'Once activated, the config file is never deleted.',
'ui.admin.jsdosdoors_config.json_controls_help' => 'Editing JSON controls how JS-DOS doors appear in the system.',
'ui.admin.jsdosdoors_config.doors' => 'Doors',
'ui.admin.jsdosdoors_config.config_filename' => 'jsdosdoors.json',
'ui.admin.jsdosdoors_config.no_config_loaded' => 'No config loaded.',
'ui.admin.jsdosdoors_config.format_json' => 'Format JSON',
'ui.admin.jsdosdoors_config.waiting_for_config' => 'Waiting for config...',
'ui.admin.jsdosdoors_config.json_validation_before_save' => 'JSON validation runs before saving.',
'ui.admin.jsdosdoors_config.active_present' => 'Active (jsdosdoors.json present)',
'ui.admin.jsdosdoors_config.not_active_using_example' => 'Not active (using example)',
'ui.admin.jsdosdoors_config.enabled_label' => 'enabled',
'ui.admin.jsdosdoors_config.true' => 'true',
'ui.admin.jsdosdoors_config.false' => 'false',
'ui.admin.jsdosdoors_config.not_in_config' => '(not in config)',
'ui.admin.jsdosdoors_config.invalid_json' => 'Invalid JSON.',
'ui.admin.jsdosdoors_config.no_doors_defined' => 'No doors defined.',
'ui.admin.jsdosdoors_config.cannot_format_invalid_json' => 'Cannot format: invalid JSON',
'ui.admin.jsdosdoors_config.fix_json_before_save' => 'Please fix JSON errors before saving.',
'ui.admin.jsdosdoors_config.save_failed' => 'Failed to save config',
'ui.admin.jsdosdoors_config.saved_success' => 'JS-DOS doors config saved.',
'ui.admin.jsdosdoors_config.activate_failed' => 'Failed to activate JS-DOS doors',
'ui.admin.jsdosdoors_config.activated_success' => 'JS-DOS doors activated.',
'ui.admin.jsdosdoors_config.load_failed' => 'Failed to load config',
// JS-DOS door play page
'ui.jsdosdoor.page_title_suffix' => 'JS-DOS Door',
'ui.jsdosdoor.coming_soon_heading' => 'Coming Soon',
'ui.jsdosdoor.coming_soon_body' => 'Browser-side emulation for this game is not yet available.',
'ui.jsdosdoor.launch_game' => 'Launch Game',
'ui.jsdosdoor.launch_config' => 'Launch Config Mode',
'ui.jsdosdoor.exit_game' => 'Exit',
'ui.jsdosdoor.fullscreen' => 'Fullscreen',
'ui.jsdosdoor.send_escape' => 'Send Escape to the game',
'ui.jsdosdoor.send_escape_short' => 'Esc',
'ui.jsdosdoor.escape_unlock_hint' => 'Mouse unlocked. Click Esc to send Escape to the game.',
'ui.jsdosdoor.loading_assets' => 'Loading game assets...',
'ui.jsdosdoor.loading_emulator' => 'Starting emulator...',
// Games listing badge
'ui.webdoors.type_jsdos' => 'JSDOS',
// Admin BBS Settings
'ui.admin.bbs_settings.load_failed' => 'Failed to load settings',
'ui.admin.bbs_settings.save_failed' => 'Failed to save settings',
'ui.admin.bbs_settings.saved_success' => 'BBS features saved successfully.',
'ui.admin.bbs_settings.load_system_failed' => 'Failed to load system settings',
'ui.admin.bbs_settings.save_system_failed' => 'Failed to save system settings',
'ui.admin.bbs_settings.system_saved_success' => 'System settings saved successfully.',
'ui.admin.bbs_settings.save_credits_failed' => 'Failed to save credits settings',
'ui.admin.bbs_settings.credits_saved_success' => 'Credits settings saved successfully.',
'ui.admin.bbs_settings.load_taglines_failed' => 'Failed to load taglines',
'ui.admin.bbs_settings.save_taglines_failed' => 'Failed to save taglines',
'ui.admin.bbs_settings.taglines_saved_success' => 'Taglines saved successfully.',
'ui.admin.bbs_settings.page_title' => 'BBS Settings',
'ui.admin.bbs_settings.heading' => 'BBS Settings',
'ui.admin.bbs_settings.current' => 'current',
'ui.admin.bbs_settings.system.title' => 'System Settings',
'ui.admin.bbs_settings.system.system_name' => 'System Name',
'ui.admin.bbs_settings.system.sysop_name' => 'Sysop Name',
'ui.admin.bbs_settings.system.select_admin_user' => 'Select an admin user.',
'ui.admin.bbs_settings.system.location' => 'Location',
'ui.admin.bbs_settings.system.timezone' => 'Timezone',
'ui.admin.bbs_settings.system.system_address' => 'System Address',
'ui.admin.bbs_settings.system.origin_line' => 'Origin Line',
'ui.admin.bbs_settings.system.save' => 'Save System Settings',
'ui.admin.bbs_settings.features.title' => 'BBS Features',
'ui.admin.bbs_settings.features.enable_webdoors' => 'Enable Webdoors',
'ui.admin.bbs_settings.features.inactive' => 'inactive',
'ui.admin.bbs_settings.features.activate' => 'Activate',
'ui.admin.bbs_settings.features.enable_shoutbox' => 'Enable Shoutbox',
'ui.admin.bbs_settings.features.enable_advertising' => 'Enable Advertising',
'ui.admin.bbs_settings.features.enable_voting_booth' => 'Enable Voting Booth',
'ui.admin.bbs_settings.features.enable_chat' => 'Enable Chat',
'ui.admin.bbs_settings.features.enable_file_areas' => 'Enable File Areas',
'ui.admin.bbs_settings.features.enable_guest_doors_page' => 'Enable Guest Doors Page',
'ui.admin.bbs_settings.features.guest_doors_page_help' => 'Shows a public /guest-doors page listing anonymous-accessible doors. Also shows a link on the login page.',
'ui.admin.bbs_settings.features.enable_bbs_directory' => 'Enable BBS Directory',
'ui.admin.bbs_settings.features.bbs_directory_help' => 'Shows the public /bbs-directory page and BBS Lists nav menu. When disabled, the page returns 404.',
'ui.admin.bbs_settings.features.enable_qwk' => 'Enable QWK Offline Mail',
'ui.admin.bbs_settings.features.qwk_help' => 'Allows users to download QWK packets and upload REP reply packets for offline mail reading.',
'ui.admin.bbs_settings.features.qwk_bbs_id' => 'QWK BBS ID',
'ui.admin.bbs_settings.features.qwk_bbs_id_help' => 'Up to 8 alphanumeric characters used as the packet identifier (BBSID). Changing this will break existing offline readers that have already configured this BBS.',
'ui.admin.bbs_settings.validation.qwk_bbs_id_invalid' => 'QWK BBS ID must be 1?8 letters or digits.',
'ui.qwk.download_failed_prefix' => 'Download failed: ',
'ui.qwk.basic_auth.title' => 'Automated download and upload',
'ui.qwk.basic_auth.description' => 'Offline mail tools and scripts can also use the QWK endpoints directly without a browser session.',
'ui.qwk.basic_auth.auth' => 'Use HTTP Basic Authentication with your normal BinktermPHP username and password.',
'ui.qwk.basic_auth.download_label' => 'Download packet',
'ui.qwk.basic_auth.upload_label' => 'Upload REP packet',
'ui.qwk.basic_auth.response_label' => 'Upload JSON response',
'ui.qwk.basic_auth.response_description' => 'The upload endpoint returns JSON with a success flag, the number of imported messages, the number skipped, and an array of processing errors.',
'ui.qwk.reset_confirm' => 'Reset to all subscribed areas? Your custom selection will be cleared.',
'ui.admin.bbs_settings.features.default_echo_interface' => 'Default Echo Interface',
'ui.admin.bbs_settings.features.echo_list_forum' => 'Echo List (Forum view)',
'ui.admin.bbs_settings.features.reader_message_list' => 'Reader (Message list)',
'ui.admin.bbs_settings.features.default_echo_help' => 'Default interface for viewing echomail. Users can override this in their settings.',
'ui.admin.bbs_settings.features.bulletin_display_mode' => 'Bulletin Display Mode',
'ui.admin.bbs_settings.features.bulletin_display_once' => 'Display once',
'ui.admin.bbs_settings.features.bulletin_display_always' => 'Always display',
'ui.admin.bbs_settings.features.bulletin_display_help' => 'Choose whether login bulletins are shown until read, or once at the start of every login session.',
'ui.admin.bbs_settings.features.max_cross_post_areas' => 'Max Cross-Post Areas',
'ui.admin.bbs_settings.features.max_cross_post_help' => 'Maximum number of additional areas a user can cross-post to (2-20).',
'ui.admin.bbs_settings.features.dashboard_ad_rotate_interval' => 'Dashboard Ad Rotate Interval',
'ui.admin.bbs_settings.features.dashboard_ad_rotate_interval_help' => 'How often dashboard ads auto-rotate, in seconds (5-300). Default is 20 seconds.',
'ui.admin.bbs_settings.features.outgoing_charset' => 'Default Outgoing Charset',
'ui.admin.bbs_settings.features.outgoing_charset_help' => 'Character set used for new outgoing FTN messages when no per-uplink override is set. Replies inherit the original message charset when possible.',
'ui.admin.bbs_settings.features.enable_public_files_index' => 'Enable Public Files Index',
'ui.admin.bbs_settings.features.public_files_index_help' => 'Shows a public /public-files page listing all public file areas. Also adds a nav link for guests. Requires a registered license.',
'ui.admin.bbs_settings.features.public_files_index_requires_license' => 'Public file area index requires a registered license.',
'ui.admin.bbs_settings.features.save' => 'Save Settings',
'ui.admin.bbs_settings.validation.dashboard_ad_rotate_interval_range' => 'Dashboard ad rotation interval must be an integer between 5 and 300 seconds.',
'ui.admin.bbs_settings.credits.title' => 'Credits System Configuration',
'ui.admin.bbs_settings.credits.enabled' => 'Credits System Enabled',
'ui.admin.bbs_settings.credits.currency_symbol' => 'Currency Symbol',
'ui.admin.bbs_settings.credits.currency_symbol_help' => 'Example: $, USD (max 5 characters). Leave blank for no symbol.',
'ui.admin.bbs_settings.credits.costs_and_fees' => 'Costs and Fees',
'ui.admin.bbs_settings.credits.rewards_and_bonuses' => 'Rewards and Bonuses',
'ui.admin.bbs_settings.credits.daily_login_bonus_amount' => 'Daily Login Bonus Amount',
'ui.admin.bbs_settings.credits.daily_login_bonus_help' => 'Amount of credits awarded to users on daily login.',
'ui.admin.bbs_settings.credits.daily_login_delay_minutes' => 'Daily Login Delay (minutes)',
'ui.admin.bbs_settings.credits.daily_login_delay_help' => 'Minutes after login before daily bonus is awarded.',
'ui.admin.bbs_settings.credits.new_user_approval_bonus' => 'New User Approval Bonus',
'ui.admin.bbs_settings.credits.new_user_approval_bonus_help' => 'Credits awarded when a pending user is approved.',
'ui.admin.bbs_settings.credits.new_user_14_day_bonus' => 'New User 14-Day Milestone Bonus',
'ui.admin.bbs_settings.credits.new_user_14_day_bonus_help' => 'One-time bonus awarded when user logs in 14+ days after account creation.',
'ui.admin.bbs_settings.credits.netmail_cost' => 'Netmail Cost',
'ui.admin.bbs_settings.credits.netmail_cost_help' => 'Credits charged when sending a netmail message.',
'ui.admin.bbs_settings.credits.echomail_reward' => 'Echomail Reward',
'ui.admin.bbs_settings.credits.echomail_reward_help' => 'Credits earned when posting an echomail message. Doubled when >= 1200 characters long.',
'ui.admin.bbs_settings.credits.crashmail_cost' => 'Crashmail Cost',
'ui.admin.bbs_settings.credits.crashmail_cost_help' => 'Credits charged when sending direct/crashmail delivery.',
'ui.admin.bbs_settings.credits.poll_creation_cost' => 'Poll Creation Cost',
'ui.admin.bbs_settings.credits.poll_creation_cost_help' => 'Credits charged when creating a new poll.',
'ui.admin.bbs_settings.credits.file_upload_cost' => 'File Upload Cost',
'ui.admin.bbs_settings.credits.file_upload_cost_help' => 'Credits charged to the acting user when uploading a file.',
'ui.admin.bbs_settings.credits.file_upload_reward' => 'File Upload Reward',
'ui.admin.bbs_settings.credits.file_upload_reward_help' => 'Credits awarded to the acting user after a successful file upload.',
'ui.admin.bbs_settings.credits.file_download_cost' => 'File Download Cost',
'ui.admin.bbs_settings.credits.file_download_cost_help' => 'Credits charged to the acting user when downloading a file.',
'ui.admin.bbs_settings.credits.file_download_reward' => 'File Download Reward',
'ui.admin.bbs_settings.credits.file_download_reward_help' => 'Credits awarded to the acting user after a successful file download.',
'ui.admin.bbs_settings.credits.ai_credits_per_milli_usd' => 'AI Credits per $0.001 Spent',
'ui.admin.bbs_settings.credits.ai_credits_per_milli_usd_help' => 'Credits charged to the user per $0.001 of AI provider cost incurred on their behalf. Set to 0 to disable.',
'ui.admin.bbs_settings.credits.transfer_fee_percentage' => 'Transfer Fee Percentage',
'ui.admin.bbs_settings.credits.transfer_fee_help' => 'Percentage of credit transfers taken as fee (0.05 = 5%). Distributed to sysops.',
'ui.admin.bbs_settings.credits.referral_system' => 'Referral System',
'ui.admin.bbs_settings.credits.enable_referral_system' => 'Enable Referral System',
'ui.admin.bbs_settings.credits.referral_bonus' => 'Referral Bonus',
'ui.admin.bbs_settings.credits.referral_bonus_help' => 'Credits awarded when a referred user is approved by admin.',
'ui.admin.bbs_settings.credits.save' => 'Save Credit Settings',
'ui.admin.bbs_settings.taglines.title' => 'Taglines',
'ui.admin.bbs_settings.taglines.one_per_line' => 'Taglines (one per line)',
'ui.admin.bbs_settings.taglines.placeholder' => 'One tagline per line.',
'ui.admin.bbs_settings.taglines.help' => 'These appear as selectable taglines when users compose messages.',
'ui.admin.bbs_settings.taglines.save' => 'Save Taglines',
'ui.admin.bbs_settings.validation.max_cross_post_areas_range' => 'Max cross-post areas must be an integer between 2 and 20.',
'ui.admin.bbs_settings.validation.currency_symbol_length' => 'Currency symbol must be 0-5 characters.',
'ui.admin.bbs_settings.validation.daily_login_amount_non_negative' => 'Daily login amount must be a non-negative integer.',
'ui.admin.bbs_settings.validation.daily_login_delay_non_negative' => 'Daily login delay must be a non-negative integer.',
'ui.admin.bbs_settings.validation.approval_bonus_non_negative' => 'Approval bonus must be a non-negative integer.',
'ui.admin.bbs_settings.validation.netmail_cost_non_negative' => 'Netmail cost must be a non-negative integer.',
'ui.admin.bbs_settings.validation.echomail_reward_non_negative' => 'Echomail reward must be a non-negative integer.',
'ui.admin.bbs_settings.validation.crashmail_cost_non_negative' => 'Crashmail cost must be a non-negative integer.',
'ui.admin.bbs_settings.validation.poll_creation_cost_non_negative' => 'Poll creation cost must be a non-negative integer.',
'ui.admin.bbs_settings.validation.file_upload_cost_non_negative' => 'File upload cost must be a non-negative integer.',
'ui.admin.bbs_settings.validation.file_upload_reward_non_negative' => 'File upload reward must be a non-negative integer.',
'ui.admin.bbs_settings.validation.file_download_cost_non_negative' => 'File download cost must be a non-negative integer.',
'ui.admin.bbs_settings.validation.file_download_reward_non_negative' => 'File download reward must be a non-negative integer.',
'ui.admin.bbs_settings.validation.ai_credits_per_milli_usd_non_negative' => 'AI credits per $0.001 must be a non-negative integer.',
'ui.admin.bbs_settings.validation.return_14_days_non_negative' => '14-day return bonus must be a non-negative integer.',
'ui.admin.bbs_settings.validation.transfer_fee_range' => 'Transfer fee must be between 0 and 1 (0% to 100%).',
'ui.admin.bbs_settings.validation.referral_bonus_non_negative' => 'Referral bonus must be a non-negative integer.',
'ui.admin.bbs_settings.validation.session_timeout_positive' => 'Session timeout must be a positive integer.',
'ui.admin.bbs_settings.validation.terminal_idle_warn_positive' => 'Idle warning timeout must be a positive integer.',
'ui.admin.bbs_settings.validation.terminal_idle_disconnect_positive' => 'Idle disconnect timeout must be a positive integer.',
'ui.admin.bbs_settings.validation.terminal_idle_disconnect_gt_warn' => 'Idle disconnect timeout must be greater than the warning timeout.',
'ui.admin.bbs_settings.terminal_server.title' => 'Terminal Server Settings',
'ui.admin.bbs_settings.terminal_server.default_shell' => 'Default interface style',
'ui.admin.bbs_settings.terminal_server.default_shell_help' => 'Used when a user\'s preference is set to Auto.',
'ui.admin.bbs_settings.terminal_server.shell_tui' => 'Full-screen TUI',
'ui.admin.bbs_settings.terminal_server.shell_line' => 'Line mode',
'ui.admin.bbs_settings.terminal_server.force_shell' => 'Force shell',
'ui.admin.bbs_settings.terminal_server.force_shell_help' => 'When enabled, all terminal sessions use the system default regardless of the user\'s own preference.',
'ui.admin.bbs_settings.terminal_server.save' => 'Save Terminal Server Settings',
'ui.admin.bbs_settings.terminal_server.save_failed' => 'Failed to save terminal server settings.',
'ui.admin.bbs_settings.terminal_server.saved_success' => 'Terminal server settings saved.',
'ui.admin.bbs_settings.terminal_idle.title' => 'Terminal Idle Timeout',
'ui.admin.bbs_settings.terminal_idle.warn_minutes' => 'Idle warning (minutes)',
'ui.admin.bbs_settings.terminal_idle.warn_minutes_help' => 'Show an \'Are you still there?\' prompt after this many minutes of inactivity.',
'ui.admin.bbs_settings.terminal_idle.disconnect_minutes' => 'Idle disconnect (minutes)',
'ui.admin.bbs_settings.terminal_idle.disconnect_minutes_help' => 'Disconnect the session if no key is pressed within this many minutes of the warning.',
'ui.admin.bbs_settings.terminal_idle.save' => 'Save Terminal Idle Settings',
'ui.admin.bbs_settings.terminal_idle.save_failed' => 'Failed to save terminal idle settings.',
'ui.admin.bbs_settings.terminal_idle.saved_success' => 'Terminal idle timeout settings saved.',
'ui.admin.bbs_settings.packet_bbs.title' => 'Packet BBS Settings',
'ui.admin.bbs_settings.packet_bbs.session_timeout_minutes' => 'Session Timeout (minutes)',
'ui.admin.bbs_settings.packet_bbs.session_timeout_help' => 'Inactive authenticated sessions expire after this many minutes.',
'ui.admin.bbs_settings.packet_bbs.allow_guest_who' => 'Allow Guest WHO',
'ui.admin.bbs_settings.packet_bbs.allow_guest_who_help' => 'Allow unauthenticated users to run the WHO command.',
'ui.admin.bbs_settings.packet_bbs.save' => 'Save Packet BBS Settings',
'ui.admin.bbs_settings.packet_bbs.save_failed' => 'Failed to save Packet BBS settings.',
'ui.admin.bbs_settings.packet_bbs.saved_success' => 'Packet BBS settings saved successfully.',
// Admin MRC Settings
'ui.admin.mrc_settings.page_title' => 'MRC Settings',
'ui.admin.mrc_settings.heading' => 'MRC Chat Settings',
'ui.admin.mrc_settings.note_label' => 'Note',
'ui.admin.mrc_settings.note_text' => 'MRC (Multi Relay Chat) is available as a WebDoor.',
'ui.admin.mrc_settings.note_enable_text' => 'Configure daemon settings here, then enable the door in the',
'ui.admin.mrc_settings.webdoors_admin' => 'WebDoors admin',
'ui.admin.mrc_settings.load_failed' => 'Failed to load MRC settings',
'ui.admin.mrc_settings.load_error' => 'Error loading MRC settings',
'ui.admin.mrc_settings.saved_success' => 'MRC settings saved successfully',
'ui.admin.mrc_settings.restart_required' => 'Settings saved. Restart the daemon to apply changes.',
'ui.admin.mrc_settings.save_failed' => 'Failed to save MRC settings',
'ui.admin.mrc_settings.save_error' => 'Error saving MRC settings',
'ui.admin.mrc_settings.general_settings' => 'General Settings',
'ui.admin.mrc_settings.enable_daemon' => 'Enable MRC Daemon',
'ui.admin.mrc_settings.server_connection' => 'Server Connection',
'ui.admin.mrc_settings.server_host' => 'MRC Server Host',
'ui.admin.mrc_settings.server_port_non_ssl' => 'Server Port (Non-SSL)',
'ui.admin.mrc_settings.server_port_ssl' => 'Server Port (SSL)',
'ui.admin.mrc_settings.use_ssl_connection' => 'Use SSL Connection',
'ui.admin.mrc_settings.use_ssl_help' => 'Recommended for secure communication',
'ui.admin.mrc_settings.save_general_settings' => 'Save General Settings',
'ui.admin.matterbridge_settings.heading' => 'Matterbridge Bridge Settings',
'ui.admin.matterbridge_settings.enabled' => 'Enable Matterbridge relay',
'ui.admin.matterbridge_settings.base_url' => 'Matterbridge API URL',
'ui.admin.matterbridge_settings.token' => 'API token',
'ui.admin.matterbridge_settings.timeout_seconds' => 'Timeout (seconds)',
'ui.admin.matterbridge_settings.username_suffix' => 'Default username suffix',
'ui.admin.matterbridge_settings.skip_tls_verify' => 'Skip TLS verification',
'ui.admin.matterbridge_settings.bridge_user_id' => 'Bridge user',
'ui.admin.matterbridge_settings.bridge_user_search_placeholder' => 'Search by username...',
'ui.admin.matterbridge_settings.bridge_user_id_help' => 'Account used to post inbound messages from remote platforms into local chat. Create a dedicated bridge user and select it here. Required for inbound bridging.',
'ui.admin.matterbridge_settings.help' => 'Local chat rooms can each point at a Matterbridge gateway below. Outbound room messages are relayed through the configured API endpoint. Inbound messages require the bridge user ID to be set and matterbridge_daemon.php to be running.',
'ui.admin.matterbridge_settings.save' => 'Save Matterbridge Settings',
'ui.admin.matterbridge_settings.load_failed' => 'Error loading Matterbridge settings',
'ui.admin.matterbridge_settings.saved_success' => 'Matterbridge settings saved successfully',
'ui.admin.matterbridge_settings.save_failed' => 'Error saving Matterbridge settings',
'ui.admin.mrc_settings.bbs_identity' => 'BBS Identity',
'ui.admin.mrc_settings.bbs_name' => 'BBS Name',
'ui.admin.mrc_settings.bbs_name_help' => 'Maximum 64 characters',
'ui.admin.mrc_settings.platform_info' => 'Platform Info',
'ui.admin.mrc_settings.platform_info_help' => 'Software and platform identifier',
'ui.admin.mrc_settings.sysop_name' => 'Sysop Name',
'ui.admin.mrc_settings.bbs_information' => 'BBS Information',
'ui.admin.mrc_settings.website_url' => 'Website URL',
'ui.admin.mrc_settings.info_optional_help' => 'Optional - for INFO command',
'ui.admin.mrc_settings.telnet_address' => 'Telnet Address',
'ui.admin.mrc_settings.bbs_description' => 'BBS Description',
'ui.admin.mrc_settings.placeholder.server_host' => 'mrc.bottomlessabyss.net',
'ui.admin.mrc_settings.placeholder.bbs_name' => 'BinktermPHP BBS',
'ui.admin.mrc_settings.placeholder.platform' => 'BINKTERMPHP/Linux64/1.3.0',
'ui.admin.mrc_settings.placeholder.sysop' => 'Sysop',
'ui.admin.mrc_settings.placeholder.website' => 'https://example.com',
'ui.admin.mrc_settings.placeholder.telnet' => 'telnet://bbs.example.com:23',
'ui.admin.mrc_settings.placeholder.description' => 'A modern BBS...',
'ui.admin.mrc_settings.save_identity_settings' => 'Save Identity Settings',
'ui.admin.mrc_settings.connection_settings' => 'Connection Settings',
'ui.admin.mrc_settings.auto_reconnect' => 'Auto-Reconnect',
'ui.admin.mrc_settings.auto_reconnect_help' => 'Automatically reconnect if connection is lost',
'ui.admin.mrc_settings.reconnect_delay' => 'Reconnect Delay (seconds)',
'ui.admin.mrc_settings.reconnect_delay_help' => 'Wait time before reconnecting (5-300 seconds)',
'ui.admin.mrc_settings.ping_interval' => 'Ping Interval (seconds)',
'ui.admin.mrc_settings.ping_interval_help' => 'Expected PING interval from server (30-300 seconds)',
'ui.admin.mrc_settings.keepalive_timeout' => 'Keepalive Timeout (seconds)',
'ui.admin.mrc_settings.keepalive_timeout_help' => 'Disconnect if no PING received (60-600 seconds)',
'ui.admin.mrc_settings.save_connection_settings' => 'Save Connection Settings',
'ui.admin.mrc_settings.room_settings' => 'Room Settings',
'ui.admin.mrc_settings.default_room' => 'Default Room',
'ui.admin.mrc_settings.default_room_help' => 'Default room for new connections',
'ui.admin.mrc_settings.auto_join_rooms' => 'Auto-Join Rooms',
'ui.admin.mrc_settings.auto_join_rooms_help' => 'Comma-separated list of rooms to join automatically',
'ui.admin.mrc_settings.message_settings' => 'Message Settings',
'ui.admin.mrc_settings.max_message_length' => 'Max Message Length',
'ui.admin.mrc_settings.max_message_length_help' => 'Maximum characters per message (80-255)',
'ui.admin.mrc_settings.history_limit' => 'History Limit',
'ui.admin.mrc_settings.history_limit_help' => 'Messages to keep per room (100-10000)',
'ui.admin.mrc_settings.prune_after_days' => 'Prune After (days)',
'ui.admin.mrc_settings.prune_after_days_help' => 'Delete messages older than this (1-365 days)',
'ui.admin.mrc_settings.save_room_settings' => 'Save Room Settings',
// Admin Activity Stats
'ui.admin.activity_stats.page_title' => 'Activity Statistics',
'ui.admin.activity_stats.heading' => 'Activity Statistics',
'ui.admin.activity_stats.period' => 'Period',
'ui.admin.activity_stats.period_7d' => 'Last 7 Days',
'ui.admin.activity_stats.period_30d' => 'Last 30 Days',
'ui.admin.activity_stats.period_90d' => 'Last 90 Days',
'ui.admin.activity_stats.period_all' => 'All Time',
'ui.admin.activity_stats.exclude_admins' => 'Exclude admins',
'ui.admin.activity_stats.dashboard' => 'Dashboard',
'ui.admin.activity_stats.loading_activity_data' => 'Loading activity data...',
'ui.admin.activity_stats.tab_overview' => 'Overview',
'ui.admin.activity_stats.tab_popular_areas' => 'Popular Areas',
'ui.admin.activity_stats.tab_doors' => 'Doors',
'ui.admin.activity_stats.tab_file_activity' => 'File Activity',
'ui.admin.activity_stats.tab_nodelist' => 'Nodelist',
'ui.admin.activity_stats.tab_top_users' => 'Top Users',
'ui.admin.activity_stats.tab_hourly' => 'Hourly',
'ui.admin.activity_stats.activity_by_category' => 'Activity by Category',
'ui.admin.activity_stats.category' => 'Category',
'ui.admin.activity_stats.events' => 'Events',
'ui.admin.activity_stats.daily_activity_last_30' => 'Daily Activity (last 30 days)',
'ui.admin.activity_stats.date' => 'Date',
'ui.admin.activity_stats.most_viewed_echoareas' => 'Most Viewed Echoareas',
'ui.admin.activity_stats.most_active_echoareas' => 'Most Active Echoareas (posts)',
'ui.admin.activity_stats.area' => 'Area',
'ui.admin.activity_stats.views' => 'Views',
'ui.admin.activity_stats.posts' => 'Posts',
'ui.admin.activity_stats.most_played_webdoors' => 'Most Played WebDoors',
'ui.admin.activity_stats.most_played_dos_doors' => 'Most Played DOS Doors',
'ui.admin.activity_stats.game' => 'Game',
'ui.admin.activity_stats.door' => 'Door',
'ui.admin.activity_stats.sessions' => 'Sessions',
'ui.admin.activity_stats.top_downloaded_files' => 'Top Downloaded Files',
'ui.admin.activity_stats.file' => 'File',
'ui.admin.activity_stats.downloads' => 'Downloads',
'ui.admin.activity_stats.most_browsed_file_areas' => 'Most Browsed File Areas',
'ui.admin.activity_stats.most_searched_nodelist_queries' => 'Most Searched Nodelist Queries',
'ui.admin.activity_stats.query' => 'Query',
'ui.admin.activity_stats.searches' => 'Searches',
'ui.admin.activity_stats.most_viewed_nodes' => 'Most Viewed Nodes',
'ui.admin.activity_stats.node' => 'Node',
'ui.admin.activity_stats.most_active_users' => 'Most Active Users',
'ui.admin.activity_stats.user' => 'User',
'ui.admin.activity_stats.activity_by_hour_of_day' => 'Activity by Hour of Day',
'ui.admin.activity_stats.hour' => 'Hour',
'ui.admin.activity_stats.utc' => 'UTC',
'ui.admin.activity_stats.no_data_for_period' => 'No data for this period',
'ui.admin.activity_stats.no_data' => 'No data',
'ui.admin.activity_stats.failed_load_statistics_prefix' => 'Failed to load statistics. ',
'ui.admin.activity_stats.echomail' => 'Echomail',
'ui.admin.activity_stats.netmail' => 'Netmail',
'ui.admin.activity_stats.files' => 'Files',
'ui.admin.activity_stats.door_plays' => 'Door Plays',
'ui.admin.activity_stats.logins' => 'Logins',
'ui.admin.activity_stats.total' => 'Total',
'ui.admin.activity_stats.views_sent' => 'Views: {views} - Sent: {sent}',
'ui.admin.activity_stats.read_sent' => 'Read: {read} - Sent: {sent}',
'ui.admin.activity_stats.area_views' => 'Area Views',
'ui.admin.activity_stats.sent' => 'Sent',
'ui.admin.activity_stats.read' => 'Read',
'ui.admin.activity_stats.doors' => 'Doors',
'ui.admin.activity_stats.nodelist' => 'Nodelist',
'ui.admin.activity_stats.chat' => 'Chat',
'ui.admin.activity_stats.auth' => 'Auth',
'ui.admin.activity_stats.anonymous' => '(anon)',
'ui.admin.activity_stats.tab_interests' => 'Popular Interests',
'ui.admin.activity_stats.popular_interests' => 'Popular Interests by Subscribers',
'ui.admin.activity_stats.interest' => 'Interest',
'ui.admin.activity_stats.subscribers' => 'Subscribers',
// Ad Analytics page
'ui.admin.ad_analytics.page_title' => 'Ad Analytics',
'ui.admin.ad_analytics.heading' => 'Ad Analytics',
'ui.admin.ad_analytics.period' => 'Period',
'ui.admin.ad_analytics.period_7d' => 'Last 7 Days',
'ui.admin.ad_analytics.period_30d' => 'Last 30 Days',
'ui.admin.ad_analytics.period_90d' => 'Last 90 Days',
'ui.admin.ad_analytics.period_all' => 'All Time',
'ui.admin.ad_analytics.content_library' => 'Content Library',
'ui.admin.ad_analytics.total_impressions' => 'Total Impressions',
'ui.admin.ad_analytics.total_clicks' => 'Total Clicks',
'ui.admin.ad_analytics.overall_ctr' => 'Overall CTR',
'ui.admin.ad_analytics.active_ads' => 'Active / Total Ads',
'ui.admin.ad_analytics.daily_activity' => 'Daily Activity',
'ui.admin.ad_analytics.per_ad_breakdown' => 'Per-Ad Breakdown',
'ui.admin.ad_analytics.impressions' => 'Impressions',
'ui.admin.ad_analytics.clicks' => 'Clicks',
'ui.admin.ad_analytics.ctr' => 'CTR',
'ui.admin.ad_analytics.ctr_bar' => 'Relative Reach',
'ui.admin.ad_analytics.last_impression' => 'Last Seen',
'ui.admin.ad_analytics.last_click' => 'Last Click',
'ui.admin.ad_analytics.no_data' => 'No activity in this period.',
'ui.admin.ad_analytics.no_ads' => 'No ads found.',
// BinkStream Test
'ui.admin.sse_test.page_title' => 'BinkStream Diagnostics',
'ui.admin.sse_test.heading' => 'BinkStream Diagnostics',
'ui.admin.sse_test.interval' => 'Event interval',
'ui.admin.sse_test.duration' => 'Duration',
'ui.admin.sse_test.payload' => 'Payload size',
'ui.admin.sse_test.payload_none' => 'None',
'ui.admin.sse_test.start' => 'Start',
'ui.admin.sse_test.stop' => 'Stop',
'ui.admin.sse_test.clear' => 'Clear',
'ui.admin.sse_test.status_idle' => 'Idle',
'ui.admin.sse_test.status_connecting' => 'Connecting?',
'ui.admin.sse_test.status_connected' => 'Connected',
'ui.admin.sse_test.status_done' => 'Done',
'ui.admin.sse_test.status_error' => 'Error',
'ui.admin.sse_test.stat_events' => 'Events received',
'ui.admin.sse_test.stat_missed' => 'Missed events',
'ui.admin.sse_test.stat_latency' => 'Avg latency (p95)',
'ui.admin.sse_test.stat_gap_dev' => 'Avg gap deviation (max)',
'ui.admin.sse_test.latency_chart' => 'Latency over time',
'ui.admin.sse_test.chart_note' => 'Latency = client receipt time ? server send time (requires synced clocks for absolute accuracy)',
'ui.admin.sse_test.event_log' => 'Event log',
'ui.admin.sse_test.log_note' => 'Most recent first · max 200 rows',
'ui.admin.sse_test.col_seq' => 'Seq',
'ui.admin.sse_test.col_server_ts' => 'Server ts (ms)',
'ui.admin.sse_test.col_client_ts' => 'Client ts (ms)',
'ui.admin.sse_test.col_latency' => 'Latency',
'ui.admin.sse_test.col_gap' => 'Inter-event gap',
'ui.admin.sse_test.col_gap_dev' => 'Gap deviation',
'ui.admin.sse_test.col_note' => 'Note',
'ui.admin.ai_usage.page_title' => 'AI Usage',
'ui.admin.ai_usage.heading' => 'AI Usage',
'ui.admin.ai_usage.dashboard' => 'Dashboard',
'ui.admin.ai_usage.period' => 'Period',
'ui.admin.ai_usage.period_1d' => 'Last 24 Hours',
'ui.admin.ai_usage.period_7d' => 'Last 7 Days',
'ui.admin.ai_usage.period_30d' => 'Last 30 Days',
'ui.admin.ai_usage.period_all' => 'All Time',
'ui.admin.ai_usage.summary_requests' => 'Requests',
'ui.admin.ai_usage.summary_cost' => 'Estimated Cost',
'ui.admin.ai_usage.summary_failures' => 'Failures',
'ui.admin.ai_usage.summary_tokens' => 'Tokens',
'ui.admin.ai_usage.by_feature' => 'Cost by Feature',
'ui.admin.ai_usage.by_provider_model' => 'Cost by Provider and Model',
'ui.admin.ai_usage.recent_failures' => 'Recent Failures',
'ui.admin.ai_usage.recent_requests' => 'Recent Requests',
'ui.admin.ai_usage.feature' => 'Feature',
'ui.admin.ai_usage.provider_model' => 'Provider / Model',
'ui.admin.ai_usage.requests' => 'Requests',
'ui.admin.ai_usage.failures' => 'Failures',
'ui.admin.ai_usage.cost' => 'Cost',
'ui.admin.ai_usage.tokens' => 'tokens',
'ui.admin.ai_usage.status' => 'Status',
'ui.admin.ai_usage.created_at' => 'Created',
'ui.admin.ai_usage.error' => 'Error',
'ui.admin.ai_usage.no_data' => 'No data for this period',
'ui.admin.ai_usage.unavailable' => 'AI request ledger not available',
'ui.admin.ai_usage.unavailable_help' => 'Run setup or apply the AI request accounting migration to populate this page.',
'ui.admin.ai_usage.input_tokens' => 'In',
'ui.admin.ai_usage.output_tokens' => 'Out',
'ui.admin.ai_usage.cached_tokens' => 'Cached',
'ui.admin.ai_usage.token_breakdown' => '{input} in / {output} out',
'ui.admin.sharing.page_title' => 'Sharing',
'ui.admin.sharing.heading' => 'Sharing',
'ui.admin.sharing.dashboard' => 'Dashboard',
'ui.admin.sharing.help' => 'Review active shared messages and files, ranked by view count.',
'ui.admin.sharing.loading' => 'Loading sharing data...',
'ui.admin.sharing.messages_tab' => 'Messages',
'ui.admin.sharing.files_tab' => 'Files',
'ui.admin.sharing.messages_heading' => 'Shared Messages',
'ui.admin.sharing.files_heading' => 'Shared Files',
'ui.admin.sharing.subject' => 'Subject',
'ui.admin.sharing.file' => 'File',
'ui.admin.sharing.area' => 'Area',
'ui.admin.sharing.shared_by' => 'Shared By',
'ui.admin.sharing.views' => 'Views',
'ui.admin.sharing.top_referrers' => 'Top Referrers',
'ui.admin.sharing.last_accessed' => 'Last Accessed',
'ui.admin.sharing.access' => 'Access',
'ui.admin.sharing.open' => 'Open',
'ui.admin.sharing.public' => 'Public',
'ui.admin.sharing.private' => 'Private',
'ui.admin.sharing.freq_enabled' => 'FREQ',
'ui.admin.sharing.web_only' => 'Web only',
'ui.admin.sharing.never' => 'Never',
'ui.admin.sharing.no_messages' => 'No active shared messages',
'ui.admin.sharing.no_files' => 'No active shared files',
'ui.admin.sharing.no_referrers' => 'No external referrers yet',
'ui.admin.sharing.load_failed' => 'Failed to load sharing data',
// Admin Economy Viewer
'ui.admin.referrals.page_title' => 'Referral Analytics',
'ui.admin.referrals.heading' => 'Referral Analytics',
'ui.admin.referrals.back' => 'Dashboard',
'ui.admin.referrals.loading' => 'Loading referral data...',
'ui.admin.referrals.load_failed' => 'Failed to load referral data',
'ui.admin.referrals.top_referrers' => 'Top Referrers',
'ui.admin.referrals.recent_signups' => 'Recent Referral Signups',
'ui.admin.referrals.col_user' => 'User',
'ui.admin.referrals.col_code' => 'Referral Code',
'ui.admin.referrals.col_signups' => 'Signups',
'ui.admin.referrals.col_bonus' => 'Bonus Earned',
'ui.admin.referrals.col_referred_by' => 'Referred By',
'ui.admin.referrals.col_joined' => 'Joined',
'ui.admin.referrals.no_referrers' => 'No referrals recorded yet.',
'ui.admin.referrals.no_recent' => 'No referral signups yet.',
'ui.admin.referrals.stat_referred_users' => 'Referred Users',
'ui.admin.referrals.stat_active_referrers' => 'Active Referrers',
'ui.admin.economy.page_title' => 'Economy Viewer',
'ui.admin.economy.heading' => 'Economy Viewer',
'ui.admin.economy.period' => 'Period:',
'ui.admin.economy.period_7d' => 'Last 7 Days',
'ui.admin.economy.period_30d' => 'Last 30 Days',
'ui.admin.economy.period_90d' => 'Last 90 Days',
'ui.admin.economy.period_all' => 'All Time',
'ui.admin.economy.dashboard' => 'Dashboard',
'ui.admin.economy.loading_statistics' => 'Loading economy statistics...',
'ui.admin.economy.period_snapshot' => 'Period Snapshot',
'ui.admin.economy.transactions' => 'Transactions',
'ui.admin.economy.active_users' => 'Active Users',
'ui.admin.economy.credits_earned' => 'Credits Earned',
'ui.admin.economy.credits_spent' => 'Credits Spent',
'ui.admin.economy.net_flow' => 'Net Flow',
'ui.admin.economy.current_distribution' => 'Current Distribution',
'ui.admin.economy.funded_users' => 'Funded Users',
'ui.admin.economy.average_balance' => 'Average Balance',
'ui.admin.economy.median_balance' => 'Median Balance',
'ui.admin.economy.largest_balance' => 'Largest Balance',
'ui.admin.economy.richest_user' => 'Richest User',
'ui.admin.economy.transaction_types' => 'Transaction Types',
'ui.admin.economy.type' => 'Type',
'ui.admin.economy.count' => 'Count',
'ui.admin.economy.net' => 'Net',
'ui.admin.economy.top_earners' => 'Top Earners',
'ui.admin.economy.user' => 'User',
'ui.admin.economy.tx_short' => 'Tx',
'ui.admin.economy.earned' => 'Earned',
'ui.admin.economy.spent' => 'Spent',
'ui.admin.economy.top_spenders' => 'Top Spenders',
'ui.admin.economy.richest_accounts' => 'Richest Accounts',
'ui.admin.economy.balance' => 'Balance',
'ui.admin.economy.recent_transactions' => 'Recent Transactions',
'ui.admin.economy.amount' => 'Amount',
'ui.admin.economy.na' => 'n/a',
'ui.admin.economy.credits_in_circulation' => 'Credits In Circulation',
'ui.admin.economy.funded_wallets' => 'Funded Wallets',
'ui.admin.economy.credits_disabled_notice' => 'Credits are currently disabled. Historical balances and ledger data are still shown.',
'ui.admin.economy.users' => 'users',
'ui.admin.economy.no_transactions_period' => 'No transactions for this period',
'ui.admin.economy.no_earning_activity_period' => 'No earning activity for this period',
'ui.admin.economy.no_spending_activity_period' => 'No spending activity for this period',
'ui.admin.economy.no_funded_users_yet' => 'No funded users yet',
'ui.admin.economy.no_description' => 'No description',
'ui.admin.economy.bal_short' => 'Bal',
'ui.admin.economy.no_recent_transactions_period' => 'No recent transactions in this period',
'ui.admin.economy.load_failed' => 'Failed to load economy statistics',
// File Areas Page
'ui.fileareas.page_title' => 'File Areas',
'ui.fileareas.heading' => 'File Areas Management',
'ui.fileareas.add_file_area' => 'Add File Area',
'ui.fileareas.edit_file_area' => 'Edit File Area',
'ui.fileareas.list_title' => 'File Areas',
'ui.fileareas.loading_file_areas' => 'Loading file areas...',
'ui.fileareas.load_failed' => 'Failed to load file areas',
'ui.fileareas.load_details_failed' => 'Failed to load file area details',
'ui.fileareas.updated_success' => 'File area updated',
'ui.fileareas.created_success' => 'File area created',
'ui.fileareas.deleted_success' => 'File area deleted',
'ui.fileareas.active_areas' => 'Active Areas:',
'ui.fileareas.total_files' => 'Total Files:',
'ui.fileareas.total_size' => 'Total Size:',
'ui.fileareas.settings_title' => 'File Area Settings',
'ui.fileareas.replace_existing_label' => 'Replace Existing:',
'ui.fileareas.replace_existing_help' => 'When enabled, new files with the same name replace old ones (useful for NODELIST, etc.)',
'ui.fileareas.versioning_label' => 'Versioning:',
'ui.fileareas.versioning_help' => 'When disabled, files with duplicate names get version suffixes (_1, _2, etc.)',
'ui.fileareas.tag_required' => 'Tag *',
'ui.fileareas.tag_help' => 'File area tag (e.g., NODELIST, GENERAL_FILES)',
'ui.fileareas.tag_readonly' => 'Tag cannot be changed after creation.',
'ui.fileareas.description_required' => 'Description *',
'ui.fileareas.description_help' => 'Brief description of the file area',
'ui.fileareas.network_domain' => 'Network domain',
'ui.fileareas.max_file_size_mb' => 'Max File Size (MB)',
'ui.fileareas.maximum_file_size' => 'Maximum file size',
'ui.fileareas.tic_password_optional' => 'TIC Password (Optional)',
'ui.fileareas.tic_password_help' => 'File echo password for TIC files (FSC-87 Pw field)',
'ui.fileareas.allowed_extensions' => 'Allowed Extensions',
'ui.fileareas.extensions_placeholder_allowed' => 'e.g., zip,txt,pdf',
'ui.fileareas.allowed_extensions_help' => 'Comma-separated list (leave empty for all)',
'ui.fileareas.blocked_extensions' => 'Blocked Extensions',
'ui.fileareas.extensions_placeholder_blocked' => 'e.g., exe,bat,sh',
'ui.fileareas.blocked_extensions_help' => 'Comma-separated list',
'ui.fileareas.replace_existing_files' => 'Replace Existing Files',
'ui.fileareas.replace_existing_files_help' => 'Replace files with same name instead of versioning',
'ui.fileareas.allow_duplicate_content' => 'Allow Duplicate Content',
'ui.fileareas.allow_duplicate_content_help' => 'Allow same file content (hash) with different filenames',
'ui.fileareas.local_only' => 'Local Only',
'ui.fileareas.local_only_help' => "Don't forward files to uplinks",
'ui.fileareas.gemini_public' => 'Gemini Public',
'ui.fileareas.gemini_public_help' => 'List and serve files in this area via the Gemini capsule server',
'ui.fileareas.freq_enabled' => 'FREQ Enabled',
'ui.fileareas.freq_enabled_help' => 'Allow any FidoNet node to request files from this area via FREQ',
'ui.fileareas.freq_password' => 'FREQ Password',
'ui.fileareas.freq_password_placeholder' => 'Optional password',
'ui.fileareas.freq_password_help' => 'Leave blank for open access',
'ui.fileareas.is_public' => 'Public File Area',
'ui.fileareas.is_public_help' => 'Allow unauthenticated visitors to browse and download files in this area',
'ui.fileareas.is_public_requires_license' => 'Public file areas require a registered license.',
'ui.files.freq_accessible' => 'FREQ Accessible',
'ui.files.freq_accessible_help' => 'Also allow this file to be requested via FidoNet FREQ',
'ui.freq.status_pending' => 'FREQ Pending',
'ui.freq.status_fulfilled' => 'FREQ Fulfilled',
'ui.freq.status_denied' => 'FREQ Denied',
'ui.fileareas.upload_permission' => 'Upload Permission',
'ui.fileareas.upload_users_can_upload' => 'Users Can Upload',
'ui.fileareas.upload_admin_only' => 'Admin Only',
'ui.fileareas.upload_read_only' => 'Read-Only (No Uploads)',
'ui.fileareas.upload_permission_help' => 'Control who can upload files to this area',
'ui.fileareas.virus_scanning' => 'Virus Scanning',
'ui.fileareas.virus_scanning_help' => 'Scan uploaded files for viruses (requires ClamAV)',
'ui.fileareas.file_area_is_active' => 'File area is active',
'ui.fileareas.edit_rules' => 'Edit Rules',
'ui.fileareas.delete_confirm_prefix' => 'Are you sure you want to delete this file area:',
'ui.fileareas.delete_confirm_warning' => 'This will also delete all files in this area!',
'ui.fileareas.no_file_areas_found' => 'No file areas found',
'ui.fileareas.tag' => 'Tag',
'ui.fileareas.files' => 'Files',
'ui.fileareas.size' => 'Size',
'ui.fileareas.local' => 'Local',
'ui.fileareas.replace' => 'Replace',
'ui.fileareas.comment_area' => 'Comments Echo Area',
'ui.fileareas.comment_area_help' => 'Select an echo area to enable file comments. Saved with the file area.',
'ui.fileareas.comment_area_placeholder' => 'New echo area tag (e.g. MYFILES-COMMENTS)',
'ui.fileareas.comment_area_linked' => 'Comment area linked',
'ui.fileareas.comment_area_create_new' => 'Create new echo area',
'ui.fileareas.comment_area_create_help' => 'A new local echo area will be created with this tag.',
'ui.fileareas.lovlynet_issue_title' => 'LovlyNet recommended settings mismatch',
'ui.fileareas.lovlynet_issue_readonly_on' => 'LovlyNet recommends making this area read-only',
'ui.fileareas.lovlynet_issue_readonly_off' => 'LovlyNet recommends allowing uploads in this area',
// Admin Auto Feed
'ui.admin.auto_feed.load_details_failed' => 'Failed to load feed details',
'ui.admin.auto_feed.operation_failed' => 'Operation failed',
'ui.admin.auto_feed.deleted_success' => 'Feed deleted successfully',
'ui.admin.auto_feed.updated_success' => 'Feed updated successfully',
'ui.admin.auto_feed.created_success' => 'Feed created successfully',
'ui.admin.auto_feed.delete_failed' => 'Delete failed',
'ui.admin.auto_feed.check_failed' => 'Check failed',
'ui.admin.auto_feed.checked_articles_posted' => 'Feed checked: {count} new article(s) posted',
'ui.admin.auto_feed.page_title' => 'Auto Feed',
'ui.admin.auto_feed.heading' => 'Auto Feed',
'ui.admin.auto_feed.statistics' => 'Statistics',
'ui.admin.auto_feed.total_feeds' => 'Total Feeds',
'ui.admin.auto_feed.add_feed' => 'Add Feed',
'ui.admin.auto_feed.edit_feed' => 'Edit Feed',
'ui.admin.auto_feed.rss_atom_feeds' => 'RSS/Atom Feeds',
'ui.admin.auto_feed.feed_sources' => 'Feed Sources',
'ui.admin.auto_feed.loading_feeds' => 'Loading feeds...',
'ui.admin.auto_feed.loading_echo_areas' => 'Loading echo areas...',
'ui.admin.auto_feed.loading_users' => 'Loading users...',
'ui.admin.auto_feed.active_label' => 'Active',
'ui.admin.auto_feed.inactive_label' => 'Inactive',
'ui.admin.auto_feed.articles_posted' => 'Articles Posted',
'ui.admin.auto_feed.about_title' => 'About',
'ui.admin.auto_feed.about_text' => 'Auto Feed monitors RSS/Atom and Bluesky sources and automatically posts new items to specified echoareas.',
'ui.admin.auto_feed.cron_hint_prefix' => 'Run',
'ui.admin.auto_feed.cron_hint_suffix' => 'via cron to check feeds periodically.',
'ui.admin.auto_feed.feed_name' => 'Feed Name',
'ui.admin.auto_feed.feed_name_placeholder' => 'e.g., Tech News, BBC Headlines',
'ui.admin.auto_feed.feed_name_help' => 'Friendly name for this feed',
'ui.admin.auto_feed.feed_url_required' => 'Feed URL *',
'ui.admin.auto_feed.feed_url_placeholder' => 'https://example.com/feed.rss',
'ui.admin.auto_feed.feed_url_help' => 'RSS/Atom feed URL or Bluesky profile URL',
'ui.admin.auto_feed.source_type' => 'Source Type',
'ui.admin.auto_feed.source_type_rss' => 'RSS/Atom',
'ui.admin.auto_feed.source_type_bluesky' => 'Bluesky',
'ui.admin.auto_feed.source_type_help' => 'Choose how Auto Feed should read this source',
'ui.admin.auto_feed.echo_area_required' => 'Echo Area *',
'ui.admin.auto_feed.echo_area' => 'Echo Area',
'ui.admin.auto_feed.echo_area_help' => 'Echo area to post articles to',
'ui.admin.auto_feed.post_as_user_required' => 'Post As User *',
'ui.admin.auto_feed.post_as' => 'Post As',
'ui.admin.auto_feed.post_as_user_help' => 'User account to post messages as',
'ui.admin.auto_feed.user_search_placeholder' => 'Type a username or real name...',
'ui.admin.auto_feed.searching_users' => 'Searching users...',
'ui.admin.auto_feed.user_search_failed' => 'User search failed',
'ui.admin.auto_feed.no_users_found' => 'No users found',
'ui.admin.auto_feed.no_real_name' => 'No real name',
'ui.admin.auto_feed.select_valid_user' => 'Select a valid user from the search results',
'ui.admin.auto_feed.max_articles' => 'Max Articles',
'ui.admin.auto_feed.per_check' => 'Per check',
'ui.admin.auto_feed.confirm_delete_title' => 'Confirm Delete',
'ui.admin.auto_feed.confirm_delete_text_prefix' => 'Are you sure you want to delete the feed',
'ui.admin.auto_feed.confirm_delete_warning' => 'This action cannot be undone.',
'ui.admin.auto_feed.invalid_api_response' => 'Invalid API response',
'ui.admin.auto_feed.failed_to_load_feeds_prefix' => 'Failed to load feeds:',
'ui.admin.auto_feed.no_feeds_configured' => 'No feeds configured',
'ui.admin.auto_feed.never' => 'Never',
'ui.admin.auto_feed.unnamed_feed' => 'Unnamed Feed',
'ui.admin.auto_feed.unknown' => 'Unknown',
'ui.admin.auto_feed.check_now' => 'Check now',
'ui.admin.auto_feed.checking_feed' => 'Checking feed...',
'ui.admin.auto_feed.select_echo_area' => 'Select echo area...',
'ui.admin.auto_feed.name_url' => 'Name/URL',
'ui.admin.auto_feed.articles' => 'Articles',
'ui.admin.auto_feed.last_check' => 'Last Check',
'ui.admin.auto_feed.actions' => 'Actions',
'ui.admin.auto_feed.user_prefix' => 'User #',
'ui.admin.auto_feed.thread_replies' => 'Thread Replies',
'ui.admin.auto_feed.thread_replies_help' => 'Attempt to thread reply messages by matching RE:/Fwd: subject prefixes against existing echomail in this area',
'ui.admin.auto_feed.thread_lookup_limit' => 'Thread Lookup Limit',
'ui.admin.auto_feed.thread_lookup_limit_help' => 'Number of recent messages to scan when searching for a reply parent',
// Echo Areas Page
'ui.echoareas.page_title' => 'Echo Areas',
'ui.echoareas.heading' => 'Echo Areas Management',
'ui.echoareas.add_echo_area' => 'Add Echo Area',
'ui.echoareas.edit_echo_area' => 'Edit Echo Area',
'ui.echoareas.active_echo_areas' => 'Active Echo Areas',
'ui.echoareas.search_tags_placeholder' => 'Search tags...',
'ui.echoareas.loading_echo_areas' => 'Loading echo areas...',
'ui.echoareas.statistics' => 'Statistics',
'ui.echoareas.active_areas' => 'Active Areas:',
'ui.echoareas.total_messages' => 'Total Messages:',
'ui.echoareas.todays_messages' => "Today's Messages:",
'ui.echoareas.color_legend' => 'Color Legend',
'ui.echoareas.color_legend_help' => 'Echo areas can be color-coded for easy identification:',
'ui.echoareas.color_green' => 'Green',
'ui.echoareas.color_blue' => 'Blue',
'ui.echoareas.color_red' => 'Red',
'ui.echoareas.color_yellow' => 'Yellow',
'ui.echoareas.color_purple' => 'Purple',
'ui.echoareas.color_orange' => 'Orange',
'ui.echoareas.color_teal' => 'Teal',
'ui.echoareas.color_cyan' => 'Cyan',
'ui.echoareas.color_light_blue' => 'Light Blue',
'ui.echoareas.color_indigo' => 'Indigo',
'ui.echoareas.color_pink' => 'Pink',
'ui.echoareas.color_gray' => 'Gray',
'ui.echoareas.legend_general_topics' => 'General topics',
'ui.echoareas.legend_technical_testing' => 'Technical/Testing',
'ui.echoareas.legend_important_official' => 'Important/Official',
'ui.echoareas.legend_administrative' => 'Administrative',
'ui.echoareas.legend_special_interest' => 'Special interest',
'ui.echoareas.legend_regional' => 'Regional',
'ui.echoareas.tag_required' => 'Tag *',
'ui.echoareas.tag_help' => 'Echo area tag (e.g., FIDONET.GEN, LOCAL.TEST)',
'ui.echoareas.description_required' => 'Description *',
'ui.echoareas.description_help' => 'Brief description of the echo area',
'ui.echoareas.lovlynet_sync_button' => 'Sync',
'ui.echoareas.lovlynet_sync_button_loading' => 'Syncing...',
'ui.echoareas.lovlynet_sync_success' => 'Description updated from LovlyNet',
'ui.echoareas.lovlynet_sync_failed' => 'Failed to sync description from LovlyNet',
'ui.echoareas.lovlynet_issue_title' => 'LovlyNet recommended settings mismatch',
'ui.echoareas.lovlynet_issue_sysop_only_on' => 'LovlyNet recommends enabling Sysop Access Only',
'ui.echoareas.lovlynet_issue_sysop_only_off' => 'LovlyNet recommends disabling Sysop Access Only',
'ui.echoareas.uplink_address' => 'Uplink Address',
'ui.echoareas.uplink_address_help' => 'Override Uplink FidoNet address',
'ui.echoareas.color' => 'Color',
'ui.echoareas.selected_color' => 'Selected:',
'ui.echoareas.network_domain_help' => 'Network Domain (eg: fidonet, fsxnet, etc.)',
'ui.echoareas.moderator' => 'Moderator',
'ui.echoareas.moderator_help' => 'Name of the echo area moderator',
'ui.echoareas.posting_name_policy' => 'Posting Name Policy',
'ui.echoareas.posting_name_policy_inherit' => 'Use Uplink Default',
'ui.echoareas.posting_name_policy_real_name' => 'Real Name',
'ui.echoareas.posting_name_policy_username' => 'Username',
'ui.echoareas.posting_name_policy_help' => 'Overrides uplink posting name policy for this echo area.',
'ui.echoareas.art_format_hint' => 'Art format hint',
'ui.echoareas.art_format_hint_inherit' => 'Auto / no override',
'ui.echoareas.art_format_hint_ansi' => 'ANSI',
'ui.echoareas.art_format_hint_amiga_ansi' => 'Amiga ANSI',
'ui.echoareas.art_format_hint_petscii' => 'PETSCII',
'ui.echoareas.art_format_hint_help' => 'Optional display hint for messages in this echo area when automatic ANSI detection is not enough.',
'ui.echoareas.local_only' => 'Local Only',
'ui.echoareas.local_only_help' => 'Messages in local areas are not transmitted to uplinks',
'ui.echoareas.sysop_access_only' => 'Sysop Access Only',
'ui.echoareas.sysop_access_only_help' => 'Restrict this echo area to sysop/admin users only',
'ui.echoareas.public_gemini_access' => 'Public Gemini Access',
'ui.echoareas.public_gemini_access_help' => 'Expose this echo area as read-only content on the Gemini capsule server',
'ui.echoareas.allow_media' => 'Inline Media Rendering',
'ui.echoareas.allow_media_help' => 'Controls inline media embeds for this area. Inherit uses the network-level setting.',
'ui.echoareas.allow_media_inherit' => 'Inherit from network',
'ui.echoareas.allow_media_allow' => 'Enabled',
'ui.echoareas.allow_media_deny' => 'Disabled',
'ui.echoareas.delete_confirm_prefix' => 'Are you sure you want to delete the echo area',
'ui.echoareas.delete_confirm_warning' => 'This action cannot be undone and will affect message routing.',
'ui.echoareas.none_found' => 'No echo areas found',
'ui.echoareas.tag' => 'Tag',
'ui.echoareas.messages' => 'Messages',
'ui.echoareas.uplink' => 'Uplink',
'ui.echoareas.local' => 'Local',
'ui.echoareas.sysop' => 'Sysop',
'ui.echoareas.local_only_title' => 'Local only - not transmitted to uplinks',
'ui.echoareas.sysop_access_only_title' => 'Sysop access only',
'ui.echoareas.mod_prefix' => 'Mod:',
'ui.echoareas.load_failed' => 'Failed to load echo areas',
'ui.echoareas.load_details_failed' => 'Failed to load echo area details',
'ui.echoareas.updated_success' => 'Echo area updated successfully',
'ui.echoareas.created_success' => 'Echo area created successfully',
'ui.echoareas.deleted_success' => 'Echo area deleted successfully',
'ui.echoareas.sync_not_implemented' => 'Sync functionality not yet implemented',
'ui.echoareas.export_not_implemented' => 'Export functionality not yet implemented',
'ui.echoareas.validate_not_implemented' => 'Validation functionality not yet implemented',
// BBS Menu Shell
'ui.shell.menu' => 'Menu',
'ui.shell.menu_main_q_title' => 'Main Menu (Q)',
// Login Page
'ui.login.title' => 'Login',
'ui.login.login_to_system' => 'Login to {system_name}',
'ui.login.username' => 'Username',
'ui.login.password' => 'Password',
'ui.login.remember_me_30_days' => 'Remember me (30 days)',
'ui.login.no_account' => "Don't have an account?",
'ui.login.request_access' => 'Request Access',
'ui.login.forgot_password' => 'Forgot your password?',
'ui.login.reset_password' => 'Reset Password',
'ui.login.sending' => 'Sending...',
'ui.login.reminder_sent_netmail_email_suffix' => '(sent via netmail and email)',
'ui.login.reminder_sent_netmail_only_suffix' => '(sent via netmail)',
'ui.login.connect_via_telnet' => 'Connect via Telnet',
// Guest Doors Page
'ui.guest_doors.page_title' => 'Guest Doors',
'ui.guest_doors.heading' => 'Guest Access',
'ui.guest_doors.subtitle' => 'Choose a door below to get started.',
'ui.guest_doors.no_doors' => 'No guest doors are currently available.',
'ui.guest_doors.connect' => 'Connect',
'ui.guest_doors.signin_link' => 'Sign in',
'ui.guest_doors.register_link' => 'request an account',
// Register Page
'ui.register.title' => 'Register',
'ui.register.create_account' => 'Create Account',
'ui.register.approval_required' => 'Registration requires approval.',
'ui.register.approval_required_help' => 'Your account will be reviewed by an administrator before activation.',
'ui.register.subject_to_rules' => 'All accounts are subject to',
'ui.register.email_notification_note' => 'You will receive an email when your account is approved. Reminder emails may also be sent. Please check your junk/spam folder if you don\'t see it.',
'ui.register.honeypot_website_leave_blank' => 'Website (leave blank)',
'ui.register.username' => 'Username',
'ui.register.username_help' => '3-20 characters, letters, numbers, and underscores only',
'ui.register.password' => 'Password',
'ui.register.password_help' => 'Minimum 8 characters. Use a mix of letters, numbers, and symbols for better security.',
'ui.register.confirm_password' => 'Confirm Password',
'ui.register.email_address' => 'Email Address',
'ui.register.email_help' => 'Optional - for account recovery and notifications',
'ui.register.real_name' => 'Real Name',
'ui.register.real_name_help' => 'Your actual name (required for FidoNet)',
'ui.register.location' => 'Location',
'ui.register.location_placeholder' => 'City, State/Country',
'ui.register.location_help' => "Your location (optional, shown in who's online)",
'ui.register.reason_for_joining' => 'Reason for Joining',
'ui.register.reason_placeholder' => "Tell us why you'd like to join ...",
'ui.register.submit_registration' => 'Submit Registration',
'ui.register.already_have_account' => 'Already have an account?',
'ui.register.sign_in' => 'Sign In',
'ui.register.password_strength.weak' => 'Weak - Add more variety',
'ui.register.password_strength.fair' => 'Fair - Could be stronger',
'ui.register.password_strength.good' => 'Good - Nice password!',
'ui.register.password_strength.strong' => 'Strong - Excellent!',
'ui.register.passwords_do_not_match' => 'Passwords do not match.',
'ui.register.submitting' => 'Submitting...',
'ui.register.submitted_success' => 'Registration submitted successfully! You will be notified when your account is approved.',
'ui.register.go_to_login' => 'Go to Login',
// Forgot Password Page
'ui.forgot_password.title' => 'Forgot Password',
'ui.forgot_password.reset_password' => 'Reset Password',
'ui.forgot_password.instructions' => "Enter your username, real name, or email address and we'll send you a link to reset your password.",
'ui.forgot_password.username_or_email' => 'Username, Real Name, or Email',
'ui.forgot_password.username_or_email_help' => 'Enter the username, real name, or email address associated with your account.',
'ui.forgot_password.send_reset_link' => 'Send Reset Link',
'ui.forgot_password.remember_password' => 'Remember your password?',
'ui.forgot_password.back_to_login' => 'Back to Login',
'ui.forgot_password.sending' => 'Sending...',
'ui.forgot_password.check_email_notice' => 'Please check your email inbox (and spam folder) for the reset link.',
'ui.forgot_password.request_failed' => 'Failed to process request',
'ui.forgot_password.reset_link_sent_if_exists' => 'If an account with that username, real name, or email exists, a password reset link has been sent.',
'ui.password_reset_email.subject' => 'Password Reset Request - {system_name}',
'ui.password_reset_email.header' => 'Password Reset Request',
'ui.password_reset_email.greeting' => 'Hello {name},',
'ui.password_reset_email.request_received' => 'We received a request to reset your password for your account on {system_name}.',
'ui.password_reset_email.click_link_below' => 'To reset your password, please click the link below:',
'ui.password_reset_email.click_button_below' => 'To reset your password, please click the button below:',
'ui.password_reset_email.button' => 'Reset Your Password',
'ui.password_reset_email.copy_link' => 'Or copy and paste this link into your browser:',
'ui.password_reset_email.expires_in_hours' => 'This link will expire in {hours} hours.',
'ui.password_reset_email.security_notes' => 'Security Notes:',
'ui.password_reset_email.note_never_share' => 'Never share this link with anyone',
'ui.password_reset_email.note_one_time' => 'This link can only be used once',
'ui.password_reset_email.note_request_new' => 'If you need another reset link, request a new one from the login page',
'ui.password_reset_email.if_not_requested' => 'If you did not request a password reset, you can safely ignore this email.',
'ui.password_reset_email.password_unchanged_notice' => 'Your password will not be changed unless you click the link above and create a new password.',
'ui.password_reset_email.best_regards' => 'Best regards,',
'ui.password_reset_email.footer_automated' => 'This is an automated message from {system_name}',
'ui.password_reset_email.footer_no_reply' => 'Please do not reply to this email.',
// Reset Password Page
'ui.reset_password.title' => 'Reset Password',
'ui.reset_password.create_new_password' => 'Create New Password',
'ui.reset_password.validating_token' => 'Validating reset token...',
'ui.reset_password.invalid_or_expired_token' => 'Invalid or Expired Token',
'ui.reset_password.invalid_token_help_line1' => 'This password reset link is invalid or has expired.',
'ui.reset_password.invalid_token_help_line2' => 'Please request a new password reset link.',
'ui.reset_password.enter_new_password' => 'Please enter your new password below.',
'ui.reset_password.new_password' => 'New Password',
'ui.reset_password.password_min_length_help' => 'Password must be at least 8 characters long.',
'ui.reset_password.confirm_new_password' => 'Confirm New Password',
'ui.reset_password.passwords_do_not_match' => 'Passwords do not match.',
'ui.reset_password.request_new_reset_link' => 'Request New Reset Link',
'ui.reset_password.resetting' => 'Resetting...',
'ui.reset_password.redirect_notice' => 'You will be redirected to the login page in 3 seconds...',
'ui.reset_password.success_reset_complete' => 'Password has been reset successfully. You can now log in with your new password.',
// Profile Page
'ui.profile.title' => 'Profile',
'ui.profile.my_profile' => 'My Profile',
'ui.profile.view_profile' => 'View Profile',
'ui.profile.profile_information' => 'Profile Information',
'ui.profile.username' => 'Username',
'ui.profile.username_readonly_help' => 'Username cannot be changed',
'ui.profile.real_name' => 'Real Name',
'ui.profile.real_name_help' => 'Your real name as displayed in messages',
'ui.profile.email_address' => 'Email Address',
'ui.profile.email_help' => 'Email address (optional, not shown publicly)',
'ui.profile.location' => 'Location',
'ui.profile.location_placeholder' => 'City, State/Country',
'ui.profile.location_help' => "Your location (shown in who's online)",
'ui.profile.about_me' => 'About Me',
'ui.profile.about_me_placeholder' => 'Tell others a bit about yourself...',
'ui.profile.about_me_help' => 'Markdown is supported. Displayed on your public profile.',
'ui.profile.change_password' => 'Change Password',
'ui.profile.current_password' => 'Current Password',
'ui.profile.new_password' => 'New Password',
'ui.profile.password_blank_keep_help' => 'Leave password fields blank to keep current password',
'ui.profile.account_created' => 'Account created',
'ui.profile.last_login' => 'Last login',
'ui.profile.never' => 'Never',
'ui.profile.update_profile' => 'Update Profile',
'ui.profile.system_information' => 'System Information',
'ui.profile.your_network_information' => 'Your Network Information',
'ui.profile.no_networks_configured' => 'No networks configured.',
'ui.profile.show_netmail_addresses' => 'Show Netmail Addresses',
'ui.profile.netmail_addresses_title' => 'Netmail Addresses',
'ui.profile.netmail_col_network' => 'Network Name',
'ui.profile.netmail_col_address' => 'Network Address',
'ui.profile.netmail_username_note' => '{username} may also be used in place of your full name.',
'ui.profile.system' => 'System',
'ui.profile.address' => 'Address',
'ui.profile.role' => 'Role',
'ui.profile.role_administrator' => 'Administrator',
'ui.profile.role_user' => 'User',
'ui.profile.activity_summary' => 'Activity Summary',
'ui.profile.credits' => 'Credits',
'ui.profile.disabled' => 'Disabled',
'ui.profile.netmail_sent' => 'Netmail Sent',
'ui.profile.echomail_posted' => 'Echomail Posted',
'ui.profile.total_messages' => 'Total Messages',
'ui.profile.files_downloaded' => 'Files Downloaded',
'ui.profile.files_uploaded' => 'Files Uploaded',
'ui.profile.transfer_ratio' => 'D/L Ratio',
'ui.profile.ratio_na' => 'N/A',
'ui.profile.credit_system' => 'Credit System',
'ui.profile.credit_costs_rewards' => 'Credit costs and rewards:',
'ui.profile.daily_login' => 'Daily Login',
'ui.profile.crashmail' => 'Crashmail',
'ui.profile.credit_note' => 'Web doors and other system elements may have additional costs or rewards.',
'ui.profile.updating_profile' => 'Updating profile...',
'ui.profile.updated_successfully' => 'Profile updated successfully!',
// Public User Profile Page
'ui.user_profile.title_with_username' => "{username}'s Profile",
'ui.user_profile.edit_my_profile' => 'Edit My Profile',
'ui.user_profile.user_information' => 'User Information',
'ui.user_profile.username' => 'Username',
'ui.user_profile.real_name' => 'Real Name',
'ui.user_profile.not_specified' => 'Not specified',
'ui.user_profile.location' => 'Location',
'ui.user_profile.fidonet_address' => 'FidoNet Address',
'ui.user_profile.about_me' => 'About Me',
'ui.user_profile.about_me_empty' => "Hasn't shared anything yet",
'ui.user_profile.member_since' => 'Member Since',
'ui.user_profile.last_seen' => 'Last Login',
'ui.user_profile.role' => 'Role',
'ui.user_profile.role_administrator' => 'Administrator',
'ui.user_profile.role_user' => 'User',
'ui.user_profile.credits' => 'Credits',
'ui.user_profile.current_balance' => 'Current Balance',
'ui.user_profile.send_credits' => 'Send Credits',
'ui.user_profile.amount' => 'Amount',
'ui.user_profile.send_credits_limit_fee' => 'Max 200 credits per transaction. {fee_percent}% fee applies.',
'ui.user_profile.message_optional' => 'Message (optional)',
'ui.user_profile.message_optional_placeholder' => "What's this for?",
'ui.user_profile.send_credits_fee_note' => '{fee_percent}% transaction fee distributed to system operators',
'ui.user_profile.activity_summary' => 'Activity Summary',
'ui.user_profile.netmail_sent' => 'Netmail Sent',
'ui.user_profile.echomail_posted' => 'Echomail Posted',
'ui.user_profile.total_messages' => 'Total Messages',
'ui.user_profile.additional_info_private' => 'Additional profile information is private',
'ui.user_profile.transaction_history' => 'Transaction History',
'ui.user_profile.admin_view' => 'Admin View',
'ui.user_profile.date' => 'Date',
'ui.user_profile.type' => 'Type',
'ui.user_profile.description' => 'Description',
'ui.user_profile.balance' => 'Balance',
'ui.user_profile.load_more_transactions' => 'Load More Transactions',
'ui.user_profile.no_transactions_yet' => 'No transactions yet',
'ui.user_profile.no_more_transactions' => 'No more transactions',
'ui.user_profile.load_transactions_failed' => 'Failed to load transactions',
'ui.user_profile.tab.transaction_history' => 'Transaction History',
'ui.user_profile.tab.activity_log' => 'Activity Log',
'ui.user_profile.activity_log.date' => 'Date',
'ui.user_profile.activity_log.category' => 'Category',
'ui.user_profile.activity_log.activity' => 'Activity',
'ui.user_profile.activity_log.detail' => 'Detail',
'ui.user_profile.activity_log.no_activity' => 'No activity recorded yet.',
'ui.user_profile.activity_log.load_more' => 'Load More Activity',
'ui.user_profile.activity_log.no_more' => 'No more activity',
'ui.user_profile.activity_log.load_failed' => 'Failed to load activity log',
'ui.user_profile.sending' => 'Sending...',
'ui.user_profile.send_credits_success' => 'Successfully sent {symbol}{amount} to {username}! (Fee: {symbol}{fee}, They received: {symbol}{received})',
'ui.user_profile.transaction_type.daily_login' => 'Daily Login',
'ui.user_profile.transaction_type.system_reward' => 'System Reward',
'ui.user_profile.transaction_type.payment' => 'Payment',
'ui.user_profile.transaction_type.admin_adjustment' => 'Admin Adjustment',
'ui.user_profile.transaction_type.unknown' => 'Unknown',
// Shared Message Page
'ui.shared_message.title' => 'Shared Message',
'ui.shared_message.loading' => 'Loading shared message...',
'ui.shared_message.login_to_reply' => 'Login to Reply',
'ui.shared_message.unable_to_load' => 'Unable to Load Message',
'ui.shared_message.go_to_main_site' => 'Go to Main Site',
'ui.shared_message.login_required' => 'Login Required',
'ui.shared_message.login_required_help' => 'This shared message requires you to be logged in to view it.',
'ui.shared_message.about_this_message' => 'About This Message',
'ui.shared_message.about_text' => 'This message is from an echomail system. Echomail is part of a worldwide bulletin board network that allows users to send messages and participate in discussion areas (echoareas) across different systems.',
'ui.shared_message.join_conversation' => 'Want to Join the Conversation?',
'ui.shared_message.join_conversation_help' => "To view more messages, participate in discussions, and reply to posts like this one, you'll need to register for an account on this system.",
'ui.shared_message.register_now' => 'Register Now',
'ui.shared_message.already_have_account' => 'Already Have Account?',
'ui.shared_message.network' => 'Network',
'ui.shared_message.powered_by' => 'Powered by',
'ui.shared_message.shared_on' => 'This message was shared',
'ui.shared_message.shared_by' => 'Shared by {name}',
'ui.shared_message.viewed_times' => 'Viewed {count} times',
'ui.shared_message.local_bulletin_board' => 'Local Bulletin Board',
'ui.shared_message.from_label' => 'From:',
'ui.shared_message.to_label' => 'To:',
'ui.shared_message.date_label' => 'Date:',
'ui.shared_message.subject_label' => 'Subject:',
'ui.shared_message.kludge_lines' => 'Kludge Lines',
'ui.shared_message.show_kludge_lines' => 'Show Kludge Lines',
'ui.shared_message.load_failed' => 'Failed to load shared message',
'ui.shared_message.not_available' => 'This shared message is not available. It may have expired or been revoked.',
'ui.shared_message.load_failed_retry' => 'Failed to load the shared message. Please try again later.',
// Netmail Page
'ui.netmail.title' => 'Netmail',
'ui.netmail.compose' => 'Compose',
'ui.netmail.messages' => 'Messages',
'ui.netmail.delete_selected' => 'Delete Selected',
'ui.netmail.quick_stats' => 'Quick Stats',
// Address Book
'ui.address_book.title' => 'Address Book',
'ui.address_book.search_placeholder' => 'Search addresses...',
'ui.address_book.entries' => 'entries',
'ui.address_book.add_entry' => 'Add Address Book Entry',
'ui.address_book.edit_entry' => 'Edit Address Book Entry',
'ui.address_book.no_entries_found' => 'No entries found',
'ui.address_book.unnamed' => 'Unnamed',
'ui.address_book.no_address' => 'No address',
'ui.address_book.user_id' => 'User ID',
'ui.address_book.node_address' => 'Node Address',
'ui.address_book.email_address' => 'Email Address',
'ui.address_book.name_placeholder' => 'Enter a descriptive name (e.g., John Smith)',
'ui.address_book.name_help' => 'Descriptive name for this contact',
'ui.address_book.user_id_placeholder' => 'Enter the user ID for messaging',
'ui.address_book.user_id_help' => 'User ID/handle to use when sending messages',
'ui.address_book.node_address_help' => 'Format: zone:net/node or zone:net/node.point',
'ui.address_book.email_help' => 'For your reference only - not used for messaging',
'ui.address_book.description_placeholder' => 'Notes about this contact...',
'ui.address_book.always_crashmail' => 'Always use crashmail for this Recipient',
'ui.address_book.always_crashmail_help' => 'Automatically enable crashmail when composing messages to this contact.',
// Echomail Page
'ui.echomail.title' => 'Echomail',
'ui.echomail.post_message' => 'Post Message',
'ui.echomail.edit_area' => 'Edit Area',
'ui.echomail.viewing_prefix' => 'Viewing:',
'ui.echomail.viewing_all' => 'Viewing: All Messages',
'ui.echomail.echo_list' => 'Echo List',
'ui.echomail.full_echo_list' => 'Full Echo List',
'ui.echomail.manage_subscriptions' => 'Manage Subscriptions',
'ui.echomail.manage_interests' => 'Manage Interests',
'ui.echomail.save_to_ad_library' => 'Save Ad',
'ui.echomail.save_to_ad_library_title' => 'Save to ad library',
'ui.echomail.save_to_ad_library_saved' => 'Message saved to ad library.',
'ui.echomail.save_to_ad_library_failed' => 'Failed to save message to ad library',
'ui.echomail.save_to_ad_library_not_ansi' => 'This message is not eligible to save as an ANSI ad.',
'ui.echomail.all_subscribed_areas' => 'All Subscribed Areas',
'ui.echomail.search_areas_placeholder' => 'Search areas...',
'ui.echomail.tab_area_list' => 'Area list',
'ui.echomail.tab_interests' => 'Interests',
'ui.echomail.loading_areas' => 'Loading areas...',
'ui.echomail.recent_messages' => 'Recent Messages',
'ui.echomail.to_me' => 'To Me',
'ui.echomail.saved_items' => 'Saved Items',
'ui.echomail.echo_areas' => 'Echo Areas',
'ui.echomail.areas' => 'Areas',
'ui.echomail.manage_subscriptions' => 'Manage Subscriptions',
'ui.echomail.share_message' => 'Share Message',
'ui.echomail.share_message_help' => 'Share this echomail message with others via a web link.',
'ui.echomail.allow_anonymous_access' => 'Allow anonymous access',
'ui.echomail.allow_anonymous_access_help' => 'Anyone with the link can view without logging in',
'ui.echomail.link_expires_after' => 'Link expires after:',
'ui.echomail.never_expires' => 'Never expires',
'ui.echomail.share_link_created_success' => 'Share link created successfully! You can now copy and share this URL.',
'ui.echomail.create_share_link' => 'Create Share Link',
'ui.echomail.get_friendly_url' => 'Get Friendly URL',
'ui.echomail.revoke_share' => 'Revoke Share',
'ui.echomail.messages_refreshed' => 'Messages refreshed',
'ui.echomail.written' => 'Written',
'ui.echomail.saved_items.removed' => 'Message removed from saved items',
'ui.echomail.saved_items.saved' => 'Message saved for later',
'ui.echomail.shares.using_existing' => 'Using existing share link',
'ui.echomail.shares.created_success' => 'Share link created successfully!',
'ui.echomail.shares.friendly_url_generated' => 'Friendly URL generated!',
'ui.echomail.shares.revoked' => 'Share link revoked',
'ui.echomail.shares.url_copied' => 'Share URL copied to clipboard!',
'ui.echomail.shares.existing_links' => 'Shared by others:',
'ui.echomail.shares.by_user' => 'by {username}',
// Files Page
'ui.files.title' => 'File Areas',
'ui.files.security_notice_label' => 'Security Notice:',
'ui.files.security_notice_text' => 'You are responsible for ensuring files you download are safe. Use appropriate malware protection software.',
'ui.files.recent_uploads' => 'Recent Uploads',
'ui.files.my_uploads' => 'My Uploads',
'ui.files.upload_file' => 'Upload File',
'ui.files.search_placeholder' => 'Search files...',
'ui.files.loading_recent_uploads' => 'Loading recent uploads...',
'ui.files.statistics' => 'Statistics',
'ui.files.status_heading' => 'File Areas Status',
'ui.files.total_areas' => 'Total Areas',
'ui.files.total_files' => 'Total Files',
'ui.files.total_size' => 'Total Size',
'ui.files.file_details' => 'File Details',
'ui.files.filename' => 'Filename',
'ui.files.description' => 'Description',
'ui.files.size' => 'Size',
'ui.files.uploaded' => 'Uploaded',
'ui.files.from' => 'From',
'ui.files.virus_scan' => 'Virus Scan',
'ui.files.download' => 'Download',
'ui.files.copy_magnet_link' => 'Copy magnet link',
'ui.files.share_file' => 'Share File',
'ui.files.link_expiry' => 'Link Expiry',
'ui.files.share_link' => 'Share Link',
'ui.files.revoke_link' => 'Revoke Link',
'ui.files.create_share_link' => 'Create Share Link',
'ui.files.share_access_stats' => 'Accessed {count} times. Last accessed: {last_accessed}',
'ui.files.never_accessed' => 'Never',
'ui.files.select_file_required' => 'Select File *',
'ui.files.maximum_file_size' => 'Maximum file size',
'ui.files.short_description_required' => 'Short Description *',
'ui.files.short_description_help' => 'Brief description shown in file listings.',
'ui.files.upload_descriptions' => 'Upload Descriptions',
'ui.files.upload_descriptions_help' => 'When uploading multiple files, each file gets its own short description.',
'ui.files.long_description' => 'Long Description',
'ui.files.long_description_help' => 'Optional extended description (supports plain text).',
'ui.files.upload' => 'Upload',
'ui.files.upload_success_multiple' => '{count} files uploaded successfully',
'ui.files.upload_partial_failure' => 'Upload stopped after {count} file(s): {error}',
'ui.files.recent_uploads_load_failed' => 'Failed to load recent uploads',
'ui.files.my_uploads_load_failed' => 'Failed to load your uploads',
'ui.files.no_recent_uploads' => 'No files have been uploaded yet',
'ui.files.no_my_uploads' => 'You have not uploaded any files yet',
'ui.files.area' => 'Area',
'ui.files.status' => 'Status',
'ui.files.actions' => 'Actions',
'ui.files.virus_scan_now' => 'Virus Scan',
'ui.files.scanning' => 'Scanning?',
'ui.files.scan_failed' => 'Virus scan failed',
'ui.files.virus_scan_clean' => 'Virus scan: Clean',
'ui.files.virus_detected_prefix' => 'Virus detected: ',
'ui.files.virus_scan_error' => 'Virus scan: Error',
'ui.files.virus_scan_skipped' => 'Virus scan: Skipped',
'ui.files.shared' => 'Shared',
'ui.files.file_areas_load_failed' => 'Failed to load file areas',
'ui.files.no_file_areas' => 'No file areas available',
'ui.files.search_areas_placeholder' => 'Search areas?',
'ui.files.files_count_label' => 'files',
'ui.files.loading_files' => 'Loading files...',
'ui.files.load_files_failed' => 'Failed to load files',
'ui.files.no_files_in_area' => 'No files in this area',
'ui.files.not_scanned' => 'Not scanned',
'ui.files.status_pending' => 'Pending Approval',
'ui.files.status_approved' => 'Approved',
'ui.files.status_rejected' => 'Rejected',
'ui.files.clean' => 'Clean',
'ui.files.infected' => 'Infected',
'ui.files.scan_error' => 'Scan Error',
'ui.files.skipped' => 'Skipped',
'ui.files.virus_name_placeholder' => 'Virus name (optional)',
'ui.files.scan_status_saved' => 'Scan status updated',
'ui.files.scan_status_save_failed' => 'Failed to update scan status',
'ui.files.no_description' => 'No description',
'ui.files.load_details_failed' => 'Failed to load file details',
'ui.files.select_area_first' => 'Please select a file area first',
'ui.files.select_file_prompt' => 'Please select a file',
'ui.files.upload_success' => 'File uploaded successfully',
'ui.files.upload_pending_approval' => 'File uploaded and queued for approval',
'ui.files.upload_pending_approval_multiple' => '{count} files uploaded and queued for approval',
'ui.files.upload_mixed_results' => '{approved} file(s) uploaded and {pending} queued for approval',
'ui.files.delete_confirm' => 'Are you sure you want to delete "{filename}"? This action cannot be undone.',
'ui.files.delete_success' => 'File deleted successfully',
'ui.files.rename' => 'Rename',
'ui.files.rename_file' => 'Rename File',
'ui.files.new_filename' => 'New Filename',
'ui.files.rename_success' => 'File renamed successfully',
'ui.files.rehatch' => 'Rehatch',
'ui.files.rehatch_ok' => 'File re-hatched successfully',
'ui.files.rehatch_failed' => 'Rehatch failed',
'ui.files.edit' => 'Edit',
'ui.files.edit_file' => 'Edit File',
'ui.files.edit_description' => 'Edit description',
'ui.files.delete_subfolder' => 'Delete subfolder',
'ui.files.delete_subfolder_confirm' => 'Are you sure you want to delete the subfolder "{subfolder}" and all its files? This cannot be undone.',
'ui.files.subfolder_deleted' => 'Subfolder deleted',
'ui.files.short_description' => 'Short Description',
'ui.files.edit_success' => 'File updated successfully',
'ui.files.previous_file' => 'Previous file',
'ui.files.next_file' => 'Next file',
'ui.files.my_files' => 'My Files',
'ui.files.my_uploads_summary' => 'Pending: {pending} Approved: {approved} Rejected: {rejected}',
'ui.files.move_to_area' => 'Move to Area',
'ui.files.active_share_exists' => 'This file already has an active share link.',
'ui.files.revoke_confirm' => 'Are you sure you want to revoke this share link? Anyone with the link will no longer be able to access it.',
'ui.files.share_revoked' => 'Share link revoked',
'ui.files.share_link_copied_clipboard' => 'Share link copied to clipboard',
'ui.files.share_link_copied' => 'Share link copied',
'ui.files.preview_title' => 'File Preview',
'ui.files.view_full_size' => 'View full size',
'ui.files.video_not_supported' => 'Video format not supported by your browser',
'ui.files.no_preview' => 'No preview available for this file type',
'ui.files.preview_failed' => 'Failed to load preview',
'ui.files.sid_track' => 'Track',
'ui.files.zip_empty' => 'ZIP archive is empty',
'ui.files.zip_truncated' => 'Showing first {count} entries',
'ui.files.zip_legacy_compression' => 'This file uses a legacy compression format that cannot be previewed.',
'ui.files.zip_legacy_badge' => 'Legacy compression',
'ui.files.download_zip' => 'Download full ZIP',
'ui.files.archive_empty' => 'Archive is empty',
'ui.files.archive_tool_unavailable' => 'Archive tool (7z) is not available on this server.',
'ui.files.archive_too_large' => 'This archive is too large to list ({size}). Only ZIP archives can be browsed above this limit.',
'ui.files.download_archive' => 'Download archive',
'ui.files.file_info' => 'File Info',
'ui.files.search_heading' => 'Search Files',
'ui.files.search_global_placeholder' => 'Search filename or description?',
'ui.files.search_result_count' => '{count} result(s)',
'ui.files.search_no_results' => 'No files found',
'ui.files.search_failed' => 'Search failed',
'ui.files.prg_no_preview' => 'Preview unavailable ? machine code program',
'ui.files.prg_run_c64' => 'Run on C64',
'ui.files.no_prgs_in_d64' => 'No PRG files found in disk image',
'ui.files.comments' => 'Comments',
'ui.files.leave_comment' => 'Leave a Comment',
'ui.files.post_comment' => 'Post Comment',
'ui.files.show_all_comments' => 'Show all {count} comments',
'ui.files.show_fewer_comments' => 'Show fewer',
'ui.files.no_comments_yet' => 'No comments yet. Be the first to leave one.',
'ui.files.loading_comments' => 'Loading comments?',
'ui.files.comments_load_failed' => 'Failed to load comments',
'ui.files.comment_post_failed' => 'Failed to post comment',
'ui.files.comment_posted' => 'Comment posted',
'ui.files.login_to_comment' => 'Log in to read and post comments',
'ui.files.add_link' => 'Add Link',
'ui.files.add_link_tab' => 'Add Link',
'ui.files.upload_file_tab' => 'Upload File',
'ui.files.link_url_required' => 'URL *',
'ui.files.link_url_help' => 'Enter a full URL (https://...) to link to an external resource.',
'ui.files.link_file_name' => 'File Name *',
'ui.files.link_file_name_help' => 'Display name for this link (e.g., video.mp4 or My Document).',
'ui.files.fetch_info' => 'Fetch Info',
'ui.files.fetching_info' => 'Fetching?',
'ui.files.fetch_info_failed' => 'Could not fetch URL metadata',
'ui.files.link_added' => 'Link added successfully',
'ui.files.link_url' => 'URL',
'ui.files.visit_link' => 'Visit',
'ui.files.link_url_edit' => 'URL',
// Polls Page
'ui.polls.title' => 'Polls',
'ui.polls.create' => 'Create Poll',
'ui.polls.loading' => 'Loading poll...',
'ui.polls.description' => 'Browse active polls and vote to reveal results.',
'ui.polls.previous' => 'Previous poll',
'ui.polls.next' => 'Next poll',
'ui.polls.create.title' => 'Create Poll',
'ui.polls.create.heading' => 'Create New Poll',
'ui.polls.create.cost_badge' => 'Cost: {cost} credits',
'ui.polls.create.insufficient_credits' => 'Insufficient Credits',
'ui.polls.create.insufficient_credits_help' => 'You need {cost} credits to create a poll, but you only have {balance} credits.',
'ui.polls.create.cost_info_prefix' => 'Creating a poll costs',
'ui.polls.create.current_balance' => 'Your current balance:',
'ui.polls.create.credits' => 'credits',
'ui.polls.create.question_required' => 'Poll Question *',
'ui.polls.create.question_placeholder' => 'What would you like to ask?',
'ui.polls.create.characters_minimum' => 'characters (minimum 10)',
'ui.polls.create.options_required' => 'Poll Options * (2-10)',
'ui.polls.create.option_placeholder' => 'Enter option',
'ui.polls.create.add_option' => 'Add Option',
'ui.polls.create.options_help' => 'Each option must be unique and under 200 characters',
'ui.polls.create.note_label' => 'Note:',
'ui.polls.create.note_text' => 'Once created, polls cannot be edited or deleted. Make sure your question and options are correct before submitting.',
'ui.polls.create.submit' => 'Create Poll ({cost} credits)',
'ui.polls.create.max_options_allowed' => 'Maximum 10 options allowed',
'ui.polls.create.question_min_length' => 'Question must be at least 10 characters',
'ui.polls.create.min_options_required' => 'Please provide at least 2 options',
'ui.polls.create.options_unique_required' => 'All options must be unique',
'ui.polls.create.creating' => 'Creating...',
'ui.polls.create.created_success_spent' => 'Poll created successfully! You spent {spent} credits.',
'ui.polls.create.error_prefix' => 'Error: ',
// Shoutbox Page
'ui.shoutbox.title' => 'Shoutbox',
'ui.shoutbox.loading' => 'Loading shouts...',
'ui.shoutbox.load_older' => 'Load older shouts',
'ui.shoutbox.leave_shout' => 'Leave a shout...',
'ui.shoutbox.post' => 'Post',
'ui.shoutbox.max_chars' => '280 characters max.',
'ui.admin.shoutbox.page_title' => 'Shoutbox',
'ui.admin.shoutbox.heading' => 'Shoutbox Moderation',
'ui.admin.shoutbox.user' => 'User',
'ui.admin.shoutbox.message' => 'Message',
'ui.admin.shoutbox.status' => 'Status',
'ui.admin.shoutbox.created' => 'Created',
'ui.admin.shoutbox.actions' => 'Actions',
'ui.admin.shoutbox.error_loading_shouts' => 'Error loading shouts',
'ui.admin.shoutbox.hidden' => 'Hidden',
'ui.admin.shoutbox.visible' => 'Visible',
'ui.admin.shoutbox.unhide' => 'Unhide',
'ui.admin.shoutbox.hide' => 'Hide',
'ui.admin.shoutbox.hidden_success' => 'Shout hidden successfully',
'ui.admin.shoutbox.unhidden_success' => 'Shout unhidden successfully',
'ui.admin.shoutbox.deleted_success' => 'Shout deleted successfully',
'ui.admin.shoutbox.failed_to_update' => 'Failed to update shout',
'ui.admin.shoutbox.failed_to_delete' => 'Failed to delete shout',
'ui.admin.shoutbox.confirm_delete' => 'Delete this shout?',
// Chat Page
'ui.chat.page_title' => 'Chat',
'ui.chat.heading' => 'Chat',
'ui.chat.rooms' => 'Rooms',
'ui.chat.direct' => 'Direct',
'ui.chat.lobby' => 'Lobby',
'ui.chat.load_older_messages' => 'Load older messages',
'ui.chat.type_message_placeholder' => 'Type a message...',
'ui.chat.view_profile' => 'View Profile',
'ui.chat.kick' => 'Kick',
'ui.chat.ban' => 'Ban',
'ui.chat.no_one_online' => 'No one online',
'ui.chat.room' => 'Room',
'ui.chat.moderation_hint' => 'Right-click or click to moderate',
'ui.chat.system' => 'System',
'ui.chat.confirm_kick' => 'Kick this user from the room?',
'ui.chat.confirm_ban' => 'Ban this user from the room?',
'ui.chat.send_failed' => 'Failed to send message',
'ui.chat.moderation_failed' => 'Moderation failed',
// BinkP Page
'ui.binkp.page_title' => 'Binkp Status',
'ui.binkp.heading' => 'Binkp Status',
'ui.binkp.subheading' => 'Monitor and manage your Binkp TCP/IP connections',
'ui.binkp.system_status' => 'System Status',
'ui.binkp.inbound_queue' => 'Inbound Queue',
'ui.binkp.outbound_queue' => 'Outbound Queue',
'ui.binkp.uplinks' => 'Uplinks',
'ui.binkp.status_tab' => 'Status',
'ui.binkp.uplinks_tab' => 'Uplinks',
'ui.binkp.queues_tab' => 'Queues',
'ui.binkp.kept_packets_tab' => 'Kept Packets',
'ui.binkp.kept_packets_locked' => 'This feature requires a registered license.',
'ui.binkp.kept_packets_register' => 'Register to unlock',
'ui.binkp.logs_tab' => 'Logs',
'ui.binkp.kept_inbound' => 'Inbound Keep',
'ui.binkp.kept_outbound' => 'Outbound Keep',
'ui.binkp.kept_packets_empty' => 'No kept packets found.',
'ui.binkp.kept_packets_total' => '{count} packet(s)',
'ui.binkp.kept_date_group' => '{date}',
'ui.binkp.from_address' => 'From',
'ui.binkp.to_address' => 'To',
'ui.binkp.pkt_header' => 'Packet Header',
'ui.binkp.pkt_version' => 'Packet Version',
'ui.binkp.pkt_product' => 'Product Code',
'ui.binkp.pkt_password' => 'Password',
'ui.binkp.pkt_password_set' => 'Set',
'ui.binkp.pkt_no_password' => 'None',
'ui.binkp.pkt_messages' => 'Messages',
'ui.binkp.pkt_no_messages' => 'No messages found in packet.',
'ui.binkp.pkt_from' => 'From',
'ui.binkp.pkt_to' => 'To',
'ui.binkp.pkt_subject' => 'Subject',
'ui.binkp.pkt_flags' => 'Flags',
'ui.binkp.bundle_arcmail' => 'Arcmail bundle',
'ui.binkp.bundle_empty' => 'No .pkt files found in this bundle.',
'ui.binkp.bundle_packet_count' => '{count} packet(s) in bundle',
'ui.binkp.bundle_open_failed' => 'Failed to open bundle.',
'ui.binkp.bundle_view_packet' => 'View',
'ui.binkp.bundle_back' => 'Back to bundle',
'ui.common.filename' => 'Filename',
'ui.common.size' => 'Size',
'ui.common.date' => 'Date',
'ui.binkp.system_information' => 'System Information',
'ui.binkp.loading_system_information' => 'Loading system information...',
'ui.binkp.uplink_status' => 'Uplink Status',
'ui.binkp.loading_uplink_status' => 'Loading uplink status...',
'ui.binkp.poll_all' => 'Poll All',
'ui.binkp.configured_uplinks' => 'Configured Uplinks',
'ui.binkp.uplink' => 'Uplink',
'ui.binkp.status' => 'Status',
'ui.binkp.schedule' => 'Schedule',
'ui.binkp.actions' => 'Actions',
'ui.binkp.address' => 'Address',
'ui.binkp.sysop' => 'Sysop',
'ui.binkp.location' => 'Location',
'ui.binkp.process' => 'Process',
'ui.binkp.send' => 'Send',
'ui.binkp.poll' => 'Poll',
'ui.binkp.enabled' => 'Enabled',
'ui.binkp.disabled' => 'Disabled',
'ui.binkp.checking' => 'Checking...',
'ui.binkp.online' => 'Online',
'ui.binkp.offline' => 'Offline',
'ui.binkp.no_uplinks_configured' => 'No uplinks configured',
'ui.binkp.error_loading_status_prefix' => 'Error loading status:',
'ui.binkp.error_loading_uplinks_prefix' => 'Error loading uplinks:',
'ui.binkp.file_count' => '{count} files',
'ui.binkp.pending' => 'Pending',
'ui.binkp.errors' => 'Errors',
'ui.binkp.stdout' => 'STDOUT',
'ui.binkp.stderr' => 'STDERR',
'ui.binkp.http_status_error' => 'HTTP {code}: {text}',
'ui.binkp.inbound_api_http_error' => 'Inbound API: HTTP {code}',
'ui.binkp.outbound_api_http_error' => 'Outbound API: HTTP {code}',
'ui.binkp.zero_bytes' => '0 Bytes',
'ui.binkp.byte_units.bytes' => 'Bytes',
'ui.binkp.byte_units.kb' => 'KB',
'ui.binkp.byte_units.mb' => 'MB',
'ui.binkp.byte_units.gb' => 'GB',
'ui.binkp.poll_schedule_cron' => 'Poll Schedule (cron format)',
'ui.binkp.poll_schedule_placeholder' => '0 */4 * * *',
'ui.binkp.logs_heading' => 'Binkp Logs',
'ui.binkp.lines_option' => '{count} lines',
'ui.binkp.loading_logs' => 'Loading logs...',
'ui.binkp.log_matches' => '{count} / {total} lines',
'ui.binkp.advanced_log_search' => 'Advanced Search',
'ui.binkp.advanced_log_search_help' => 'Searches the entire log. All lines from any session (PID) that contains a match are shown.',
'ui.binkp.advanced_log_search_placeholder' => 'e.g. 1:123/456, FREQ, ERROR',
'ui.binkp.log_search_summary' => '{matches} matches across {sessions} session(s)',
'ui.binkp.log_search_no_results' => 'No results found.',
'ui.binkp.log_search_legend_match' => 'Lines containing your search term',
'ui.binkp.log_search_legend_context' => 'Other lines from the same session (same PID)',
'ui.binkp.add_new_uplink' => 'Add New Uplink',
'ui.binkp.ftn_address_required' => 'FTN Address *',
'ui.binkp.ftn_address_placeholder' => '1:123/456',
'ui.binkp.hostname_required' => 'Hostname *',
'ui.binkp.hostname_placeholder' => 'bbs.example.com',
'ui.binkp.default_every_4_hours' => 'Default: every 4 hours',
'ui.binkp.add_uplink' => 'Add Uplink',
'ui.binkp.configured_count' => '{count} configured',
'ui.binkp.message_count' => '{count} msgs',
'ui.binkp.poll_completed_exit' => 'Poll completed (exit {code})',
'ui.binkp.poll_failed_prefix' => 'Poll failed: ',
'ui.binkp.error_polling_uplink_prefix' => 'Error polling uplink: ',
'ui.binkp.all_uplinks_polled_exit' => 'All uplinks polled (exit {code})',
'ui.binkp.polling_failed_prefix' => 'Polling failed: ',
'ui.binkp.error_polling_uplinks_prefix' => 'Error polling uplinks: ',
'ui.binkp.inbound_processing_completed' => 'Inbound processing completed',
'ui.binkp.processing_failed_prefix' => 'Processing failed: ',
'ui.binkp.error_processing_inbound_prefix' => 'Error processing inbound: ',
'ui.binkp.outbound_processing_completed' => 'Outbound processing completed',
'ui.binkp.error_processing_outbound_prefix' => 'Error processing outbound: ',
'ui.binkp.uplink_added_success' => 'Uplink added successfully',
'ui.binkp.add_uplink_failed_prefix' => 'Failed to add uplink: ',
'ui.binkp.error_adding_uplink_prefix' => 'Error adding uplink: ',
'ui.binkp.remove_uplink_confirm' => 'Remove uplink {address}?',
'ui.binkp.uplink_removed_success' => 'Uplink removed successfully',
'ui.binkp.remove_uplink_failed_prefix' => 'Failed to remove uplink: ',
'ui.binkp.error_removing_uplink_prefix' => 'Error removing uplink: ',
'ui.binkp.packet_processing_failed_prefix' => 'Packet processing failed: ',
'ui.binkp.packet_processing_completed_exit' => 'Packet processing completed (exit {code})',
'ui.binkp.error_processing_packets_prefix' => 'Error processing packets: ',
'ui.binkp.poll_failed' => 'Poll failed',
'ui.binkp.polling_failed' => 'Polling failed',
'ui.binkp.processing_failed' => 'Processing failed',
'ui.binkp.add_uplink_failed' => 'Failed to add uplink',
'ui.binkp.remove_uplink_failed' => 'Failed to remove uplink',
'ui.binkp.unknown_error' => 'Unknown error',
'ui.binkp.check_status' => 'Check',
'ui.binkp.check_status_title' => 'Check connectivity status',
'ui.binkp.poll_all_confirm' => 'Poll all uplinks now?',
'ui.binkp.poll_all_confirm_warning' => 'Warning: Excessive polling may lead to rate limiting or IP bans by remote systems.',
// Echolist Page
'ui.echolist.search_min_chars' => 'Please enter at least 2 characters to search',
'ui.echolist.page_title' => 'Echo Areas',
'ui.echolist.heading' => 'Echo List',
'ui.echolist.filter_heading' => 'Filter Echo Areas',
'ui.echolist.show_subscribed_only' => 'Show only subscribed areas',
'ui.echolist.show_unread_only' => 'Show only areas with unread messages',
'ui.echolist.area_filter_placeholder' => 'Type to filter by name or description...',
'ui.echolist.area_filter_help' => 'Filters the list below in real-time',
'ui.echolist.all_networks' => 'All Networks',
'ui.echolist.all_interests' => 'All Interests',
'ui.echolist.search_heading' => 'Search Messages',
'ui.echolist.search_placeholder' => 'Search message content...',
'ui.echolist.search_help' => 'Search all echomail message content',
'ui.echolist.loading' => 'Loading echos...',
'ui.echolist.stats.total_echos' => 'Total echos',
'ui.echolist.stats.total_messages' => 'Total Messages',
'ui.echolist.stats.networks' => 'Networks',
'ui.echolist.stats.recent_messages' => '24h Messages',
'ui.echolist.local' => 'Local',
'ui.echolist.unknown' => 'Unknown',
'ui.echolist.load_failed' => 'Failed to load echo areas',
'ui.echolist.none_available' => 'No echo areas available.',
'ui.echolist.new_post' => 'New Post',
'ui.echolist.new_messages' => 'New Messages',
'ui.echolist.local_areas' => 'Local Areas',
'ui.echolist.lovlynet_network' => 'LOVLYNET Network',
'ui.echolist.network_suffix' => 'Network',
'ui.echolist.area_count' => 'area',
'ui.echolist.plural_suffix' => 's',
'ui.echolist.sysop_badge' => 'Sysop',
'ui.echolist.no_description' => 'No description',
'ui.echolist.moderator_prefix' => 'Moderator:',
'ui.echolist.unread_of_posts' => '{unread} unread of {total} posts',
'ui.echolist.post_count' => '{total} posts',
'ui.echolist.by_author' => 'by {author}',
'ui.echolist.time.never' => 'Never',
'ui.echolist.time.just_now' => 'Just now',
'ui.echolist.time.minutes_ago' => '{count}m ago',
'ui.echolist.time.hours_ago' => '{count}h ago',
'ui.echolist.time.days_ago' => '{count}d ago',
// Nodelist Page
'ui.nodelist.node_details' => 'Node Details',
'ui.nodelist.back_to_list' => 'Back to List',
'ui.nodelist.system_information' => 'System Information',
'ui.nodelist.system_name' => 'System Name',
'ui.nodelist.sysop' => 'Sysop',
'ui.nodelist.location' => 'Location',
'ui.nodelist.phone' => 'Phone',
'ui.nodelist.baud_rate' => 'Baud Rate',
'ui.nodelist.not_specified' => 'Not specified',
'ui.nodelist.unpublished' => 'Unpublished',
'ui.nodelist.address_components' => 'Address Components',
'ui.nodelist.zone' => 'Zone',
'ui.nodelist.net' => 'Net',
'ui.nodelist.node' => 'Node',
'ui.nodelist.point' => 'Point',
'ui.nodelist.full' => 'Full',
'ui.nodelist.capabilities_flags' => 'Node Capabilities & Flags',
'ui.nodelist.quick_actions' => 'Quick Actions',
'ui.nodelist.send_netmail' => 'Send Netmail',
'ui.nodelist.not_found' => 'Not in nodelist',
'ui.nodelist.view_full_details' => 'View full node details',
'ui.nodelist.login_to_send_netmail' => 'Login to Send Netmail',
'ui.nodelist.file_request' => 'File Request',
'ui.nodelist.connection_information' => 'Connection Information',
'ui.nodelist.internet_binkp' => 'Internet (BinkP)',
'ui.nodelist.internet_telnet' => 'Internet (Telnet)',
'ui.nodelist.dialup_pots' => 'Dialup (POTS)',
'ui.nodelist.no_connection_info' => 'No connection information available',
'ui.nodelist.continuous_mail' => 'Continuous Mail (24/7)',
'ui.nodelist.mail_on_hold' => 'Mail on Hold',
'ui.nodelist.system_down' => 'System Down',
'ui.nodelist.http' => 'HTTP',
'ui.nodelist.telnet' => 'Telnet',
'ui.nodelist.ssh' => 'SSH',
'ui.nodelist.file_request_coming_soon' => 'File request feature coming soon!',
'ui.nodelist.index.heading' => 'Node List Browser',
'ui.nodelist.index.import_nodelist' => 'Import Nodelist',
'ui.nodelist.index.nodes' => 'nodes',
'ui.nodelist.index.zones' => 'zones',
'ui.nodelist.index.nets' => 'nets',
'ui.nodelist.index.points' => 'points',
'ui.nodelist.index.special' => 'special',
'ui.nodelist.index.last_imported' => 'Last imported:',
'ui.nodelist.index.search_placeholder' => 'Node address (2:5034/10), sysop, location, or system name',
'ui.nodelist.index.all_zones' => 'All Zones',
'ui.nodelist.index.zone_prefix' => 'Zone',
'ui.nodelist.index.all_nets' => 'All Nets',
'ui.nodelist.index.net_prefix' => 'Net',
'ui.nodelist.index.flag_filter_label' => 'Flags',
'ui.nodelist.index.flag_filter_any' => 'Any flag',
'ui.nodelist.index.search_results' => 'Search Results ({count} nodes)',
'ui.nodelist.index.address' => 'Address',
'ui.nodelist.index.type' => 'Type',
'ui.nodelist.index.phone_host' => 'Phone/Host',
'ui.nodelist.index.speed' => 'Speed',
'ui.nodelist.index.actions' => 'Actions',
'ui.nodelist.index.no_nodes_found_search' => 'No nodes found matching your search criteria.',
'ui.nodelist.index.use_search_form' => 'Use the search form above to find nodes in the nodelist.',
'ui.nodelist.index.error_fetching_nets' => 'Error fetching nets:',
'ui.nodelist.import.heading' => 'Import Nodelist',
'ui.nodelist.import.upload_new_nodelist' => 'Upload New Nodelist',
'ui.nodelist.import.network_domain' => 'Network Domain',
'ui.nodelist.import.domain_placeholder' => 'e.g., fidonet, fsxnet, agoranet',
'ui.nodelist.import.domain_title' => 'Domain should contain only letters, numbers, underscores, and hyphens',
'ui.nodelist.import.domain_help_1' => 'The FTN network domain this nodelist belongs to (e.g., fidonet, fsxnet).',
'ui.nodelist.import.domain_help_2' => 'This is used to distinguish nodes from different networks.',
'ui.nodelist.import.nodelist_file' => 'Nodelist File',
'ui.nodelist.import.nodelist_help_1' => 'Upload a FidoNet nodelist file (NODELIST.xxx format).',
'ui.nodelist.import.nodelist_help_2' => 'Supported: Plain text (.txt, .lst, .nodelist) and ZIP compressed (.Zxxx)',
'ui.nodelist.import.archive_before_import' => 'Archive current nodelist before importing',
'ui.nodelist.import.archive_help' => 'Recommended: Keep the current nodelist as inactive backup before importing the new one.',
'ui.nodelist.import.warning' => 'Warning:',
'ui.nodelist.import.warning_text_1' => 'Importing a new nodelist will replace the current active nodelist data for this domain.',
'ui.nodelist.import.warning_text_2' => 'This operation cannot be undone. Make sure you have a backup if needed.',
'ui.nodelist.import.import_nodelist' => 'Import Nodelist',
'ui.nodelist.import.current_status' => 'Current Nodelist Status',
'ui.nodelist.import.file' => 'File:',
'ui.nodelist.import.day_of_year' => 'Day of Year:',
'ui.nodelist.import.release_date' => 'Release Date:',
'ui.nodelist.import.total_nodes' => 'Total Nodes:',
'ui.nodelist.import.imported' => 'Imported:',
'ui.nodelist.import.no_active_nodelist' => 'No active nodelist found.',
'ui.nodelist.import.node_statistics' => 'Node Statistics',
'ui.nodelist.import.total_nodes_label' => 'Total Nodes',
'ui.nodelist.import.guidelines' => 'Import Guidelines',
'ui.nodelist.import.guideline_1' => 'Standard FTS-0005 format',
'ui.nodelist.import.guideline_2' => 'ASCII text with CR/LF endings',
'ui.nodelist.import.guideline_3' => 'Proper header with CRC',
'ui.nodelist.import.guideline_4' => 'Zone/Net/Node hierarchy',
'ui.nodelist.import.guideline_5' => 'ZIP compressed files (.Zxxx)',
'ui.nodelist.import.guideline_note' => 'For ARC, ARJ, LZH, RAR files, use the command-line import script',
'ui.nodelist.import.importing' => 'Importing...',
'ui.nodelist.import.success' => 'Successfully imported {count} nodes from {filename} (Day {day}) for domain @{domain}',
'ui.nodelist.tab_list' => 'List',
'ui.nodelist.tab_map' => 'Map',
'ui.nodelist.map_loading' => 'Loading map data?',
'ui.nodelist.no_coordinates' => 'Location not geocoded. Run scripts/geocode_nodelist.php to populate coordinates.',
'ui.nodelist.map_no_coordinates' => 'No geocoded nodes available. Run the geocode_nodelist script to populate coordinates.',
'ui.nodelist.map_node_count' => '{count} geocoded nodes',
'ui.nodelist.map_send_netmail' => 'Send Netmail',
'ui.nodelist.request_allfiles' => 'Request File',
'ui.nodelist.freq_not_advertised' => 'This node does not advertise the FREQ flag. A request will still be sent, but the node may not support file requests.',
'ui.nodelist.request_allfiles_title' => 'Request File List from {node}',
'ui.nodelist.request_allfiles_body' => 'Sends an ALLFILES FREQ to this node. They will include their file listing on the next binkp session with you.',
'ui.nodelist.request_allfiles_filename' => 'File to request',
'ui.nodelist.request_allfiles_filename_placeholder' => 'e.g. README.TXT',
'ui.nodelist.request_allfiles_to' => 'Send to',
'ui.nodelist.request_allfiles_to_other' => 'Other...',
'ui.nodelist.request_allfiles_to_other_placeholder' => 'Enter service name',
'ui.nodelist.request_allfiles_password' => 'Password (optional)',
'ui.nodelist.request_allfiles_password_help' => 'Supply a password if the remote system requires one to serve file listings.',
'ui.nodelist.request_allfiles_crashmail' => 'Send as crashmail (connect directly to node)',
'ui.nodelist.request_allfiles_crashmail_help' => 'Delivers the request directly to this node rather than routing it through your uplink.',
'ui.nodelist.request_allfiles_sent' => 'ALLFILES request queued. The file listing will arrive on the next binkp session.',
'ui.nodelist.request_allfiles_failed' => 'Failed to send ALLFILES request.',
'ui.nodelist.send_request' => 'Send Request',
'ui.dosdoor_player.page_title' => 'DOS Door Player',
'ui.dosdoor_player.document_title_suffix' => 'DOS Door',
'ui.dosdoor_player.status_prefix' => 'Status:',
'ui.dosdoor_player.status_disconnected' => 'Disconnected',
'ui.dosdoor_player.status_launching' => 'Launching...',
'ui.dosdoor_player.status_launch_failed' => 'Launch failed',
'ui.dosdoor_player.status_connecting' => 'Connecting...',
'ui.dosdoor_player.status_connected' => 'Connected',
'ui.dosdoor_player.status_connection_error' => 'Connection error',
'ui.dosdoor_player.status_error' => 'Error',
'ui.dosdoor_player.end_session' => 'End Session',
'ui.dosdoor_player.launching_door_line' => 'Launching door game...',
'ui.dosdoor_player.failed_launch_line' => 'Failed to launch door session.',
'ui.dosdoor_player.connecting_to_prefix' => 'Connecting to',
'ui.dosdoor_player.connected_line' => 'Connected!',
'ui.dosdoor_player.connection_closed_line' => '[Connection closed]',
'ui.dosdoor_player.connection_error_line' => '[Connection error]',
'ui.dosdoor_player.failed_to_connect_prefix' => 'Failed to connect:',
'ui.dosdoor_player.confirm_end_session' => 'Are you sure you want to end this door session?',
'ui.dosdoor_player.failed_end_session' => 'Failed to end session',
'ui.dosdoor_player.error_ending_session' => 'Error ending session',
'ui.dosdoor_player.error_no_door_specified' => 'Error: No door ID specified',
'ui.dosdoor_player.failed_launch_door' => 'Failed to launch door',
// Who's Online
'ui.whos_online.page_title' => "Who's Online",
'ui.whos_online.heading' => "Who's Online",
'ui.whos_online.active_last_minutes' => 'Active in last {minutes} minutes',
'ui.whos_online.online_users' => 'Online Users',
'ui.whos_online.service' => 'Service',
'ui.whos_online.activity' => 'Activity',
'ui.whos_online.idle' => 'Idle',
'ui.whos_online.no_users_online' => 'No users are online right now.',
// Doors and Games
'ui.webdoors.page_title' => 'Doors and Games',
'ui.webdoors.heading' => 'Doors and Games',
'ui.webdoors.description' => 'Access classic DOS door games and modern web-based games.',
'ui.webdoors.top_scores_all_games' => 'Top Scores (All Games)',
'ui.webdoors.leaderboard_month_navigation' => 'Leaderboard month navigation',
'ui.webdoors.previous_month' => 'Previous month',
'ui.webdoors.next_month' => 'Next month',
'ui.webdoors.current_month' => 'Current month',
'ui.webdoors.rank' => 'Rank',
'ui.webdoors.player' => 'Player',
'ui.webdoors.game' => 'Game',
'ui.webdoors.board' => 'Board',
'ui.webdoors.score' => 'Score',
'ui.webdoors.date' => 'Date',
'ui.webdoors.no_scores_for_month' => 'No scores recorded for {month}.',
'ui.webdoors.players_count' => 'Players: {count}',
'ui.webdoors.by_author' => 'by {author}',
'ui.webdoors.version_by_author' => 'v{version} by {author}',
'ui.webdoors.launch' => 'Launch',
'ui.webdoors.no_games_available' => 'No games available yet. Check back later!',
'ui.webdoors.errors.system_disabled' => 'Sorry, the game system is not enabled.',
'ui.webdoors.errors.admin_only' => 'This door is restricted to administrators.',
'ui.webdoors.errors.requirements_not_met' => 'This game requires features that are not currently enabled on this system.',
'ui.webdoor_play.page_title_suffix' => 'Doors and Games',
'ui.webdoor_play.back_to_doors' => 'Back to Doors',
'ui.webdoor_play.admin_config' => 'Admin Config',
'ui.webdoor_play.fullscreen' => 'Fullscreen',
'ui.webdoor_play.play_mode' => 'Play Mode',
// Shared File Page
'ui.shared_file.shared_file' => 'Shared File',
'ui.shared_file.meta_description_from_system' => 'File shared from {system_name}',
'ui.shared_file.shared_by' => 'Shared by',
'ui.shared_file.on_date_prefix' => 'on',
'ui.shared_file.viewed_count' => 'viewed {count} time(s)',
'ui.shared_file.expires_prefix' => 'expires',
'ui.shared_file.clean' => 'Clean',
'ui.shared_file.size' => 'Size:',
'ui.shared_file.uploaded' => 'Uploaded:',
'ui.shared_file.area' => 'Area:',
'ui.shared_file.description' => 'Description:',
'ui.shared_file.details' => 'Details:',
'ui.shared_file.download' => 'Download',
'ui.shared_file.browse_area' => 'Browse {tag} area',
'ui.shared_file.join_system_to_download' => 'Join {system_name} to Download',
'ui.shared_file.register_prompt' => 'Create a free account to download this file and access our full file archive.',
'ui.shared_file.register' => 'Register',
'ui.shared_file.login' => 'Login',
'ui.shared_file.about_system' => 'About {system_name}',
'ui.shared_file.about_system_text' => '{system_name} is a {network}-connected BBS with file areas. Members can upload, download, and share files from a growing archive.',
'ui.shared_file.powered_by' => 'Powered by BinktermPHP',
'ui.shared_file.not_available_title' => 'File Not Available',
'ui.shared_file.not_available_body' => 'This shared file link is not available. It may have expired or been revoked.',
'ui.shared_file.go_to_main_site' => 'Go to Main Site',
// Ads
'ui.ads.advertisement' => 'Advertisement',
'ui.ads.none_available' => 'No advertisements available.',
// BBS Menu Shell
'ui.bbs_menu.main_menu' => 'Main Menu',
'ui.bbs_menu.press_key_to_navigate' => 'Press key to navigate',
'ui.bbs_menu.quit_return' => 'Quit/Return',
'ui.bbs_menu.tap_item_to_navigate' => 'Tap an item to navigate',
'ui.bbs_menu.press_highlighted_key' => 'Press the highlighted key to navigate',
'ui.bbs_menu.returns_to_menu' => 'returns to this menu',
'ui.bbs_menu.tap_card_to_navigate' => 'Tap a card to navigate',
// Recent Updates Fragment
'ui.recent_updates.badge_feature' => 'Feature',
'ui.recent_updates.badge_fix' => 'Fix',
'ui.recent_updates.badge_improvement' => 'Improvement',
'ui.recent_updates.badge_update' => 'Update',
// House Rules Fragment
'ui.rules.intro' => 'Be excellent to each other and help keep this system welcoming for everyone.',
'ui.rules.item_1' => 'Keep it civil. No harassment, hate speech, or personal attacks.',
'ui.rules.item_2' => 'No spam or flooding.',
'ui.rules.item_3' => 'Respect privacy. Do not share private information without consent.',
'ui.rules.item_4' => 'Follow Fidonet etiquette and local network policies.',
'ui.rules.item_5' => 'Sysop decisions are final.',
// Dashboard
'ui.dashboard.title' => 'Dashboard',
'ui.dashboard.unread_netmail' => 'Unread Netmail',
'ui.dashboard.unread_netmail_tooltip' => 'Unread netmail sent to you',
'ui.dashboard.unread_echomail' => 'New Echomail',
'ui.dashboard.total_unread_echomail' => 'Unread Echomail',
'ui.dashboard.mail_and_areas' => 'Mail & Areas',
'ui.dashboard.new_echoareas' => 'NEW ECHOAREAS',
'ui.dashboard.new_echoareas_count' => '{count} added in past 30 days',
'ui.dashboard.new_echoareas_none' => 'No new echo areas in the past 30 days.',
'ui.dashboard.new_echoareas_added' => 'Added',
'ui.dashboard.new_echoareas_show' => 'Show new echo areas',
'ui.dashboard.new_echoareas_hide' => 'Hide new echo areas',
'ui.dashboard.new_echoareas_load_more' => 'Load More',
'ui.dashboard.manage_subscriptions' => 'Manage Subscriptions',
'ui.dashboard.manage_interests' => 'Manage Interests',
'ui.dashboard.echomail_tooltip_new' => 'New echomail since your last visit',
'ui.dashboard.echomail_tooltip_unread' => 'Total unread echomail',
'ui.dashboard.system_news' => 'System News',
'ui.dashboard.advertisement' => 'Advertisement',
'ui.dashboard.advertisement_controls' => 'Advertisement controls',
'ui.dashboard.advertisement_position' => 'Ad {current} of {total}',
'ui.dashboard.system_information' => 'System Information',
'ui.dashboard.sysop' => 'Sysop',
'ui.dashboard.user' => 'User',
'ui.dashboard.addresses' => 'Addresses',
'ui.dashboard.networks' => 'Networks',
'ui.dashboard.todays_callers' => "Today's Callers",
'ui.dashboard.no_callers_today' => 'None yet today',
'ui.dashboard.callers_col_user' => 'User',
'ui.dashboard.callers_col_time' => 'Last Call',
'ui.dashboard.callers_col_online' => 'Online',
'ui.dashboard.callers_online_now' => 'Online now',
'ui.dashboard.online_now' => 'Online Now',
'ui.dashboard.active_today' => 'Active Today',
'ui.dashboard.my_referral_link' => 'My Referral Link',
'ui.dashboard.referral_invite_prefix' => 'Invite friends and earn',
'ui.dashboard.referral_invite_suffix' => 'credits for each successful referral.',
'ui.dashboard.referrals.label' => 'Referrals',
'ui.dashboard.referrals.earned' => 'Earned',
'ui.dashboard.voting_booth' => 'Voting Booth',
'ui.dashboard.create_poll_title' => 'Create Poll',
'ui.dashboard.polls.none_active' => 'No active polls right now.',
'ui.dashboard.polls.load_failed' => 'Failed to load poll.',
'ui.dashboard.polls.results' => 'Results',
'ui.dashboard.polls.no_votes' => 'No votes yet.',
'ui.dashboard.polls.vote_to_see_results' => 'Vote to see results',
'ui.dashboard.polls.submit_vote' => 'Submit Vote',
'ui.dashboard.echoareas.none_available' => 'No echo areas available',
'ui.dashboard.shoutbox.none_yet' => 'No shouts yet. Be the first!',
'ui.dashboard.shoutbox.load_failed' => 'Failed to load shouts.',
'ui.dashboard.shoutbox.post_failed' => 'Failed to post shout.',
'ui.dashboard.referrals.error_prefix' => 'Referral stats error:',
'ui.dashboard.referrals.recent' => 'Recent Referrals',
'ui.dashboard.referrals.copy_failed_prefix' => 'Failed to copy:',
'ui.dashboard.echoareas.header_area' => 'Echo Area',
'ui.dashboard.echoareas.header_unread_total' => 'Unread Total',
'ui.dashboard.customize.title' => 'Customize Dashboard',
'ui.dashboard.customize.hint' => 'Drag cards to reorder or move them between columns. Use the eye icon to show or hide a card.',
'ui.dashboard.customize.zone_main' => 'Main Column',
'ui.dashboard.customize.zone_sidebar' => 'Sidebar',
'ui.dashboard.customize.required' => 'Required',
'ui.dashboard.customize.show' => 'Show',
'ui.dashboard.customize.hide' => 'Hide',
'ui.dashboard.customize.reset' => 'Reset to Default',
'ui.dashboard.customize.save_failed' => 'Failed to save layout.',
'ui.dashboard.card.unread' => 'Mail & Areas',
'ui.dashboard.card.system_news' => 'System News',
'ui.dashboard.card.shoutbox' => 'Shoutbox',
'ui.dashboard.card.advertising' => 'Advertisement',
'ui.dashboard.card.system_info' => 'System Information',
'ui.dashboard.card.todays_callers' => "Today's Callers",
'ui.dashboard.card.voting_booth' => 'Voting Booth',
'ui.dashboard.card.echo_areas' => 'Echo Areas',
'ui.dashboard.card.referral' => 'Referral Link',
'ui.dashboard.card.packetbbs_status' => 'PacketBBS Nodes',
// Settings
'ui.settings.title' => 'Settings',
'ui.settings.tab.display' => 'Display',
'ui.settings.tab.messaging' => 'Messaging',
'ui.settings.tab.notifications' => 'Notifications',
'ui.settings.tab.account' => 'Account',
'ui.settings.tab.ai' => 'AI',
'ui.settings.tab.meshcore' => 'MeshCore Radio',
'ui.settings.meshcore.my_radios' => 'My MeshCore Radios',
'ui.settings.meshcore.help' => 'Register your MeshCore radio. Once registered, the bridge will recognize your radio and respond to you over the air.',
'ui.settings.meshcore.add_radio' => 'Add Radio',
'ui.settings.meshcore.add_radio_title' => 'Add Radio',
'ui.settings.meshcore.edit_radio_title' => 'Edit Radio',
'ui.settings.meshcore.no_radios' => 'No radios registered. Click Add Radio to link your MeshCore node.',
'ui.settings.meshcore.node_id' => 'Node ID',
'ui.settings.meshcore.node_id_placeholder' => 'e.g. a1b2c3d4e5f6',
'ui.settings.meshcore.node_id_help' => '12-character hex node ID shown in the MeshCore app, or the full 64-character public key.',
'ui.settings.meshcore.display_name' => 'Display Name',
'ui.settings.meshcore.display_name_placeholder' => 'Optional',
'ui.settings.meshcore.display_name_help' => 'Optional. Leave blank to use the name broadcast by your radio.',
'ui.settings.meshcore.bridge' => 'Companion Radio',
'ui.settings.meshcore.bridge_none' => '? None ?',
'ui.settings.meshcore.bridge_help' => 'The companion radio that should relay messages to and from this contact.',
'ui.settings.meshcore.col_node_id' => 'Node ID',
'ui.settings.meshcore.col_name' => 'Name',
'ui.settings.meshcore.col_type' => 'Type',
'ui.settings.meshcore.col_bridge' => 'Bridge',
'ui.settings.meshcore.col_last_seen' => 'Last Seen',
'ui.settings.meshcore.col_actions' => 'Actions',
'ui.settings.meshcore.never' => 'Never',
'ui.settings.meshcore.delete_confirm' => 'Remove this radio from your account?',
'ui.settings.meshcore.scan_qr' => 'Scan QR',
'ui.settings.meshcore.scan_qr_title' => 'Scan QR Code',
'ui.settings.meshcore.scan_qr_prompt' => 'Point camera at a MeshCore QR code',
'ui.settings.meshcore.scan_qr_https_required' => 'QR scanning requires HTTPS',
'ui.admin.meshcore.delete_contact_confirm' => 'Delete this contact?',
'ui.admin.meshcore.delete_selected' => 'Delete Selected',
'ui.admin.meshcore.delete_selected_confirm' => 'Delete {count} selected contacts?',
'ui.admin.meshcore.autoadd_title' => 'Auto-Add Contact Policy',
'ui.admin.meshcore.autoadd_help' => 'Controls which node types the device automatically adds to its contact list when heard. Turning auto-add off (recommended) lets you manage contacts manually via the BBS.',
'ui.admin.meshcore.autoadd_chat' => 'Auto-add companions (chat)',
'ui.admin.meshcore.autoadd_repeater' => 'Auto-add repeaters',
'ui.admin.meshcore.autoadd_room_server' => 'Auto-add room servers',
'ui.admin.meshcore.autoadd_sensor' => 'Auto-add sensors',
'ui.admin.meshcore.autoadd_overwrite_oldest' => 'Overwrite oldest contact when list is full',
'ui.admin.meshcore.autoadd_unknown' => 'Unknown (not yet read from device)',
'ui.admin.meshcore.autoadd_read_device' => 'Read from Device',
'ui.admin.meshcore.autoadd_read_queued' => 'Read request queued. Refresh this page after the bridge next polls.',
'ui.admin.meshcore.autoadd_read_waiting' => 'Waiting for device response?',
'ui.admin.meshcore.autoadd_read_timeout' => 'Device did not respond. Try again.',
'ui.admin.meshcore.autoadd_pending_sync' => 'Saved ? waiting for bridge to apply to device.',
'ui.admin.packet_bbs.session.not_logged_in' => 'not logged in',
'ui.admin.packet_bbs.session.empty' => 'No active sessions.',
'ui.admin.packet_bbs.session.node_id' => 'Node ID',
'ui.admin.packet_bbs.session.user' => 'User',
'ui.admin.packet_bbs.session.menu_state' => 'Menu State',
'ui.admin.packet_bbs.session.started' => 'Session Started',
'ui.admin.packet_bbs.session.last_activity' => 'Last Activity',
'ui.admin.packet_bbs.session.pagination_cursor' => 'Pagination Cursor',
'ui.admin.packet_bbs.session.pagination_context' => 'Pagination Context',
'ui.admin.packet_bbs.session.compose_type' => 'Compose Type',
'ui.admin.packet_bbs.session.compose_buffer' => 'Compose Buffer',
'ui.admin.packet_bbs.session.compose_meta' => 'Compose Meta',
'ui.admin.packet_bbs.session.state' => 'Session State',
'ui.admin.packet_bbs.session.kill' => 'Kill Session',
'ui.admin.packet_bbs.session.kill_btn' => 'Kill',
'ui.admin.packet_bbs.session.kill_confirm' => 'Kill session for {nodeId}?',
'ui.admin.packet_bbs.session.detail_title' => 'Session',
'ui.admin.packet_bbs.queue.empty' => 'Queue is empty.',
'ui.admin.packet_bbs.queue.flush_confirm' => 'Flush all pending outbound messages?',
'ui.admin.packet_bbs.key.configured' => 'API key is configured',
'ui.admin.packet_bbs.key.not_set' => 'No API key set',
'ui.admin.packet_bbs.key.regenerate' => 'Regenerate Key',
'ui.admin.packet_bbs.key.generate' => 'Generate Key',
'ui.admin.packet_bbs.node.no_user' => 'none',
'ui.admin.packet_bbs.node.never_seen' => 'never',
'ui.admin.packet_bbs.node.manage_contacts' => 'Manage Contacts',
'ui.admin.packet_bbs.node.add_title' => 'Add Node',
'ui.admin.packet_bbs.node.edit_title' => 'Edit Node',
'ui.admin.packet_bbs.node.delete_confirm' => 'Delete node {nodeId}? This will also end any active session.',
'ui.settings.ai.mcp_key_title' => 'AI Assistant Access',
'ui.settings.ai.mcp_not_enabled' => 'AI assistant access is not currently enabled on this BBS. Please contact the sysop if you are interested in this feature.',
'ui.settings.ai.mcp_what_is' => 'The MCP (Model Context Protocol) server allows AI assistants such as Claude to connect to this BBS and read echomail on your behalf. Your personal bearer key authenticates the connection ? the AI sees only what you can see.',
'ui.settings.ai.mcp_server_url_label' => 'MCP Server URL',
'ui.settings.ai.mcp_help_button' => 'Show setup help for AI agents',
'ui.settings.ai.mcp_key_help' => 'Keep your bearer key private. You can revoke and regenerate it at any time ? revoking immediately disconnects any AI client using the old key.',
'ui.settings.ai.mcp_current_key' => 'Current Key',
'ui.settings.ai.mcp_no_key' => 'No key generated yet.',
'ui.settings.ai.mcp_generate' => 'Generate Key',
'ui.settings.ai.mcp_regenerate' => 'Regenerate',
'ui.settings.ai.mcp_regenerate_confirm' => 'Regenerating the key will invalidate the existing key. Any MCP clients using the old key will stop working. Continue?',
'ui.settings.ai.mcp_revoke' => 'Revoke',
'ui.settings.ai.mcp_revoke_confirm' => 'Are you sure you want to revoke your MCP key? Any MCP clients using it will stop working.',
'ui.settings.ai.mcp_revoked' => 'MCP key revoked.',
'ui.settings.ai.mcp_key_once_title' => 'Save your key now',
'ui.settings.ai.mcp_key_once_help' => 'This is the only time your full key will be shown. Copy it now and store it securely.',
'ui.settings.ai.mcp_copy' => 'Copy',
'ui.settings.ai.mcp_copied' => 'Key copied to clipboard.',
'ui.settings.ai.registration_required' => 'AI services are an advanced feature and require a registered license. Please ask the sysop to register their copy of BinktermPHP to enable MCP server access.',
'ui.settings.ai.mcp_service_unavailable' => 'AI services are not currently available. Please contact the sysop to request enabling them.',
'ui.settings.display_preferences' => 'Display Preferences',
'ui.settings.messages_per_page' => 'Messages per Page',
'ui.settings.messages_per_page_help' => 'Number of messages to display per page',
'ui.settings.timezone' => 'Timezone',
'ui.settings.timezone_help' => 'Your local timezone for displaying dates',
'ui.settings.language' => 'Language',
'ui.settings.language_help' => 'Preferred language for the interface',
'ui.settings.date_format' => 'Date Format',
'ui.settings.date_format_help' => 'Your preferred date and time format',
'ui.settings.date_format.option.en_us' => 'American (MM/DD/YYYY) - Jan 31, 2026, 10:30 AM',
'ui.settings.date_format.option.en_gb' => 'British (DD/MM/YYYY) - 31 Jan 2026, 10:30',
'ui.settings.date_format.option.en_ca' => 'Canadian (YYYY-MM-DD) - 2026-01-31, 10:30 a.m.',
'ui.settings.date_format.option.de_de' => 'German (DD.MM.YYYY) - 31.01.2026, 10:30',
'ui.settings.date_format.option.fr_fr' => 'French (DD/MM/YYYY) - 31/01/2026 10:30',
'ui.settings.date_format.option.es_es' => 'Spanish (DD/MM/YYYY) - 31/1/2026, 10:30',
'ui.settings.date_format.option.it_it' => 'Italian (DD/MM/YYYY) - 31/01/2026, 10:30',
'ui.settings.date_format.option.ja_jp' => 'Japanese (YYYY/MM/DD) - 2026/01/31 10:30',
'ui.settings.date_format.option.zh_cn' => 'Chinese (YYYY/M/D) - 2026/1/31, 10:30',
'ui.settings.date_format.option.sv_se' => 'Swedish (YYYY-MM-DD) - 2026-01-31 10:30',
'ui.settings.theme' => 'Theme',
'ui.settings.theme_help' => 'Choose your preferred color scheme',
'ui.settings.interface_style' => 'Interface Style',
'ui.settings.interface_style.web' => 'Web Interface (default navbar & menus)',
'ui.settings.interface_style.bbs_menu' => 'BBS Menu (hotkey navigation)',
'ui.settings.interface_style_help' => 'Choose your preferred navigation style.',
'ui.settings.default_echo_list' => 'Default Echo Area List',
'ui.settings.system_default' => 'System Default',
'ui.settings.default_echo_list.reader' => 'Reader (Message List)',
'ui.settings.default_echo_list.echolist' => 'Echo List (Grouped by Network)',
'ui.settings.default_echo_list_help' => 'Choose your preferred default view when accessing echo areas from the menu',
'ui.settings.message_font' => 'Message Font',
'ui.settings.message_font_help' => 'Font family for displaying netmail and echomail messages',
'ui.settings.message_font_size' => 'Message Font Size',
'ui.settings.message_font_size_help' => 'Font size for displaying netmail and echomail messages',
'ui.settings.message_signature' => 'Message Signature',
'ui.settings.message_signature_placeholder' => 'Your signature (max 4 lines)',
'ui.settings.message_signature_help' => 'Appended to outgoing netmail and echomail messages. Max 4 lines.',
'ui.settings.default_tagline' => 'Default Tagline',
'ui.settings.no_tagline' => 'No tagline',
'ui.settings.random_tagline' => 'Random tagline',
'ui.settings.default_tagline_help' => 'Used as the default tagline when composing messages. Choose "Random tagline" to pick one at random each time.',
'ui.settings.threading_preferences' => 'Threading Preferences',
'ui.settings.threaded_view_echomail' => 'Enable threaded view for echomail',
'ui.settings.threaded_view_echomail_help' => 'Group echomail messages by conversation threads',
'ui.settings.threaded_view_netmail' => 'Enable threaded view for netmail',
'ui.settings.threaded_view_netmail_help' => 'Group netmail messages by conversation threads',
'ui.settings.page_position_memory' => 'Page Position Memory',
'ui.settings.remember_page_position' => 'Remember last page in echomail and netmail',
'ui.settings.remember_page_position_help' => 'Automatically return to the page you were on when you come back to an area',
'ui.settings.quote_display' => 'Quote Display',
'ui.settings.quote_coloring' => 'Color quoted text by depth',
'ui.settings.quote_coloring_help' => 'Show quoted message lines (starting with >) in different colors based on nesting level',
'ui.settings.media_render_mode' => 'Inline Media Rendering',
'ui.settings.media_render_mode.click' => 'Click to expand media',
'ui.settings.media_render_mode.auto' => 'Automatically render rich media (recommended)',
'ui.settings.media_render_mode.help' => 'Controls whether platform embeds, media files, and inline images are rendered automatically or expanded on demand. Video hosting platforms and other third-party media providers may use analytics when embedded media is loaded.',
'ui.settings.media_render_mode.disabled_globally' => 'Inline media rendering has been disabled by the administrator.',
'ui.settings.echomail_ignore_rules.title' => 'Ignored Echomail',
'ui.settings.echomail_ignore_rules.help' => 'Manage sender and subject rules that hide echomail messages from your reader.',
'ui.settings.echomail_ignore_rules.loading' => 'Loading ignore rules...',
'ui.settings.echomail_ignore_rules.empty' => 'No echomail ignore rules saved.',
'ui.settings.echomail_ignore_rules.subject_contains_prefix' => 'Subject contains:',
'ui.settings.echomail_ignore_rules.remove' => 'Remove',
'ui.settings.echomail_ignore_rules.remove_confirm' => 'Remove this echomail ignore rule?',
'ui.settings.notifications' => 'Notifications',
'ui.settings.chat_notification_sound' => 'Chat sound',
'ui.settings.echomail_notification_sound' => 'New echomail sound',
'ui.settings.netmail_notification_sound' => 'New netmail sound',
'ui.settings.file_notification_sound' => 'New file sound',
'ui.settings.notification_sound_disabled' => 'Disabled',
'ui.settings.preview_sound' => 'Preview sound',
'ui.settings.notification_sound_help' => 'Choose which notification sound plays when new chat, echomail, netmail, or files arrive.',
'ui.settings.forward_netmail_email' => 'Forward netmail to email',
'ui.settings.forward_netmail_email_help' => 'Send a copy of incoming netmail messages to your email address. Requires a valid email address in your profile and SMTP to be configured.',
'ui.settings.echomail_digest' => 'Echomail Digest',
'ui.settings.echomail_digest_none' => 'Off',
'ui.settings.echomail_digest_daily' => 'Daily',
'ui.settings.echomail_digest_weekly' => 'Weekly',
'ui.settings.echomail_digest_help' => 'Receive a periodic email summarising new messages in your subscribed echo areas. Requires a valid email address and SMTP to be configured.',
'ui.settings.echomail_badge_mode' => 'New Echomail Badge',
'ui.settings.echomail_badge_mode_new' => 'New since last visit',
'ui.settings.echomail_badge_mode_unread' => 'Total unread',
'ui.settings.echomail_badge_mode_help' => 'Controls what the dashboard echomail badge counts.',
'ui.settings.onboarding.title' => 'Echomail Onboarding',
'ui.settings.onboarding.help' => 'Reset the echomail onboarding guide so it will be shown again the next time you visit Echomail.',
'ui.settings.onboarding.reset_button' => 'Reset Onboarding Guide',
'ui.settings.onboarding.reset_success' => 'Onboarding reset. You will be taken through the guide next time you visit Echomail.',
'ui.settings.onboarding.reset_error' => 'Failed to reset onboarding.',
'ui.echo_onboarding.page_title' => 'Welcome to Echomail',
'ui.echo_onboarding.heading' => 'Welcome to Echomail',
'ui.echo_onboarding.intro' => 'Echomail is a public forum system that connects this BBS with a worldwide network of other systems. Here\'s a quick introduction before you dive in.',
'ui.echo_onboarding.what_is.title' => 'What is Echomail?',
'ui.echo_onboarding.what_is.body' => 'Echomail is organized into topic-based areas ? similar to newsgroups or mailing lists ? covering a wide range of subjects including retro computing, amateur radio, programming, hobbies, sports, creative writing, and general chat. Messages are visible to everyone on the network.',
'ui.echo_onboarding.how_it_works.title' => 'How Does It Work?',
'ui.echo_onboarding.how_it_works.body' => 'This BBS is part of a FidoNet-style network. When you post a message, it\'s automatically exchanged with other BBSes carrying the same area. Messages from those systems arrive here too ? so your conversations reach a worldwide community.',
'ui.echo_onboarding.getting_started.title' => 'Getting Started',
'ui.echo_onboarding.getting_started.body' => 'The easiest way to get started is with Interests ? curated bundles of related echo areas. Subscribe to an interest and you\'re subscribed to all its areas at once. You can also browse and subscribe to individual areas.',
'ui.echo_onboarding.tips.title' => 'Good to Know',
'ui.echo_onboarding.tips.tip_areas' => 'Each echo area has a tag and a description. Tags identify the area within its network ? some networks include the network name as part of the tag. The network domain is also shown alongside the tag so you always know which network an area belongs to.',
'ui.echo_onboarding.tips.tip_multi_network' => 'This BBS is connected to more than one network. You may see similarly-named echo areas from different networks ? for example, a GENERAL area may exist on several networks at once. Interests can include areas from multiple networks, so keep an eye on the network domain shown next to each area.',
'ui.echo_onboarding.tips.tip_network' => 'Messages may take a few minutes to an hour to arrive from other systems, depending on how often this BBS polls its uplink.',
'ui.echo_onboarding.tips.tip_posting' => 'When you post a message, it will appear locally right away and be delivered to the wider network on the next poll.',
'ui.echo_onboarding.tips.tip_interests' => 'You can change your individual echo area subscriptions later from the Subscriptions page, or your interests from the Interests menu, or revisit this guide from your Settings.',
'ui.echo_onboarding.next_button' => 'Next: Select Interests',
'ui.echo_onboarding.skip_button' => 'Skip, take me to Echomail',
'ui.settings.session_security' => 'Session & Security',
'ui.settings.active_sessions' => 'Active Sessions',
'ui.settings.active_sessions_help' => 'Manage your active login sessions',
'ui.settings.view_sessions' => 'View Sessions',
'ui.settings.security_actions' => 'Security Actions',
'ui.settings.logout_all_help' => 'Logout from all devices',
'ui.settings.logout_all' => 'Logout All',
'ui.settings.save_settings' => 'Save Settings',
'ui.settings.system_status' => 'System Status',
'ui.settings.binkp_status' => 'BinkP Status',
'ui.settings.online' => 'Online',
'ui.settings.last_poll' => 'Last Poll',
'ui.settings.messages_today' => 'Messages Today',
'ui.settings.never' => 'Never',
'ui.settings.quick_actions' => 'Quick Actions',
'ui.settings.compose_netmail' => 'Compose Netmail',
'ui.settings.post_echomail' => 'Post Echomail',
'ui.settings.help_support' => 'Help & Support',
'ui.settings.load_failed_console' => 'Failed to load settings',
'ui.settings.saving' => 'Saving settings...',
'ui.settings.saved_successfully' => 'Settings saved successfully!',
'ui.settings.sessions.none_active' => 'No active sessions found.',
'ui.settings.sessions.loading' => 'Loading sessions...',
'ui.settings.sessions.load_failed' => 'Failed to load sessions',
'ui.settings.sessions.current' => 'Current',
'ui.settings.sessions.created' => 'Created',
'ui.settings.sessions.expires' => 'Expires',
'ui.settings.sessions.revoke' => 'Revoke',
'ui.settings.sessions.revoke_confirm' => 'Are you sure you want to revoke this session?',
'ui.settings.sessions.revoked_success' => 'Session revoked successfully',
'ui.settings.sessions.logged_out_all_success' => 'Logged out from all sessions',
'ui.settings.sessions.logout_all_confirm' => 'Are you sure you want to logout from all devices? You will need to login again.',
'ui.settings.polling_uplinks' => 'Polling uplinks... (this may take a moment)',
'ui.settings.poll_complete_prefix' => 'Uplink poll completed: ',
'ui.settings.poll_complete_exit' => 'Uplink poll completed (exit {code})',
'ui.settings.poll_failed_prefix' => 'Poll failed: ',
// Compose / Drafts / Address Book
'ui.compose.title_prefix' => 'Compose',
'ui.compose.back_to_prefix' => 'Back to',
'ui.compose.to_address_label' => 'To Address (leave blank for local)',
'ui.compose.fidonet_address_help' => 'FTN address or system name',
'ui.compose.node_search.searching' => 'Searching...',
'ui.compose.node_search.no_results' => 'No nodes found',
'ui.compose.to_name_required' => 'To Name *',
'ui.compose.attach_file' => 'Attach File',
'ui.compose.attach_file_help_short' => 'requires crashmail; subject will be set to filename',
'ui.compose.echo_area_required' => 'Echo Area *',
'ui.compose.select_echo_area' => 'Select echo area...',
'ui.compose.to_name' => 'To Name',
'ui.compose.to_name_public_help' => "Leave as 'All' for public message",
'ui.compose.cross_post_to_other_areas' => 'Cross-post to other areas',
'ui.compose.cross_post_help_prefix' => 'Select additional areas to post this message to (max',
'ui.compose.cross_post_help_suffix' => 'Each area receives an independent copy.',
'ui.compose.stylecodes.inverse_title' => 'Inverse (#inverse#)',
'ui.compose.stylecodes.active_prefix' => 'StyleCodes active -',
'ui.compose.markdown.mode' => 'Markdown mode',
'ui.compose.markdown.toolbar_aria' => 'Markdown formatting',
'ui.compose.markdown.bold_title' => 'Bold (Ctrl+B)',
'ui.compose.markdown.italic_title' => 'Italic (Ctrl+I)',
'ui.compose.markdown.heading_1_title' => 'Heading 1',
'ui.compose.markdown.heading_2_title' => 'Heading 2',
'ui.compose.markdown.heading_3_title' => 'Heading 3',
'ui.compose.markdown.inline_code_title' => 'Inline code',
'ui.compose.markdown.code_block_title' => 'Code block',
'ui.compose.markdown.link_title' => 'Link (Ctrl+K)',
'ui.compose.markdown.image_title' => 'Insert image',
'ui.compose.markdown.image_modal.title' => 'Insert Image',
'ui.compose.markdown.image_modal.tab_url' => 'Image URL',
'ui.compose.markdown.image_modal.tab_upload' => 'Upload',
'ui.compose.markdown.image_modal.url_label' => 'Image URL',
'ui.compose.markdown.image_modal.url_placeholder' => 'https://example.com/image.jpg',
'ui.compose.markdown.image_modal.alt_label' => 'Alt text',
'ui.compose.markdown.image_modal.alt_placeholder' => 'Description of the image',
'ui.compose.markdown.image_modal.insert' => 'Insert',
'ui.compose.markdown.image_modal.upload_hint' => 'JPEG, PNG, GIF, or WebP \u2014 max 5 MB',
'ui.compose.markdown.image_modal.uploading' => 'Uploading...',
'ui.compose.markdown.image_modal.tab_picker' => 'My Images',
'ui.compose.markdown.image_modal.picker_empty' => 'No images uploaded yet.',
'ui.compose.markdown.image_modal.picker_loading' => 'Loading...',
'ui.compose.markdown.image_modal.tab_paste' => 'Paste',
'ui.compose.markdown.image_modal.paste_hint' => 'Click here, then paste an image (Ctrl+V / \u2318V)',
'ui.compose.markdown.image_modal.paste_ready' => 'Image ready ? click Insert',
'ui.compose.markdown.image_modal.paste_no_image' => 'No image found in clipboard. Copy an image first, then paste.',
'ui.compose.markdown.unordered_list_title' => 'Unordered list',
'ui.compose.markdown.ordered_list_title' => 'Ordered list',
'ui.compose.markdown.blockquote_title' => 'Blockquote',
'ui.compose.markdown.horizontal_rule_title' => 'Horizontal rule',
'ui.compose.markdown.edit_mode_title' => 'Edit mode',
'ui.compose.markdown.preview_rendered_title' => 'Preview rendered output',
'ui.compose.markdown.quick_reference_title' => 'Markdown quick reference',
'ui.compose.markdown.write_placeholder' => 'Write your markdown message here...',
'ui.compose.markdown.click_preview_hint' => 'Click Preview to see the rendered output.',
'ui.compose.markdown.formatting_active' => 'Markdown formatting active.',
'ui.compose.markdown.quick_reference' => 'Quick reference',
'ui.compose.markdown.link_modal.title' => 'Insert Link',
'ui.compose.markdown.link_modal.url_label' => 'URL',
'ui.compose.markdown.link_modal.text_label' => 'Link text',
'ui.compose.markdown.link_modal.text_placeholder' => 'Leave blank to use the URL',
'ui.compose.markdown.link_modal.insert' => 'Insert',
'ui.compose.markdown.unfurl.modal_title' => 'Unfurl Link?',
'ui.compose.markdown.unfurl.description' => 'Would you like to fetch a preview for this URL?',
'ui.compose.markdown.unfurl.keep_as_url' => 'Keep as URL',
'ui.compose.markdown.unfurl.fetch_preview' => 'Fetch Preview',
'ui.compose.markdown.unfurl.insert_preview' => 'Insert Preview',
'ui.compose.markdown.unfurl.fetching' => 'Fetching preview...',
'ui.compose.markup_format' => 'Markup Format',
'ui.compose.plain_text' => 'Plain text',
'ui.compose.markdown_label' => 'Markdown',
'ui.compose.stylecodes_label' => 'StyleCodes (GoldEd, SemPoint Rich Text, Synchronet Markup)',
'ui.compose.markup_format_help' => 'Send with markup formatting. Markdown and StyleCodes are supported on compatible networks.',
'ui.compose.charset' => 'Encoding',
'ui.compose.charset_help' => 'Character encoding for the outgoing packet. Use CP437 for legacy FTN systems that do not support UTF-8, such as fidonet.',
'ui.compose.insert_file' => 'Insert File',
'ui.compose.insert_image' => 'Add Image',
'ui.compose.hide_panel' => 'Hide panel',
'ui.compose.show_panel' => 'Show panel',
'ui.compose.netmail_guidelines' => 'Netmail Guidelines:',
'ui.compose.netmail_guideline_private' => 'Private messages between nodes',
'ui.compose.netmail_guideline_identity' => 'Posting identity for this destination: Real Name',
'ui.compose.netmail_guideline_identity_destination_real_name' => 'Posting identity for this destination: Real Name',
'ui.compose.netmail_guideline_identity_destination_username' => 'Posting identity for this destination: Username/Alias',
'ui.compose.netmail_guideline_addressing' => 'Use proper Fidonet addressing',
'ui.compose.netmail_guideline_respectful' => 'Be respectful and professional',
'ui.compose.netmail_guideline_routed' => 'Messages are routed through the network',
'ui.compose.netmail_cost' => 'Cost: {cost} {currency}',
'ui.compose.freq.label' => 'File Request (FREQ)',
'ui.compose.freq.help' => 'Requests a file from the remote system. Enter the filename in the Subject field. Leave the message body empty, or use it to provide a password for protected files.',
'ui.compose.freq.badge' => 'FREQ',
'ui.compose.crashmail.direct_delivery_label' => 'Crashmail (Direct Delivery)',
'ui.compose.crashmail.help_direct' => 'Attempt immediate direct delivery to the destination node, bypassing hub routing.',
'ui.compose.crashmail.help_reachable' => 'Requires the destination to be directly reachable.',
'ui.compose.crashmail.help_cost' => 'Costs {cost} {currency}.',
'ui.compose.echomail_guidelines' => 'Echomail Guidelines:',
'ui.compose.echomail_guideline_identity' => 'Posting identity: Select an echo area to see whether this post uses Real Name or Username/Alias',
'ui.compose.echomail_guideline_identity_area_real_name' => 'Posting identity for this area: Real Name',
'ui.compose.echomail_guideline_identity_area_username' => 'Posting identity for this area: Username/Alias',
'ui.compose.echomail_guideline_public' => 'Public forum messages',
'ui.compose.echomail_guideline_topic' => 'Stay on-topic for the echo area',
'ui.compose.echomail_guideline_respectful' => 'Be respectful to all participants',
'ui.compose.echomail_guideline_rules' => 'Follow the echo rules and moderation',
'ui.compose.tech_note_plain_text_only' => 'Plain text only (no HTML)',
'ui.compose.tech_note_line_length' => 'Lines should be less than 79 characters',
'ui.compose.tech_note_origin_line' => 'Origin line added automatically',
'ui.compose.invalid_fidonet_address_format' => 'Invalid Fidonet address format (e.g., 1:123/456)',
'ui.compose.send_failed_type' => 'Failed to send {type}',
'ui.compose.upload_attachment_failed' => 'Failed to upload attachment',
'ui.compose.reply_attribution' => 'On {date}, {name} wrote:',
'ui.compose.markdown.help.text_formatting' => 'Text Formatting',
'ui.compose.markdown.help.syntax' => 'Syntax',
'ui.compose.markdown.help.result' => 'Result',
'ui.compose.markdown.help.hyperlink' => 'hyperlink',
'ui.compose.markdown.help.image' => 'inline image',
'ui.compose.markdown.help.headings' => 'Headings',
'ui.compose.markdown.help.lists_blocks' => 'Lists & Blocks',
'ui.compose.markdown.help.bullet_list' => 'Bullet list',
'ui.compose.markdown.help.numbered_list' => 'Numbered list',
'ui.compose.markdown.help.blockquote' => 'Blockquote',
'ui.compose.markdown.help.horizontal_rule' => 'Horizontal rule',
'ui.compose.markdown.help.code_block' => 'Code Block',
'ui.compose.markdown.help.keyboard_shortcuts' => 'Keyboard Shortcuts',
'ui.compose.markdown.help.shortcut_bold' => 'Bold',
'ui.compose.markdown.help.shortcut_italic' => 'Italic',
'ui.compose.markdown.help.shortcut_link' => 'Link',
'ui.compose.markdown.help.shortcut_indent' => 'Indent (4 spaces)',
'ui.compose.subject_required' => 'Subject *',
'ui.compose.message_required' => 'Message *',
'ui.compose.plain_text_hint' => 'Use plain text. Fidonet standard formatting applies.',
'ui.compose.message_guidelines' => 'Message Guidelines',
'ui.compose.technical_notes' => 'Technical Notes',
'ui.compose.your_info' => 'Your Info',
'ui.compose.system' => 'System',
'ui.compose.address' => 'Address',
'ui.compose.tagline_help' => 'Select a sysop-provided tagline to append below your signature.',
'ui.compose.select_tagline' => 'Select a Tagline',
'ui.compose.advanced_options' => 'Advanced Options',
'ui.compose.body_too_large' => 'Message body is {kb} KB and exceeds the 16 KB FidoNet limit.',
'ui.compose.body_size_warning' => 'Message body is {kb} KB ? approaching the 16 KB FidoNet limit. Click Send again to proceed.',
'ui.compose.body_size_warning_inline' => 'Message body is {kb} KB ? approaching the 16 KB FidoNet limit.',
'ui.compose.hard_wrap' => 'Hard Wrap',
'ui.compose.hard_wrap_help' => 'Automatically wrap lines at the specified column when typing.',
'ui.compose.hard_wrap_off' => 'Off',
'ui.compose.hard_wrap_79' => '79 characters (standard)',
'ui.compose.hard_wrap_39' => '39 characters (narrow)',
'ui.compose.save_draft' => 'Save Draft',
'ui.compose.templates.button' => 'Templates',
'ui.compose.templates.loading' => 'Loading...',
'ui.compose.templates.none' => 'No saved templates',
'ui.compose.templates.save_current' => 'Save current as template',
'ui.compose.templates.manage' => 'Manage templates',
'ui.compose.templates.save_modal_title' => 'Save as Template',
'ui.compose.templates.manage_modal_title' => 'My Templates',
'ui.compose.templates.name_label' => 'Template name',
'ui.compose.templates.name_placeholder' => 'e.g. Monthly announcement',
'ui.compose.templates.type_label' => 'Available for',
'ui.compose.templates.type_both' => 'Netmail and Echomail',
'ui.compose.templates.type_netmail' => 'Netmail only',
'ui.compose.templates.type_echomail' => 'Echomail only',
'ui.compose.templates.save_button' => 'Save Template',
'ui.compose.templates.saved' => 'Template saved',
'ui.compose.templates.deleted' => 'Template deleted',
'ui.compose.templates.name_required' => 'Please enter a template name',
'ui.compose.templates.save_failed' => 'Failed to save template',
'ui.compose.templates.load_failed' => 'Failed to load template',
'ui.compose.templates.delete_confirm' => 'Delete this template?',
'ui.compose.templates.delete_failed' => 'Failed to delete template',
'ui.compose.send_prefix' => 'Send',
'ui.compose.sending' => 'Sending...',
'ui.compose.draft.empty_content' => 'Please add some content before saving draft',
'ui.compose.draft.saved_success' => 'Draft saved successfully',
'ui.compose.sent_cross_post_suffix' => ' (posted to {count} areas)',
'ui.compose.address_book.load_failed_short' => 'Failed to load',
'ui.compose.address_book.select_title' => 'Select from address book',
'ui.compose.address_book.create_title' => 'Create new address book entry',
'ui.compose.address_book.entry_added' => 'Entry added successfully',
'ui.compose.address_book.use_entry_confirm' => 'Use this entry for the current message?',
'ui.address_book.already_exists' => 'This contact is already in your address book',
'ui.address_book.load_failed' => 'Failed to load address book',
'ui.address_book.added_from_netmail' => 'Added from netmail message',
'ui.address_book.added_from_netmail_replyto_detail' => 'Added from netmail message. Original sender: {original_name} ({original_address}), Reply-to: {replyto_name} ({replyto_address})',
'ui.address_book.added_from_netmail_sender_detail' => 'Added from netmail message. Sender: {sender_name} ({sender_address})',
'ui.address_book.check_existing_failed' => 'Failed to check existing contacts',
'ui.address_book.entry_updated' => 'Entry updated successfully',
'ui.address_book.entry_deleted' => 'Entry deleted successfully',
'ui.address_book.sender_added' => '{name} added to address book',
'ui.address_book.saved_to_address_book' => 'Saved to address book',
'ui.address_book.delete_confirm' => 'Are you sure you want to delete "{name}" from your address book?',
'ui.address_book.node_address_placeholder' => '1:234/567',
'ui.address_book.node_address_title' => 'Enter a valid Fidonet address (e.g., 1:234/567 or 1:234/567.0)',
'ui.drafts.delete_confirm' => 'Are you sure you want to delete this draft? This cannot be undone.',
'ui.drafts.deleted_success' => 'Draft deleted successfully',
'ui.messages.none_selected' => 'No messages selected',
// Netmail
'ui.netmail.search.failed' => 'Search failed',
'ui.netmail.message_deleted_success' => 'Message deleted successfully',
'ui.netmail.delete_message_confirm' => 'Are you sure you want to delete this message? This action cannot be undone.',
'ui.netmail.delete_saved_confirm' => 'This message is saved. Are you sure you want to delete it?',
'ui.netmail.bulk_delete.confirm' => 'Are you sure you want to delete {count} message(s)?',
'ui.netmail.bulk_delete.saved_confirm' => '{count} of the selected messages are saved. Are you sure you want to delete them?',
'ui.netmail.bulk_delete.success' => 'Deleted {count} message(s)',
'ui.netmail.address_book.load_entry_failed_prefix' => 'Failed to load entry: ',
'ui.netmail.bulk_delete.failed' => 'Failed to delete messages',
'ui.netmail.no_drafts_found' => 'No drafts found',
'ui.netmail.to' => 'To',
'ui.netmail.from_to' => 'From/To',
'ui.netmail.last_updated' => 'Last Updated',
'ui.netmail.received' => 'Received',
'ui.netmail.badge_netmail' => 'NETMAIL',
'ui.netmail.badge_new' => 'NEW',
'ui.netmail.received_insecure_session_title' => 'Received via insecure session',
'ui.netmail.received_insecure_badge_title' => 'This message was received via an insecure/unauthenticated binkp session',
'ui.netmail.received_insecurely' => 'Received Insecurely',
'ui.netmail.not_authenticated' => 'This message was not authenticated',
'ui.netmail.next_page_title' => 'Load next page',
'ui.netmail.saved_items' => 'Saved',
'ui.netmail.saved_items.saved' => 'Message saved for later',
'ui.netmail.saved_items.removed' => 'Message removed from saved items',
// Echomail
'ui.echomail.search.failed' => 'Search failed',
'ui.echomail.view_all_echo_areas' => 'View all echo areas',
'ui.echomail.search_found_count' => '{count} found',
'ui.echomail.no_echoareas_available' => 'No echo areas available',
'ui.echomail.no_drafts_found' => 'No drafts found',
'ui.echomail.to_echo_area' => 'To / Echo Area',
'ui.echomail.last_updated' => 'Last Updated',
'ui.echomail.to_prefix' => 'to:',
'ui.echomail.bulk_mark_read_failed' => 'Failed to mark messages as read',
'ui.echomail.bulk_mark_read_success' => 'Marked {count} message(s) as read',
'ui.echomail.bulk_marking' => 'Marking...',
'ui.echomail.viewing_all_messages' => 'Viewing: All Messages',
'ui.echomail.no_area' => 'No area',
'ui.echomail.save_status.update_failed' => 'Failed to update save status',
'ui.echomail.bulk_delete.failed' => 'Failed to delete messages',
'ui.echomail.bulk_delete.success' => 'Deleted {count} message(s)',
'ui.echomail.bulk_delete.confirm' => 'Are you sure you want to delete {count} selected message(s) for everyone?',
'ui.echomail.bulk_delete.saved_confirm' => '{count} of the selected messages are saved. Are you sure you want to delete them?',
'ui.echomail.bulk_deleting' => 'Deleting...',
'ui.echomail.shares.check_failed' => 'Failed to check existing shares',
'ui.echomail.shares.friendly_url_failed' => 'Failed to generate friendly URL',
'ui.echomail.shares.revoke_confirm' => 'Are you sure you want to revoke this share link? It will no longer be accessible to others.',
'ui.echomail.plain_text_mode' => 'Plain text mode',
'ui.echomail.press_a_to_toggle' => 'press A to toggle',
'ui.echomail.press_a_to_cycle' => 'press A to cycle',
'ui.echomail.viewer_mode_prefix' => 'Viewer mode:',
'ui.echomail.viewer_mode_auto' => 'Auto',
'ui.echomail.viewer_mode_rip' => 'RIPscrip',
'ui.echomail.rip_render_failed' => 'Failed to render RIPscrip message',
'ui.echomail.viewer_mode_ansi' => 'ANSI',
'ui.echomail.viewer_mode_amiga_ansi' => 'Amiga ANSI',
'ui.echomail.viewer_mode_petscii' => 'PETSCII',
'ui.echomail.viewer_mode_plain' => 'Plain Text',
'ui.echomail.viewer_mode_raw' => 'Raw Source',
'ui.echomail.viewer_mode_rendered_markup' => 'Rendered {format}',
'ui.echomail.viewer_mode_markup_source' => '{format} Source ({mode})',
'ui.echomail.markup_markdown' => 'Markdown',
'ui.echomail.markup_stylecodes' => 'StyleCodes',
'ui.echomail.shortcuts.title' => 'Keyboard Shortcuts',
'ui.echomail.shortcuts.prev_next' => 'Previous / next message',
'ui.echomail.shortcuts.toggle_ansi' => 'Toggle ANSI / plain text rendering',
'ui.echomail.shortcuts.cycle_viewer_mode' => 'Cycle viewer mode (Auto, ANSI, Amiga ANSI, PETSCII, Plain Text, Raw Source)',
'ui.echomail.shortcuts.download' => 'Download message',
'ui.echomail.shortcuts.fullscreen' => 'Toggle fullscreen',
'ui.echomail.shortcuts.help' => 'Show / hide keyboard shortcuts',
'ui.echomail.shortcuts.close' => 'Close message',
'ui.echomail.shortcuts.dismiss' => 'Press ? or H to close this help',
'ui.echomail.edit_message' => 'Edit Message',
'ui.echomail.edit_message_saved' => 'Changes saved.',
'ui.echomail.art_format' => 'Art Format',
'ui.echomail.art_format_auto' => 'Auto-detect',
'ui.echomail.art_format_plain' => 'Plain text',
'ui.echomail.art_format_ansi' => 'ANSI',
'ui.echomail.art_format_amiga_ansi' => 'Amiga ANSI',
'ui.echomail.art_format_petscii' => 'PETSCII / C64',
'ui.echomail.message_charset' => 'Character Set',
'ui.echomail.next_page_title' => 'Load next page',
'ui.echomail.next_echo_title' => 'Next echo: {tag}',
'ui.echomail.end_of_echo_title' => 'End of {echo}',
'ui.echomail.end_of_echo_next_prompt' => 'Continue to {echo}?',
'ui.echomail.end_of_echo_go' => 'Go to {echo}',
'ui.echomail.end_of_echo_no_next' => 'You have no more unread messages.',
'ui.echomail.end_of_echo_next_btn_title' => 'End of echo',
'ui.echomail.subscribe' => 'Subscribe',
'ui.echomail.unsubscribe' => 'Unsubscribe',
'ui.echomail.fileref_label' => 'File comment:',
'ui.common.db_id' => 'DB ID',
'ui.common.message_id' => 'Message ID',
// Admin subscriptions
'ui.admin_subscriptions.page_title' => 'Admin: Manage Subscriptions',
'ui.admin_subscriptions.heading' => 'Subscription Management',
'ui.admin_subscriptions.breadcrumb_aria' => 'breadcrumb',
'ui.admin_subscriptions.breadcrumb_current' => 'Subscriptions',
'ui.admin_subscriptions.total_echoareas' => 'Total Echoareas',
'ui.admin_subscriptions.default_echoareas' => 'Default Echoareas',
'ui.admin_subscriptions.total_subscriptions' => 'Total Subscriptions',
'ui.admin_subscriptions.active_subscribers' => 'Active Subscribers',
'ui.admin_subscriptions.echoarea_default_subscriptions' => 'Echoarea Default Subscriptions',
'ui.admin_subscriptions.manage_default_help' => 'Manage which echoareas new users are automatically subscribed to',
'ui.admin_subscriptions.default' => 'Default',
'ui.admin_subscriptions.echoarea' => 'Echoarea',
'ui.admin_subscriptions.subscribers' => 'Subscribers',
'ui.admin_subscriptions.user_subs' => 'User Subs',
'ui.admin_subscriptions.auto_subs' => 'Auto Subs',
'ui.admin_subscriptions.messages' => 'Messages',
'ui.admin_subscriptions.default_subscription_title' => 'Default subscription',
'ui.admin_subscriptions.legend' => 'Legend:',
'ui.admin_subscriptions.legend_default' => 'Default subscription (new users auto-subscribed)',
'ui.admin_subscriptions.legend_total_badge' => 'Total',
'ui.admin_subscriptions.legend_total' => 'All active subscribers',
'ui.admin_subscriptions.legend_user_badge' => 'User',
'ui.admin_subscriptions.legend_user' => 'User-initiated subscriptions',
'ui.admin_subscriptions.legend_auto_badge' => 'Auto',
'ui.admin_subscriptions.legend_auto' => 'Automatic/admin subscriptions',
'ui.admin_subscriptions.how_it_works' => 'How it works:',
'ui.admin_subscriptions.how_default_toggle' => 'Toggle "Default" to make echoareas auto-subscribe for new users',
'ui.admin_subscriptions.how_existing_users' => 'When enabled, all existing users also get auto-subscribed',
'ui.admin_subscriptions.how_unsubscribe' => 'Users can still unsubscribe from default echoareas',
'ui.admin_subscriptions.action_enabled' => 'enabled',
'ui.admin_subscriptions.action_disabled' => 'disabled',
'ui.admin_subscriptions.update_success' => 'Default subscription {action} successfully! Page will refresh to show updated stats.',
'ui.admin_subscriptions.default_enabled_success' => 'Default subscription enabled successfully! Page will refresh to show updated stats.',
'ui.admin_subscriptions.default_disabled_success' => 'Default subscription disabled successfully! Page will refresh to show updated stats.',
'ui.admin_subscriptions.update_failed' => 'Failed to update default subscription. Please try again.',
'ui.admin_subscriptions.network_error' => 'Network error. Please try again.',
// User subscriptions
'ui.user_subscriptions.page_title' => 'Manage Your Echoarea Subscriptions',
'ui.user_subscriptions.heading' => 'Manage Your Echoarea Subscriptions',
'ui.user_subscriptions.heading_help' => 'Subscribe to echoareas to see their messages',
'ui.user_subscriptions.search_placeholder' => 'Search echoareas...',
'ui.user_subscriptions.default_subscription_title' => 'Default subscription',
'ui.user_subscriptions.new_area_badge' => 'New!',
'ui.user_subscriptions.new_area_title' => 'Created in the past 30 days',
'ui.user_subscriptions.message_count' => '{count} messages',
'ui.user_subscriptions.dot_subscribed' => '- Subscribed',
'ui.user_subscriptions.automatic' => '(automatic)',
'ui.user_subscriptions.view_messages' => 'View Messages',
'ui.user_subscriptions.subscription_info' => 'Subscription Info',
'ui.user_subscriptions.subscribed_label' => 'Subscribed:',
'ui.user_subscriptions.how_subscriptions_work' => 'How Subscriptions Work',
'ui.user_subscriptions.how_new_users' => 'New users are automatically subscribed to popular echoareas',
'ui.user_subscriptions.how_subscribe_unsubscribe' => 'You can subscribe/unsubscribe to any echoarea',
'ui.user_subscriptions.how_only_subscribed' => 'Only subscribed echoareas appear in your message lists',
'ui.user_subscriptions.how_star_means_default' => 'indicates default echoareas',
'ui.user_subscriptions.subscribed_success' => 'Subscribed successfully!',
'ui.user_subscriptions.unsubscribed_success' => 'Unsubscribed successfully!',
'ui.user_subscriptions.update_failed' => 'Failed to update subscription. Please try again.',
'ui.user_subscriptions.network_error' => 'Network error. Please try again.',
'ui.user_subscriptions.filter_heading' => 'Filters',
'ui.user_subscriptions.filter_by_interest' => 'Filter by interest:',
'ui.user_subscriptions.all_networks' => 'All Networks',
'ui.user_subscriptions.all_interests' => 'All Interests',
'ui.user_subscriptions.only_groups_with_messages' => 'Only show groups with messages',
'ui.user_subscriptions.networks_selected' => '{count} networks',
'ui.user_subscriptions.interests_selected' => '{count} interests',
'ui.user_subscriptions.no_interest_groups' => 'No interest groups match this filter',
'ui.user_subscriptions.local' => 'Local',
'ui.user_subscriptions.unknown' => 'Unknown',
'ui.user_subscriptions.sort_by' => 'Sort by:',
'ui.user_subscriptions.sort_name' => 'Name',
'ui.user_subscriptions.sort_created' => 'Date created',
'ui.user_subscriptions.sort_messages' => 'Messages',
'ui.user_subscriptions.sort_direction_asc' => 'Sort ascending',
'ui.user_subscriptions.sort_direction_desc' => 'Sort descending',
'ui.user_subscriptions.interests_blurb' => 'Interests are another way to manage echo area subscriptions by topic.',
'ui.user_subscriptions.review_interests' => 'Review your interests.',
// Echoareas import
'ui.echoareas_import.page_title' => 'Import Echo Areas',
'ui.echoareas_import.heading' => 'Import Echo Areas',
'ui.echoareas_import.back_to_echo_areas' => 'Back to Echo Areas',
'ui.echoareas_import.processed' => 'Processed:',
'ui.echoareas_import.created' => 'Created:',
'ui.echoareas_import.updated' => 'Updated:',
'ui.echoareas_import.skipped_blank_rows' => 'Skipped blank rows:',
'ui.echoareas_import.errors' => 'Errors:',
'ui.echoareas_import.import_errors' => 'Import Errors',
'ui.echoareas_import.tab_csv' => 'CSV File',
'ui.echoareas_import.tab_na' => '.NA File',
'ui.echoareas_import.upload_csv' => 'Upload CSV',
'ui.echoareas_import.csv_file' => 'CSV File',
'ui.echoareas_import.csv_help' => 'UTF-8 CSV is recommended. Header row is optional.',
'ui.echoareas_import.import_echo_areas' => 'Import Echo Areas',
'ui.echoareas_import.csv_format' => 'CSV Format',
'ui.echoareas_import.each_row_fields' => 'Each row must contain these fields in this order:',
'ui.echoareas_import.example' => 'Example:',
'ui.echoareas_import.import_rules' => 'Import Rules',
'ui.echoareas_import.rule_domain_blank' => '<code>DOMAIN</code> may be blank. Blank domain imports the area as local-only.',
'ui.echoareas_import.rule_domain_exists' => 'If a domain is provided, it must already exist in your BinkP network configuration.',
'ui.echoareas_import.rule_existing_area' => 'If an area already exists with the same <code>ECHOTAG</code> and domain, its description is updated and the area is reactivated.',
'ui.echoareas_import.rule_new_areas' => 'New areas are created active with default settings; you can fine-tune them afterward in Echo Areas Management.',
'ui.echoareas_import.rule_header_optional' => 'Header row <code>ECHOTAG,DESCRIPTION,DOMAIN</code> is accepted but not required.',
'ui.echoareas_import.upload_na' => 'Upload .NA File',
'ui.echoareas_import.na_file' => '.NA File',
'ui.echoareas_import.na_help' => 'Whitespace-delimited area list (.NA) file. UTF-8 recommended.',
'ui.echoareas_import.na_domain' => 'Network Domain',
'ui.echoareas_import.na_domain_help' => 'All areas in the file will be assigned to this domain.',
'ui.echoareas_import.na_domain_local' => 'Local (no domain)',
'ui.echoareas_import.na_format' => '.NA Format',
'ui.echoareas_import.na_format_desc' => 'Each line contains an echo tag followed by a description, separated by whitespace:',
'ui.echoareas_import.rule_na_domain_selector' => 'The domain you select above applies to every area in the file. Choose <em>Local</em> to import areas with no network domain.',
'ui.echoareas_import.rule_na_comments' => 'Lines beginning with <code>%</code> or <code>;</code> are treated as comments and skipped.',
'ui.echoareas_import.importing' => 'Importing...',
'ui.echoareas_import.error_line_prefix' => 'Line {line}: {message}',
'ui.echoareas_import.error_open_csv' => 'Unable to open uploaded CSV file.',
'ui.echoareas_import.error_open_na' => 'Unable to open uploaded .NA file.',
'ui.echoareas_import.error_duplicate_row' => 'Duplicate ECHOTAG within the import file.',
'ui.echoareas_import.error_tag_description_required' => 'ECHOTAG and DESCRIPTION are required.',
'ui.echoareas_import.error_invalid_tag' => 'Invalid ECHOTAG. Use only letters, numbers, dots, underscores, and hyphens.',
'ui.echoareas_import.error_invalid_domain' => 'Invalid DOMAIN. Use only letters, numbers, underscores, and hyphens.',
'ui.echoareas_import.error_unknown_domain' => 'Unknown DOMAIN \'{domain}\'. Add the network domain first in BinkP configuration.',
'ui.echoareas_import.error_apply_failed' => 'Import failed and no changes were applied.',
'ui.echoareas_import.error_unexpected' => 'Unexpected import error.',
'ui.echoareas_import.error_choose_csv' => 'Please choose a CSV file to import.',
'ui.echoareas_import.error_choose_na' => 'Please choose a .NA file to import.',
'ui.echoareas_import.error_upload_failed' => 'The upload failed. Please try again.',
'ui.echoareas_import.error_invalid_upload' => 'Invalid uploaded file.',
// API success messages
'ui.api.reminder.sent' => 'Account reminder sent successfully',
'ui.api.files.uploaded' => 'File uploaded successfully',
'ui.api.files.deleted' => 'File deleted successfully',
'ui.api.files.renamed' => 'File renamed successfully',
'ui.api.messages.sent' => 'Message sent successfully',
'ui.api.messages.bulk_mark_read' => 'Marked messages as read',
'ui.api.messages.bulk_deleted' => 'Deleted messages',
'ui.api.messages.saved' => 'Message saved',
'ui.api.messages.unsaved' => 'Message unsaved',
'ui.api.messages.share_revoked' => 'Share link revoked',
'ui.api.credits.sent' => 'Credits sent successfully',
'ui.api.debug.delete_endpoint_accessible' => 'Delete endpoint is accessible',
'ui.api.admin.mrc_restart_initiated' => 'MRC daemon restart initiated',
'ui.api.admin.binkp_config_reloaded' => 'BinkP configuration reload requested',
'ui.api.binkp.uplink_added' => 'Uplink added successfully',
'ui.api.binkp.uplink_updated' => 'Uplink updated successfully',
'ui.api.binkp.uplink_removed' => 'Uplink removed successfully',
'ui.api.binkp.file_deleted' => 'File deleted successfully',
'ui.api.binkp.file_retry_started' => 'File retry initiated successfully',
'ui.api.binkp.config_updated' => 'Configuration updated successfully',
'ui.api.binkp.poll_triggered' => 'BinkP poll triggered',
'ui.api.binkp.poll_all_triggered' => 'BinkP poll-all triggered',
'ui.api.binkp.process_packets_started' => 'Packet processing started',
'ui.api.door.session_resumed' => 'Resuming existing session',
// BBS Lists dropdown (public nav) + admin nav
'ui.base.bbs_lists' => 'BBS Lists',
'ui.base.meshcore_nodes' => 'PacketBBS Nodes',
'ui.base.admin.echomail_robots' => 'Echomail Robots',
'ui.base.bbs_directory' => 'BBS Directory',
'ui.base.admin.bbs_directory' => 'BBS Directory',
// Meshcore Nodes public page
'ui.meshcore_nodes.page_title' => 'PacketBBS Nodes',
'ui.meshcore_nodes.page_intro' => 'If you have a PacketBBS compatible radio such as MeshCore and are within range of the network, you can access this BBS through any of the nodes listed below without internet access.',
'ui.meshcore_nodes.registered_nodes' => 'Registered Nodes',
'ui.meshcore_nodes.none_registered' => 'No nodes are registered yet.',
'ui.meshcore_nodes.col_name' => 'Name',
'ui.meshcore_nodes.col_network_type' => 'Network Type',
'ui.meshcore_nodes.col_location' => 'Location',
'ui.meshcore_nodes.col_coordinates' => 'Coordinates',
'ui.meshcore_nodes.col_last_seen' => 'Last Seen',
'ui.meshcore_nodes.no_location' => 'No location set',
'ui.meshcore_nodes.location' => 'Location',
'ui.meshcore_nodes.description' => 'Description',
'ui.meshcore_nodes.preamble' => 'Access the BBS via Mesh Network',
'ui.meshcore_nodes.never_seen' => 'Never',
'ui.meshcore_nodes.more_info' => 'More info',
'ui.meshcore_nodes.loading' => 'Loading?',
'ui.meshcore_nodes.load_error' => 'Failed to load node details.',
'ui.meshcore_nodes.view_all' => 'View all nodes',
'ui.meshcore_nodes.coordinates' => 'Coordinates',
'ui.meshcore_nodes.public_key' => 'Public Key',
'ui.meshcore_nodes.last_seen' => 'Last Seen',
'ui.meshcore_nodes.qr_hint' => 'Scan to add as MeshCore contact',
// Map picker
'ui.map_picker.title' => 'Pick a Location',
'ui.map_picker.hint' => 'Click the map to place a marker. Drag the marker to adjust.',
'ui.map_picker.use_location' => 'Use this location',
// BBS Directory (public page)
'ui.bbs_directory.page_title' => 'BBS Directory ? Telnet Bulletin Board Systems',
'ui.bbs_directory.heading' => 'BBS Directory',
'ui.bbs_directory.description' => 'A list of BBS systems known to this BBS, automatically discovered through various sources and supplemented by manually curated entries.',
'ui.bbs_directory.og_title' => '{name}\'s List of Bulletin Board Systems',
'ui.bbs_directory.og_description' => 'Browse telnet bulletin board systems (BBS) from around the world. Discover active BBS systems, their sysops, locations, and connection details.',
'ui.bbs_directory.col_name' => 'BBS Name',
'ui.bbs_directory.col_sysop' => 'Sysop',
'ui.bbs_directory.col_location' => 'Location',
'ui.bbs_directory.col_os' => 'OS',
'ui.bbs_directory.col_telnet' => 'Telnet',
'ui.bbs_directory.col_website' => 'Website',
'ui.bbs_directory.col_last_seen' => 'Last Seen',
'ui.bbs_directory.no_entries' => 'No BBS entries yet.',
'ui.bbs_directory.search_placeholder' => 'Search by name, sysop, location...',
'ui.bbs_directory.no_results' => 'No entries match your search.',
'ui.bbs_directory.tab_list' => 'Directory List',
'ui.bbs_directory.tab_map' => 'Map of BBS Systems',
'ui.bbs_directory.map_no_coordinates' => 'No BBS systems have map coordinates yet.',
'ui.bbs_directory.map_partial_notice' => '{count} BBS systems are not shown on the map because their locations could not be geocoded yet.',
'ui.bbs_directory.connect' => 'Connect',
'ui.bbs_directory.source_auto' => 'Auto',
'ui.bbs_directory.source_manual' => 'Manual',
'ui.bbs_directory.status_pending' => 'Pending',
'ui.bbs_directory.status_rejected' => 'Rejected',
'ui.bbs_directory.add_listing' => 'Add Your BBS',
'ui.bbs_directory.submit_title' => 'Submit Your BBS',
'ui.bbs_directory.submit_description' => 'Submit your BBS to the directory. New listings are reviewed by the sysop before appearing publicly.',
'ui.bbs_directory.submit_btn' => 'Submit Listing',
'ui.bbs_directory.submit_success' => 'Your listing has been submitted and is pending review. Thank you!',
'ui.bbs_directory.col_notes' => 'Notes',
'ui.bbs_directory.col_telnet_port' => 'Port',
'ui.bbs_directory.entry_page_title' => '{name} ? Bulletin Board System',
'ui.bbs_directory.entry_back' => 'Back to BBS Directory',
'ui.bbs_directory.entry_connection' => 'Connection',
'ui.bbs_directory.entry_col_ssh' => 'SSH',
'ui.bbs_directory.entry_col_software' => 'Software',
'ui.bbs_directory.entry_not_found' => 'BBS listing not found.',
// Echomail Robots (standalone admin page)
'ui.admin.echomail_robots.page_title' => 'Echomail Robots',
'ui.admin.echomail_robots.heading' => 'Echomail Robots',
'ui.admin.echomail_robots.about_title' => 'About Robots',
'ui.admin.echomail_robots.about_text' => 'Robot rules watch echo areas for matching messages and automatically process them. Results are stored in the BBS Directory or other targets depending on the processor.',
'ui.admin.echomail_robots.cron_hint' => 'Run periodically via cron:',
'ui.admin.echomail_robots.run_output_title' => 'Robot Output',
'ui.admin.echomail_robots.processor_config_label' => 'Processor Config (JSON)',
// BBS Directory (admin page)
'ui.admin.bbs_directory.page_title' => 'BBS Directory',
'ui.admin.bbs_directory.heading' => 'BBS Directory',
'ui.admin.bbs_directory.tab_entries' => 'Directory Entries',
'ui.admin.bbs_directory.tab_robots' => 'Robot Rules',
'ui.admin.bbs_directory.add_entry' => 'Add Entry',
'ui.admin.bbs_directory.add_robot' => 'Add Robot',
'ui.admin.bbs_directory.run_now' => 'Run Now',
'ui.admin.bbs_directory.run_complete' => 'Robot run complete: examined {examined}, processed {processed}',
'ui.admin.bbs_directory.col_name' => 'Name',
'ui.admin.bbs_directory.col_sysop' => 'Sysop',
'ui.admin.bbs_directory.col_location' => 'Location',
'ui.admin.bbs_directory.col_telnet' => 'Telnet',
'ui.admin.bbs_directory.col_source' => 'Source',
'ui.admin.bbs_directory.col_last_seen' => 'Last Seen',
'ui.admin.bbs_directory.col_actions' => 'Actions',
'ui.admin.bbs_directory.col_echo_area' => 'Echo Area',
'ui.admin.bbs_directory.col_subject_pattern' => 'Subject Pattern',
'ui.admin.bbs_directory.col_processor' => 'Processor',
'ui.admin.bbs_directory.col_enabled' => 'Enabled',
'ui.admin.bbs_directory.col_last_run' => 'Last Run',
'ui.admin.bbs_directory.col_messages_processed' => 'Msg Processed',
'ui.admin.bbs_directory.never' => 'Never',
'ui.admin.bbs_directory.no_entries' => 'No entries yet.',
'ui.admin.bbs_directory.no_robots' => 'No robot rules configured.',
'ui.admin.bbs_directory.no_pending' => 'No pending listings.',
'ui.admin.bbs_directory.tab_all' => 'All Entries',
'ui.admin.bbs_directory.tab_pending' => 'Pending Review',
'ui.admin.bbs_directory.col_submitted_by' => 'Submitted By',
'ui.admin.bbs_directory.approve' => 'Approve',
'ui.admin.bbs_directory.reject' => 'Reject',
'ui.admin.bbs_directory.approved' => 'Entry approved',
'ui.admin.bbs_directory.rejected' => 'Entry rejected',
'ui.admin.bbs_directory.entry_saved' => 'Entry saved successfully',
'ui.admin.bbs_directory.entry_deleted' => 'Entry deleted successfully',
'ui.admin.bbs_directory.merge' => 'Merge duplicate',
'ui.admin.bbs_directory.merge_title' => 'Merge Duplicate Entry',
'ui.admin.bbs_directory.merge_keep_label' => 'Keep:',
'ui.admin.bbs_directory.merge_discard_label' => 'Discard (will be deleted):',
'ui.admin.bbs_directory.merge_help' => 'The kept entry will be filled in with any missing fields from the discarded entry. The discarded entry will be deleted.',
'ui.admin.bbs_directory.merge_search_placeholder' => 'Search for duplicate...',
'ui.admin.bbs_directory.merge_will_delete' => 'Will delete:',
'ui.admin.bbs_directory.merge_confirm' => 'Merge & Delete Duplicate',
'ui.admin.bbs_directory.merge_success' => 'Entries merged successfully',
'ui.admin.bbs_directory.is_local_label' => 'Our BBS (protected)',
'ui.admin.bbs_directory.is_local_help' => 'Automated imports and robot processors will not modify this entry.',
'ui.admin.bbs_directory.robot_saved' => 'Robot rule saved successfully',
'ui.admin.bbs_directory.robot_deleted' => 'Robot rule deleted successfully',
// ISO-backed file areas
'ui.fileareas.area_type' => 'Area Type',
'ui.fileareas.area_type_normal' => 'Normal',
'ui.fileareas.area_type_iso' => 'ISO-backed',
'ui.fileareas.iso_mount_point' => 'Mount Point',
'ui.fileareas.iso_mount_point_help' => 'Path where the ISO is mounted on the server. Mount the ISO manually before using this area (e.g. sudo mount -o loop image.iso /mnt/point). On Windows enter the drive letter or path (e.g. D:\\).',
'ui.fileareas.iso_mount_status' => 'Mount Status',
'ui.fileareas.accessible' => 'Accessible',
'ui.fileareas.not_accessible' => 'Not accessible',
'ui.fileareas.reindex' => 'Re-index ISO',
'ui.fileareas.reindexing' => 'Indexing?',
'ui.fileareas.reindex_started' => 'Re-index started in background',
'ui.fileareas.reindex_done' => 'Re-index complete',
'ui.fileareas.last_indexed' => 'Last indexed',
'ui.fileareas.flat_import' => 'Flat import (no subfolders)',
// AreaFix / FileFix Manager
'ui.base.admin.areafix' => 'AreaFix / FileFix',
'ui.admin.areafix.page_title' => 'AreaFix / FileFix Manager',
'ui.admin.areafix.heading' => 'AreaFix / FileFix Manager',
'ui.admin.areafix.not_configured_title' => 'No uplinks configured for AreaFix / FileFix.',
'ui.admin.areafix.not_configured_body' => 'No enabled uplinks have an areafix_password or filefix_password configured.',
'ui.admin.areafix.not_configured_hint' => 'Add the following fields to the relevant uplink entry in config/binkp.json:',
'ui.admin.areafix.select_uplink' => 'Uplink',
'ui.admin.areafix.tab_areafix' => 'AreaFix',
'ui.admin.areafix.tab_filefix' => 'FileFix',
'ui.admin.areafix.quick_actions' => 'Quick Actions',
'ui.admin.areafix.subscribe_card_title' => 'Subscribe / Unsubscribe',
'ui.admin.areafix.area_tag_placeholder' => 'Area tag (e.g. FIDONEWS)',
'ui.admin.areafix.btn_subscribe' => 'Subscribe',
'ui.admin.areafix.btn_unsubscribe' => 'Unsubscribe',
'ui.admin.areafix.freeform_card_title' => 'Freeform Commands',
'ui.admin.areafix.freeform_placeholder' => 'One command per line, e.g. %QUERY',
'ui.admin.areafix.btn_send' => 'Send',
'ui.admin.areafix.latest_reply_title' => 'Latest Reply',
'ui.admin.areafix.no_reply_yet' => 'No reply received yet. Send a command to get started.',
'ui.admin.areafix.search_placeholder' => 'Search areas...',
'ui.admin.areafix.sync_button' => 'Sync to Echo Areas',
'ui.admin.areafix.col_tag' => 'Tag',
'ui.admin.areafix.col_description' => 'Description',
'ui.admin.areafix.col_status' => 'Status',
'ui.admin.areafix.col_action' => 'Action',
'ui.admin.areafix.status_available' => 'Available',
'ui.admin.areafix.raw_reply_toggle' => 'Raw reply',
'ui.admin.areafix.history_title' => 'Message History',
'ui.admin.areafix.history_col_date' => 'Date',
'ui.admin.areafix.history_col_direction' => 'Direction',
'ui.admin.areafix.history_col_address' => 'Node Address',
'ui.admin.areafix.history_col_network' => 'Network',
'ui.admin.areafix.history_col_preview' => 'Preview',
'ui.admin.areafix.no_history' => 'No messages yet.',
'ui.admin.areafix.direction_incoming' => 'Incoming',
'ui.admin.areafix.direction_outgoing' => 'Outgoing',
'ui.admin.areafix.history_load_failed' => 'Failed to load message history',
'ui.admin.areafix.command_sent' => 'Command sent ? check history for a reply',
'ui.admin.areafix.send_failed' => 'Failed to send command',
'ui.admin.areafix.tag_required' => 'Area tag is required',
'ui.admin.areafix.commands_required' => 'Enter at least one command',
'ui.admin.areafix.select_uplink_first' => 'Please select an uplink',
'ui.admin.areafix.sync_ok' => 'Sync complete: {created} created, {activated} activated, {deactivated} deactivated',
'ui.admin.areafix.sync_failed' => 'Sync failed',
'ui.admin.areafix.no_areas_to_sync' => 'No areas available to sync',
// LovlyNet admin page
'ui.base.admin.lovlynet' => 'LovlyNet Areas',
'ui.admin.lovlynet.page_title' => 'LovlyNet Areas',
'ui.admin.lovlynet.heading' => 'LovlyNet Subscriptions',
'ui.admin.lovlynet.not_configured_title' => 'LovlyNet not configured.',
'ui.admin.lovlynet.not_configured_body' => 'config/lovlynet.json is missing or incomplete.',
'ui.admin.lovlynet.not_configured_synopsis' => 'LovlyNet is a FTN network and hub service that provides shared echo areas, file areas, and automated AreaFix/FileFix management for connected systems.',
'ui.admin.lovlynet.not_configured_setup_intro' => 'To configure this system for LovlyNet, run the setup script from the project root:',
'ui.admin.lovlynet.not_configured_docs_intro' => 'For setup details and background, see',
'ui.admin.lovlynet.node_number' => 'Node Address',
'ui.admin.lovlynet.hub_address' => 'Hub Address',
'ui.admin.lovlynet.server' => 'Server',
'ui.admin.lovlynet.subscribed_areas' => 'Subscribed Areas',
'ui.admin.lovlynet.tab_echo' => 'Echo Areas',
'ui.admin.lovlynet.tab_file' => 'File Areas',
'ui.admin.lovlynet.tab_requests' => 'Requests',
'ui.admin.lovlynet.no_areas' => 'No areas available',
'ui.admin.lovlynet.no_requests' => 'No matching requests or responses found',
'ui.admin.lovlynet.col_tag' => 'Tag',
'ui.admin.lovlynet.col_description' => 'Description',
'ui.admin.lovlynet.col_status' => 'Status',
'ui.admin.lovlynet.edit_tag_title' => 'Edit {tag}',
'ui.admin.lovlynet.subscribed' => 'Subscribed',
'ui.admin.lovlynet.not_subscribed' => 'Not subscribed',
'ui.admin.lovlynet.btn_subscribe' => 'Subscribe',
'ui.admin.lovlynet.btn_unsubscribe' => 'Unsubscribe',
'ui.admin.lovlynet.load_failed' => 'Failed to load areas from LovlyNet',
'ui.admin.lovlynet.toggle_failed' => 'Subscription change failed',
'ui.admin.lovlynet.subscribed_ok' => 'Subscribed to {tag}',
'ui.admin.lovlynet.unsubscribed_ok' => 'Unsubscribed from {tag}',
'ui.admin.lovlynet.issue_title' => 'LovlyNet recommended settings mismatch',
'ui.admin.lovlynet.issue_sysop_only_on' => 'LovlyNet recommends enabling Sysop Access Only',
'ui.admin.lovlynet.issue_sysop_only_off' => 'LovlyNet recommends disabling Sysop Access Only',
'ui.admin.lovlynet.issue_readonly_on' => 'LovlyNet recommends making this area read-only',
'ui.admin.lovlynet.issue_readonly_off' => 'LovlyNet recommends allowing uploads in this area',
'ui.admin.lovlynet.issue_replace_on' => 'LovlyNet recommends enabling file replacement in this area',
'ui.admin.lovlynet.issue_replace_off' => 'LovlyNet recommends disabling file replacement in this area',
'ui.admin.lovlynet.issue_allow_media_on' => 'LovlyNet recommends enabling inline media for this area',
'ui.admin.lovlynet.issue_allow_media_off' => 'LovlyNet recommends disabling inline media for this area',
'ui.admin.lovlynet.request_button_echo' => 'Initiate AREAFIX Request',
'ui.admin.lovlynet.request_button_file' => 'Initiate FILEFIX Request',
'ui.admin.lovlynet.btn_rescan' => 'Rescan',
'ui.admin.lovlynet.btn_rescan_title' => 'Request rescan of messages',
'ui.admin.lovlynet.sync_button_title' => 'Sync settings',
'ui.admin.lovlynet.sync_title_description' => 'Sync description',
'ui.admin.lovlynet.sync_title_settings_and_description' => 'Sync recommended settings and description',
'ui.admin.lovlynet.sync_title_create_and_description' => 'Create group and sync description',
'ui.admin.lovlynet.request_modal_title_echo' => 'AreaFix Request',
'ui.admin.lovlynet.request_modal_title_file' => 'FileFix Request',
'ui.admin.lovlynet.request_modal_help_echo' => 'Enter the AreaFix command text to send. The destination and password are filled in automatically. A response will be sent to you by netmail.',
'ui.admin.lovlynet.request_modal_help_file' => 'Enter the FileFix command text to send. The destination and password are filled in automatically. A response will be sent to you by netmail.',
'ui.admin.lovlynet.rescan_modal_title' => 'AreaFix Rescan Request',
'ui.admin.lovlynet.rescan_modal_help' => 'Choose the subscribed echo area to rescan and how much history to request from AreaFix.',
'ui.admin.lovlynet.rescan_area_label' => 'Echo area',
'ui.admin.lovlynet.rescan_mode_label' => 'Rescan scope',
'ui.admin.lovlynet.rescan_mode_days' => 'Last N days',
'ui.admin.lovlynet.rescan_mode_messages' => 'Last N messages',
'ui.admin.lovlynet.rescan_mode_all' => 'All messages',
'ui.admin.lovlynet.rescan_amount_days_label' => 'Number of days',
'ui.admin.lovlynet.rescan_amount_days_help' => 'Send messages from the last N days from this echo area.',
'ui.admin.lovlynet.rescan_amount_messages_label' => 'Number of messages',
'ui.admin.lovlynet.rescan_amount_messages_help' => 'Send the last N messages from this echo area.',
'ui.admin.lovlynet.rescan_area_required' => 'An echo area is required',
'ui.admin.lovlynet.rescan_amount_required' => 'Enter a whole number greater than zero',
'ui.admin.lovlynet.rescan_send' => 'Send rescan request',
'ui.admin.lovlynet.rescan_send_failed' => 'Failed to send rescan request',
'ui.admin.lovlynet.rescan_sent' => 'AreaFix rescan request sent',
'ui.admin.lovlynet.request_help_button' => 'Help',
'ui.admin.lovlynet.request_help_title' => 'Remote Help',
'ui.admin.lovlynet.request_help_failed' => 'Failed to load help text',
'ui.admin.lovlynet.request_help_empty' => 'No help text available.',
'ui.admin.lovlynet.message_view_title' => 'Message',
'ui.admin.lovlynet.message_view_title_request' => 'Request Message',
'ui.admin.lovlynet.message_view_title_response' => 'Response Message',
'ui.admin.lovlynet.request_message_label' => 'Request message',
'ui.admin.lovlynet.request_message_placeholder' => '%HELP',
'ui.admin.lovlynet.request_message_required' => 'Request message is required',
'ui.admin.lovlynet.request_send' => 'Send request',
'ui.admin.lovlynet.request_send_failed' => 'Failed to send request',
'ui.admin.lovlynet.request_sent_echo' => 'AreaFix request sent',
'ui.admin.lovlynet.request_sent_file' => 'FileFix request sent',
'ui.admin.lovlynet.requests_load_failed' => 'Failed to load request status',
'ui.admin.lovlynet.requests_col_type' => 'Type',
'ui.admin.lovlynet.requests_col_direction' => 'Direction',
'ui.admin.lovlynet.requests_col_status' => 'Status',
'ui.admin.lovlynet.requests_col_message' => 'Message',
'ui.admin.lovlynet.requests_col_date' => 'Date',
'ui.admin.lovlynet.requests_no_subject' => '(no subject)',
'ui.admin.lovlynet.requests_request_label' => 'Request sent',
'ui.admin.lovlynet.requests_response_label' => 'Hub response',
'ui.admin.lovlynet.type_areafix' => 'AREAFIX',
'ui.admin.lovlynet.type_filefix' => 'FILEFIX',
'ui.admin.lovlynet.direction_request' => 'Request',
'ui.admin.lovlynet.direction_response' => 'Response',
'ui.admin.lovlynet.status_pending' => 'Pending response',
'ui.admin.lovlynet.status_responded' => 'Responded',
'ui.admin.lovlynet.status_response' => 'Response received',
'ui.admin.lovlynet.btn_resend' => 'Sync Files',
'ui.admin.lovlynet.btn_resend_title' => 'Sync local and LovlyNet files',
'ui.admin.lovlynet.resend_modal_title' => 'Sync Files',
'ui.admin.lovlynet.resend_modal_help' => 'Hatch local files that are not yet in LovlyNet, or request a %RESEND for files you are missing locally.',
'ui.admin.lovlynet.resend_area_label' => 'File area',
'ui.admin.lovlynet.resend_files_loading' => 'Loading files...',
'ui.admin.lovlynet.resend_files_none' => 'No files found in this area',
'ui.admin.lovlynet.resend_files_error' => 'Failed to load files from LovlyNet',
'ui.admin.lovlynet.resend_files_select_all' => 'Select all',
'ui.admin.lovlynet.resend_files_deselect_all' => 'Deselect all',
'ui.admin.lovlynet.resend_file_count_label' => 'file(s) available',
'ui.admin.lovlynet.resend_selected_label' => 'selected',
'ui.admin.lovlynet.resend_page_label' => 'Page',
'ui.admin.lovlynet.resend_col_filename' => 'Filename',
'ui.admin.lovlynet.resend_col_description' => 'Description',
'ui.admin.lovlynet.resend_col_local' => 'Local',
'ui.admin.lovlynet.resend_local_yes_title' => 'File is in your local file area',
'ui.admin.lovlynet.resend_local_no_title' => 'File is not in your local file area',
'ui.admin.lovlynet.resend_select_required' => 'Select at least one file',
'ui.admin.lovlynet.resend_send' => 'Send resend request',
'ui.admin.lovlynet.resend_send_failed' => 'Failed to send resend request',
'ui.admin.lovlynet.resend_sent' => 'FileFix resend request sent',
'ui.admin.lovlynet.sync_local_only_section' => 'Local Files (not in LovlyNet)',
'ui.admin.lovlynet.sync_lovlynet_section' => 'LovlyNet Files',
'ui.admin.lovlynet.sync_no_local_only' => 'All local files are already in LovlyNet',
'ui.admin.lovlynet.sync_hatch_btn' => 'Hatch',
'ui.admin.lovlynet.sync_hatch_btn_title' => 'Hatch this file to LovlyNet',
'ui.admin.lovlynet.sync_hatch_success' => 'File hatched to LovlyNet',
'ui.admin.lovlynet.sync_hatch_failed' => 'Failed to hatch file',
// LovlyNet Setup tab
'ui.admin.lovlynet.tab_setup' => 'LovlyNet Setup',
'ui.admin.lovlynet.setup_status_title' => 'Registration Status',
'ui.admin.lovlynet.setup_ftn_address' => 'FTN Address',
'ui.admin.lovlynet.setup_hub_address' => 'Hub Address',
'ui.admin.lovlynet.setup_registered_at' => 'Registered',
'ui.admin.lovlynet.setup_updated_at' => 'Last Updated',
'ui.admin.lovlynet.setup_update_title' => 'Update Registration',
'ui.admin.lovlynet.setup_system_name' => 'System Name',
'ui.admin.lovlynet.setup_sysop_name' => 'Sysop Name',
'ui.admin.lovlynet.setup_hostname' => 'Hostname',
'ui.admin.lovlynet.setup_binkp_port' => 'Binkp Port',
'ui.admin.lovlynet.setup_site_url' => 'Site URL',
'ui.admin.lovlynet.setup_is_passive' => 'Passive node (poll-only, no inbound connections)',
'ui.admin.lovlynet.setup_update_warning' => 'Updating your registration will briefly unsubscribe and re-subscribe you to the default LovlyNet areas. Manually-subscribed areas are not affected.',
'ui.admin.lovlynet.setup_update_btn' => 'Update Registration',
'ui.admin.lovlynet.setup_update_ok' => 'Registration updated successfully',
'ui.admin.lovlynet.setup_update_failed' => 'Failed to update registration',
'ui.admin.lovlynet.setup_load_failed' => 'Failed to load registration status',
'ui.admin.lovlynet.checklist_title' => 'Setup Checklist',
'ui.admin.lovlynet.checklist_registration' => 'Registered with LovlyNet',
'ui.admin.lovlynet.checklist_registration_ok' => 'Node is registered',
'ui.admin.lovlynet.checklist_uplink_configured' => 'LovlyNet uplink configured in BinkP',
'ui.admin.lovlynet.checklist_uplink_configured_ok' => 'Uplink is configured',
'ui.admin.lovlynet.checklist_uplink_configured_missing' => 'No LovlyNet uplink found in BinkP configuration',
'ui.admin.lovlynet.checklist_uplink_configured_hint' => 'Add a LovlyNet uplink under Admin ? BinkP Configuration with domain set to "lovlynet".',
'ui.admin.lovlynet.checklist_binkp_auth_test' => 'BinkP authentication to LovlyNet hub',
'ui.admin.lovlynet.checklist_binkp_auth_test_ok' => 'Authenticated successfully ({method})',
'ui.admin.lovlynet.checklist_binkp_auth_test_failed' => 'Authentication failed: {error}',
'ui.admin.lovlynet.checklist_binkp_auth_test_daemon_error' => 'Cannot check ? admin daemon is not running',
'ui.admin.lovlynet.checklist_default_areas' => 'Default area subscriptions',
'ui.admin.lovlynet.checklist_default_areas_ok' => 'All default areas subscribed',
'ui.admin.lovlynet.checklist_default_areas_missing' => 'Missing subscriptions: {list}',
'ui.admin.lovlynet.checklist_default_areas_hint' => 'Subscribe through the Echo Areas or File Areas tab.',
'ui.admin.lovlynet.default_area_not_subscribed' => 'Recommended default area ? not subscribed',
'ui.admin.lovlynet.checklist_default_areas_error' => 'Could not retrieve area data from LovlyNet',
'ui.admin.lovlynet.checklist_nodelist_rule' => 'LVLY_NODELIST file area rule',
'ui.admin.lovlynet.checklist_nodelist_rule_desc' => 'A file area rule must exist for LVLY_NODELIST@LOVLYNET with the recommended import pattern.',
'ui.admin.lovlynet.checklist_nodelist_rule_ok' => 'Rule configured correctly',
'ui.admin.lovlynet.checklist_nodelist_rule_missing' => 'Rule missing',
'ui.admin.lovlynet.checklist_nodelist_rule_wrong_pattern' => 'Rule exists but pattern does not match recommended value',
'ui.admin.lovlynet.checklist_nodelist_rule_daemon_error' => 'Cannot check ? admin daemon is not running',
'ui.admin.lovlynet.checklist_fix' => 'Fix',
'ui.admin.lovlynet.checklist_fix_ok' => 'Fix applied',
'ui.admin.lovlynet.checklist_load_failed' => 'Failed to load checklist',
// Public file areas index page
'ui.public_files.title' => 'Public File Areas',
'ui.public_files.heading' => 'Public File Areas',
'ui.public_files.description' => 'Browse and download files without creating an account.',
'ui.public_files.og_description' => 'Browse and download files from public file areas.',
'ui.public_files.no_areas' => 'No public file areas are available.',
// Admin Weather Config
'ui.admin.weather_config.page_title' => 'Weather Report Configuration',
'ui.admin.weather_config.heading' => 'Weather Report Configuration',
'ui.admin.weather_config.daemon_error' => 'The admin daemon is not running. Configuration cannot be loaded or saved.',
'ui.admin.weather_config.general_settings' => 'General Settings',
'ui.admin.weather_config.title' => 'Report Title',
'ui.admin.weather_config.title_placeholder' => 'Pacific Northwest Weather Report',
'ui.admin.weather_config.title_help' => 'Title used in the subject line of posted weather reports.',
'ui.admin.weather_config.coverage_area' => 'Coverage Area',
'ui.admin.weather_config.coverage_area_placeholder' => 'British Columbia & Pacific Northwest',
'ui.admin.weather_config.coverage_area_help' => 'Descriptive label for the geographic area covered.',
'ui.admin.weather_config.api_key' => 'OpenWeatherMap API Key',
'ui.admin.weather_config.api_key_placeholder' => 'your_api_key_here',
'ui.admin.weather_config.api_key_help' => 'Free API key from',
'ui.admin.weather_config.api_settings' => 'API Settings',
'ui.admin.weather_config.api_timeout' => 'Timeout (s)',
'ui.admin.weather_config.api_timeout_help' => 'Request timeout in seconds.',
'ui.admin.weather_config.max_locations' => 'Max Locations',
'ui.admin.weather_config.units' => 'Units',
'ui.admin.weather_config.units_metric' => 'Metric (°C)',
'ui.admin.weather_config.units_imperial' => 'Imperial (°F)',
'ui.admin.weather_config.units_standard' => 'Standard (K)',
'ui.admin.weather_config.locations' => 'Locations',
'ui.admin.weather_config.add_location' => 'Add Location',
'ui.admin.weather_config.edit_location' => 'Edit Location',
'ui.admin.weather_config.no_locations' => 'No locations configured. Add at least one.',
'ui.admin.weather_config.location_name' => 'City Name',
'ui.admin.weather_config.location_name_placeholder' => 'Vancouver',
'ui.admin.weather_config.location_lat' => 'Latitude',
'ui.admin.weather_config.location_lon' => 'Longitude',
'ui.admin.weather_config.location_coords_help' => 'Use decimal degrees. Find coordinates at openweathermap.org or Google Maps.',
'ui.admin.weather_config.load_example' => 'Load Example',
'ui.admin.weather_config.preview' => 'Preview',
'ui.admin.weather_config.preview_title' => 'Weather Report Preview',
'ui.admin.weather_config.preview_loading' => 'Generating weather report preview...',
'ui.admin.weather_config.preview_failed' => 'Failed to generate weather report preview.',
'ui.admin.weather_config.preview_error' => 'An error occurred while generating the preview.',
'ui.admin.weather_config.save' => 'Save Configuration',
'ui.admin.weather_config.save_location' => 'Save',
'ui.admin.weather_config.cancel' => 'Cancel',
'ui.admin.weather_config.edit' => 'Edit',
'ui.admin.weather_config.remove' => 'Remove',
'ui.admin.weather_config.saved_success' => 'Weather configuration saved successfully.',
'ui.admin.weather_config.save_failed' => 'Failed to save weather configuration.',
'ui.admin.weather_config.save_error' => 'An error occurred while saving.',
'ui.admin.weather_config.show_api_key' => 'Show',
'ui.admin.weather_config.hide_api_key' => 'Hide',
// Interests
'ui.base.admin.interests' => 'Interests',
'ui.admin.file_approvals.page_title' => 'File Upload Approvals',
'ui.admin.file_approvals.heading' => 'File Upload Approvals',
'ui.admin.file_approvals.intro' => 'Review uploaded files before they become visible in file areas.',
'ui.admin.file_approvals.pending_queue' => 'Pending Upload Queue',
'ui.admin.file_approvals.none_pending' => 'No files are waiting for approval.',
'ui.admin.file_approvals.uploader' => 'Uploader',
'ui.admin.file_approvals.approve' => 'Approve',
'ui.admin.file_approvals.reject' => 'Reject',
'ui.admin.file_approvals.approved' => 'File approved',
'ui.admin.file_approvals.rejected' => 'File rejected',
'ui.admin.file_approvals.reject_reason_prompt' => 'Optional rejection reason:',
'ui.admin.file_approvals.scan_disabled_notice' => 'Virus scanning is disabled on this system, so approval-queue scans are unavailable.',
'ui.base.interests' => 'Interests',
'ui.interests.nav_label' => 'Interests',
'ui.interests.page_title' => 'Interests',
'ui.interests.heading' => 'Browse Interests',
'ui.interests.page_intro' => 'Interests help you discover echo areas and file areas that match your topics. Subscribing to an interest automatically follows all of its associated areas.',
'ui.interests.page_intro_unsub' => 'You can unsubscribe from an interest and its areas at any time, or manage individual area subscriptions through the {link}.',
'ui.interests.page_intro_unsub_link' => 'subscription manager',
'ui.interests.go_to_echo_areas' => 'Go to Echo Areas',
'ui.interests.subscribe' => 'Subscribe',
'ui.interests.unsubscribe' => 'Unsubscribe',
'ui.interests.subscribed' => 'Subscribed',
'ui.interests.no_interests' => 'No interests are subscribed to.',
'ui.interests.load_failed' => 'Failed to load interests',
'ui.interests.area_count' => '{count} echo area(s)',
'ui.interests.areas_modal_title' => 'Echo Areas ? {name}',
'ui.interests.areas_modal_subscribe_title' => 'Subscribe to {name}',
'ui.interests.areas_modal_unsubscribe_title' => 'Unsubscribe from {name}',
'ui.interests.areas_modal_empty' => 'No echo areas assigned.',
'ui.interests.areas_modal_col_tag' => 'Echo Area',
'ui.interests.areas_modal_col_net' => 'Network',
'ui.interests.areas_modal_col_desc' => 'Description',
'ui.interests.areas_modal_select_all' => 'Select all',
'ui.interests.areas_modal_deselect_all' => 'Deselect all',
'ui.interests.already_subscribed' => 'Already subscribed',
'ui.interests.areas_modal_confirm_subscribe' => 'Subscribe to {count} area(s)',
'ui.interests.areas_modal_confirm_unsubscribe' => 'Unsubscribe from {count} area(s)',
'ui.interests.areas_modal_manage_title' => 'Manage Areas ? {name}',
'ui.interests.areas_modal_save_btn' => 'Save {count} area(s)',
'ui.interests.subscriber_count' => '{count} subscriber(s)',
'ui.interests.browse_areas' => 'Browse Areas',
'ui.interests.browse_page_title' => 'Find Echo Areas',
'ui.interests.browse_search_placeholder' => 'Search by tag or description?',
'ui.interests.tab_messages' => 'Messages',
'ui.interests.tab_files' => 'Files',
'ui.interests.viewer_title' => 'Interest: {name}',
'ui.interests.crosspost_button' => 'Post to Interest',
'ui.interests.crosspost_cooldown_warning' => 'You must wait {minutes} more minute(s) before cross-posting again.',
'ui.interests.admin.page_title' => 'Manage Interests',
'ui.interests.admin.create' => 'Create Interest',
'ui.interests.admin.edit' => 'Edit Interest',
'ui.interests.admin.delete' => 'Delete',
'ui.interests.admin.delete_confirm' => 'Delete this interest? All subscriber data will be removed.',
'ui.interests.admin.name_label' => 'Name',
'ui.interests.admin.slug_label' => 'Slug',
'ui.interests.admin.description_label' => 'Description',
'ui.interests.admin.icon_label' => 'Icon (FontAwesome class)',
'ui.interests.admin.color_label' => 'Color',
'ui.interests.admin.sort_order_label' => 'Sort Order',
'ui.interests.admin.is_active_label' => 'Active',
'ui.interests.admin.echo_areas' => 'Echo Areas',
'ui.interests.admin.file_areas' => 'File Areas',
'ui.interests.admin.crosspost_cooldown_enabled' => 'Enable cross-post cooldown',
'ui.interests.admin.crosspost_cooldown_minutes' => 'Cooldown window (minutes)',
'ui.interests.admin.crosspost_cooldown_threshold' => 'Threshold (min areas to trigger cooldown)',
'ui.interests.admin.saved_success' => 'Interest saved.',
'ui.interests.admin.deleted_success' => 'Interest deleted.',
'ui.interests.admin.areas_saved_success' => 'Areas updated.',
'ui.admin.wall.incoming' => 'Incoming message from {from}',
// Echomail moderation queue
'ui.admin.echomail_moderation.page_title' => 'Echomail Moderation',
'ui.admin.echomail_moderation.heading' => 'Echomail Moderation Queue',
'ui.admin.echomail_moderation.about_title' => 'About Moderation',
'ui.admin.echomail_moderation.about_text' => 'New users posting to networked echo areas are held here for review before their messages are transmitted upstream.',
'ui.admin.echomail_moderation.threshold_hint' => 'Configure the approval threshold in',
'ui.admin.echomail_moderation.bbs_settings_link' => 'BBS Settings',
'ui.admin.echomail_moderation.empty_queue' => 'No messages pending moderation.',
'ui.admin.echomail_moderation.col_area' => 'Area',
'ui.admin.echomail_moderation.col_author' => 'Author',
'ui.admin.echomail_moderation.col_subject' => 'Subject',
'ui.admin.echomail_moderation.col_date' => 'Date',
'ui.admin.echomail_moderation.col_actions' => 'Actions',
'ui.admin.echomail_moderation.action_approve' => 'Approve',
'ui.admin.echomail_moderation.action_reject' => 'Reject',
'ui.admin.echomail_moderation.approved_success' => 'Message approved and queued for transmission.',
'ui.admin.echomail_moderation.rejected_success' => 'Message rejected.',
// BBS settings - echomail moderation threshold
'ui.admin.bbs_settings.features.echomail_moderation_threshold' => 'Echomail Moderation Threshold',
'ui.admin.bbs_settings.features.echomail_moderation_threshold_help' => 'Number of approved networked echomail posts required before a new user can post without moderation. Set to 0 to disable moderation entirely.',
'ui.admin.bbs_settings.validation.echomail_moderation_threshold_range' => 'Echomail moderation threshold must be 0 or higher (0 = disabled).',
// Nav
'ui.base.admin.echomail_moderation' => 'Echomail Moderation',
// Pending moderation post response
'ui.api.messages.pending_moderation' => 'Your message has been submitted and is pending moderator approval before it is sent to the network.',
// User Guide
'ui.base.user_guide' => 'User Guide',
'ui.userguide.page_title' => 'User Guide',
'ui.userguide.heading' => 'User Guide',
'ui.userguide.not_found' => 'User guide not found.',
// PacketBBS TOTP Authenticator (settings page)
'ui.settings.packetbbs_totp.title' => 'PacketBBS Authenticator',
'ui.settings.packetbbs_totp.help' => 'Enable one-time code login for PacketBBS and MeshCore radio access. After enrolling, use LOGIN <username> <6-digit-code> from your radio device instead of a password.',
'ui.settings.packetbbs_totp.status_enabled' => 'Authenticator enabled. You can log in via radio using a one-time code.',
'ui.settings.packetbbs_totp.status_disabled' => 'Not enrolled. Radio login is disabled until you set up an authenticator.',
'ui.settings.packetbbs_totp.enable_btn' => 'Set up authenticator',
'ui.settings.packetbbs_totp.disable_btn' => 'Disable authenticator',
'ui.settings.packetbbs_totp.setup_step1' => 'Open your authenticator app and scan the QR code below, or enter the secret manually.',
'ui.settings.packetbbs_totp.setup_qr_label' => 'Enrollment QR code',
'ui.settings.packetbbs_totp.setup_qr_alt' => 'PacketBBS authenticator enrollment QR code',
'ui.settings.packetbbs_totp.setup_secret_label' => 'Secret (manual entry)',
'ui.settings.packetbbs_totp.setup_uri_label' => 'Auth URI',
'ui.settings.packetbbs_totp.verify_label' => 'Enter the 6-digit code from your authenticator app to confirm enrollment:',
'ui.settings.packetbbs_totp.verify_placeholder' => '000000',
'ui.settings.packetbbs_totp.verify_btn' => 'Verify and enable',
'ui.settings.packetbbs_totp.verify_success' => 'Authenticator enrolled. Log in via radio with: LOGIN <username> <6-digit-code>',
'ui.settings.packetbbs_totp.disable_confirm' => 'Disable PacketBBS authenticator? You will no longer be able to log in from radio devices.',
'ui.settings.packetbbs_totp.disable_success' => 'PacketBBS authenticator disabled.',
'ui.settings.packetbbs_totp.login_hint' => 'Radio login: LOGIN <username> <6-digit-code>',
'ui.settings.packetbbs_totp.load_failed' => 'Failed to load authenticator status.',
// AI Assistant - admin settings
'ui.admin.bbs_settings.features.enable_ai_assistant' => 'Enable AI Assistant',
'ui.admin.bbs_settings.features.ai_assistant_help' => 'Show the AI Assistant button in echomail and netmail readers.',
// AI Settings page
'ui.admin.bbs_settings.ai.page_title' => 'AI Settings',
'ui.admin.bbs_settings.ai.heading' => 'AI Settings',
'ui.admin.bbs_settings.ai.features_title' => 'AI Features',
'ui.admin.bbs_settings.ai.configure_link' => 'AI Settings',
'ui.admin.bbs_settings.ai.no_provider_warning' => 'No AI provider is configured. Add an OpenAI or Anthropic API key to .env to enable these features.',
'ui.admin.bbs_settings.ai.enable_share_summary' => 'Enable AI summaries for shared message links',
'ui.admin.bbs_settings.ai.share_summary_help' => 'When enabled, an AI button appears in the share dialog so users can generate a one-sentence link preview description.',
'ui.admin.bbs_settings.ai.save' => 'Save AI Settings',
'ui.admin.bbs_settings.ai.save_failed' => 'Failed to save AI settings.',
'ui.admin.bbs_settings.ai.saved_success' => 'AI settings saved.',
'ui.admin.bbs_settings.ai.share_summary_prompt_label' => 'Share summary system prompt',
'ui.admin.bbs_settings.ai.share_summary_prompt_help' => 'System prompt sent to the AI when generating link preview descriptions. Leave blank to use the built-in default.',
'ui.admin.bbs_settings.ai.status_title' => 'Provider Status',
'ui.admin.bbs_settings.ai.system_default' => 'System default',
'ui.admin.bbs_settings.ai.status_enabled' => 'Enabled',
'ui.admin.bbs_settings.ai.status_disabled' => 'Not configured',
'ui.admin.bbs_settings.ai.status_default_model' => 'Default model',
'ui.admin.bbs_settings.ai.status_tools' => 'Tool use',
'ui.admin.bbs_settings.ai.status_tools_yes' => 'Supported',
'ui.admin.bbs_settings.ai.status_tools_no' => 'Not supported',
'ui.admin.bbs_settings.ai.status_configure_hint' => 'Set {env_var} in .env to enable.',
'ui.admin.bbs_settings.ai.pricing_title' => 'Pricing (per million tokens)',
'ui.admin.bbs_settings.ai.pricing_input' => 'Input',
'ui.admin.bbs_settings.ai.pricing_output' => 'Output',
'ui.admin.bbs_settings.ai.pricing_cached' => 'Cached input',
'ui.admin.bbs_settings.ai.pricing_cache_write' => 'Cache write',
'ui.admin.bbs_settings.ai.pricing_not_configured' => 'Not configured. Set AI_PRICE_<PROVIDER>_* env vars to enable cost tracking.',
'ui.admin.bbs_settings.ai.power_cost_title' => 'Power cost',
'ui.admin.bbs_settings.ai.power_cost_configured' => '{watts}W at {per_kwh} USD/kWh = approx. {per_hour} USD/hr',
'ui.admin.bbs_settings.ai.power_cost_not_configured' => 'Not configured. Set OLLAMA_GPU_POWER_WATTS and OLLAMA_POWER_COST_PER_KWH_USD.',
// Share modal - description field and AI summary
'ui.share.description_label' => 'Link preview description',
'ui.share.description_placeholder' => 'Optional ? describe what this message is about',
'ui.share.ai_summary_button_title' => 'Generate AI summary',
'ui.share.ai_summary_failed' => 'Could not generate a summary. Please try again.',
// Share modal - OG preview image
'ui.share.og_image_label' => 'Preview image',
'ui.share.og_image_help' => 'Upload an image to enrich social media previews (JPG, PNG, GIF; max 5 MB)',
'ui.share.og_image_upload_btn' => 'Upload image',
'ui.share.og_image_remove_btn' => 'Remove image',
'ui.share.og_image_uploading' => 'Uploading...',
'ui.share.og_image_no_file' => 'Please select an image file first.',
'ui.share.og_image_upload_success' => 'Preview image updated',
'ui.share.og_image_remove_success' => 'Preview image removed',
// AI Assistant (echomail + netmail readers)
'ui.ai_assistant.button' => 'AI Assistant',
'ui.ai_assistant.modal_title' => 'AI Assistant',
'ui.ai_assistant.quick_prompts' => 'Quick Prompts',
'ui.ai_assistant.prompt_label' => 'Your prompt',
'ui.ai_assistant.prompt_placeholder' => 'Ask the AI about this message...',
'ui.ai_assistant.chars_remaining' => '{remaining} characters remaining',
'ui.ai_assistant.execute' => 'Execute',
'ui.ai_assistant.response_label' => 'Response',
'ui.ai_assistant.credits_notice' => 'Credits will be charged based on usage.',
'ui.ai_assistant.credits_used' => '{credits} credits used',
'ui.ai_assistant.context_message' => 'Message #{id} is loaded as context ? quick prompts will refer to it.',
'ui.ai_assistant.context_none' => 'No message is open. Open a message first for context-aware prompts, or ask a general question.',
'ui.ai_assistant.prompt_placeholder_ctx' => 'Ask about this message...',
'ui.ai_assistant.usage_warning' => 'AI assistance is for interpretation only. It is not intended for composing replies or new messages. Review everything carefully to avoid posting incorrect information or AI slop.',
// Bulletins
'ui.base.bulletins' => 'Bulletins',
'ui.base.admin.bulletins' => 'Bulletins',
'ui.bulletins.title' => 'Bulletins',
'ui.bulletins.count' => 'Bulletin {current} of {total}',
'ui.bulletins.no_new' => 'No new bulletins',
'ui.bulletins.none_available' => 'No bulletins available',
'ui.bulletins.next' => 'Next',
'ui.bulletins.prev' => 'Previous',
'ui.bulletins.skip_all' => 'Skip All',
'ui.bulletins.done' => 'Done',
'ui.dashboard.bulletins.unread' => '{count} unread bulletin(s)',
'ui.dashboard.card.bulletins' => 'Bulletins',
'ui.admin.bulletins.title' => 'Bulletins',
'ui.admin.bulletins.list' => 'Bulletin List',
'ui.admin.bulletins.create' => 'Create Bulletin',
'ui.admin.bulletins.edit' => 'Edit Bulletin',
'ui.admin.bulletins.delete_confirm' => 'Delete this bulletin?',
'ui.admin.bulletins.sort_order' => 'Sort Order',
'ui.admin.bulletins.format' => 'Format',
'ui.admin.bulletins.format_plain' => 'Plain',
'ui.admin.bulletins.format_markdown' => 'Markdown',
'ui.admin.bulletins.active' => 'Active',
'ui.admin.bulletins.inactive' => 'Inactive',
'ui.admin.bulletins.active_from' => 'Active From',
'ui.admin.bulletins.active_until' => 'Active Until',
'ui.admin.bulletins.body' => 'Body',
'ui.admin.bulletins.preview' => 'Preview',
'ui.admin.bulletins.none' => 'No bulletins yet.',
'ui.admin.bulletins.load_failed' => 'Failed to load bulletins.',
'ui.admin.bulletins.save_failed' => 'Failed to save bulletin.',
'ui.admin.bulletins.saved_success' => 'Bulletin saved.',
'ui.admin.bulletins.deleted_success' => 'Bulletin deleted.',
'ui.admin.bulletins.reordered_success' => 'Bulletins reordered.',
'ui.admin.bbs_settings.media_player.title' => 'Media Player',
'ui.admin.bbs_settings.media_player.description' => 'Experimental. Renders detected media URLs inline in message readers. Users can load media by clicking it, or use automatic display; automatic mode loads or embeds detected media URLs immediately and may involve third-party analytics. Recommended enabled for LovlyNet.',
'ui.admin.bbs_settings.media_player.enabled' => 'Enable inline media player',
'ui.admin.bbs_settings.media_player.providers_label' => 'Enabled providers:',
'ui.admin.bbs_settings.media_player.save' => 'Save Media Player Settings',
'ui.admin.bbs_settings.media_player.load_failed' => 'Failed to load media player settings.',
'ui.admin.bbs_settings.media_player.save_failed' => 'Failed to save media player settings.',
'ui.admin.bbs_settings.media_player.saved_success' => 'Media player settings saved successfully.',
'ui.admin.bbs_settings.media_player.provider_settings' => 'Provider Settings',
'ui.admin.bbs_settings.media_player.soundcloud_client_id' => 'Client ID',
'ui.admin.bbs_settings.media_player.soundcloud_client_id_placeholder' => 'Paste your SoundCloud Client ID',
'ui.admin.bbs_settings.media_player.soundcloud_client_id_help' => 'Optional. Obtain a Client ID by registering an app at the SoundCloud Developer Portal. Enables authenticated oEmbed requests.',
'ui.admin.bbs_settings.media_player.twitter_bearer_token' => 'Bearer Token',
'ui.admin.bbs_settings.media_player.twitter_bearer_token_placeholder' => 'Paste your Twitter Bearer Token',
'ui.admin.bbs_settings.media_player.twitter_bearer_token_help' => 'Optional. Obtain a Bearer Token from the Twitter Developer Portal. May be required if Twitter restricts unauthenticated oEmbed requests.',
'ui.admin.bbs_settings.media_player.provider_settings_hint' => 'Changes take effect when you click Save.',
'ui.base.admin.networks' => 'Networks',
'ui.admin.binkp_config.uplinks.modal.edit_network_settings' => 'Edit network settings',
'ui.admin.binkp_config.uplinks.modal.connection_options' => 'Connection Options',
'ui.admin.binkp_config.uplinks.modal.unconfigured_network' => 'unconfigured',
'ui.admin.binkp_config.validation.uplink_domain_required' => 'Network is required.',
'ui.admin.binkp_config.validation.uplink_domain_unknown' => 'Select a configured network.',
'ui.admin.networks.page_title' => 'Networks',
'ui.admin.networks.heading' => 'Networks',
'ui.admin.networks.add_network' => 'Add Network',
'ui.admin.networks.edit_network' => 'Edit Network',
'ui.admin.networks.type' => 'Type',
'ui.admin.networks.domain' => 'Domain',
'ui.admin.networks.name' => 'Name',
'ui.admin.networks.description' => 'Description',
'ui.admin.networks.website' => 'Website',
'ui.admin.networks.flags' => 'Flags',
'ui.admin.networks.no_charset_override' => 'No override',
'ui.admin.networks.markup' => 'Markup',
'ui.admin.networks.media' => 'Media',
'ui.admin.networks.change_domain' => 'Change Domain',
'ui.admin.networks.new_domain' => 'New Domain',
'ui.admin.networks.change_domain_help' => 'Renames the network domain and updates matching echo areas and uplinks.',
'ui.admin.networks.delete_confirm' => 'Delete this network?',
'ui.admin.networks.load_failed' => 'Failed to load networks',
'ui.admin.networks.save_failed' => 'Failed to save network',
'ui.admin.networks.saved' => 'Network saved',
'ui.admin.networks.delete_failed' => 'Failed to delete network',
'ui.admin.networks.deleted' => 'Network deleted',
'ui.admin.networks.change_domain_failed' => 'Failed to change domain',
'ui.admin.networks.domain_changed' => 'Domain changed',
];
|