<?php

declare(strict_types=1);

return [
    'app.name' => 'SeoScope',
    'app.tagline' => 'Turn your Search Console data into actionable SEO insights.',
    'm0.health.title' => 'SeoScope is running',
    'm0.health.version' => 'Version :version',
    'install.required.title' => 'Installation required',
    'install.required.body' => 'Complete the installation wizard to configure the database and admin account.',
    'install.required.link' => 'Open installer',
    'install.m1_stub.title' => 'Installer (M1)',
    'install.m1_stub.body' => 'The installation wizard will be available in milestone M1.',
    'install.already.title' => 'Already installed',
    'install.already.body' => 'Remove storage/app/install.lock only if you intend to reinstall (see documentation).',
    'install.step_a.title' => 'Environment check',
    'install.step_a.intro' => 'Verify that this server meets the requirements before continuing.',
    'install.step_a.continue' => 'Continue to database',
    'install.step_a.refresh' => 'Fix the issues above and refresh this page.',
    'install.step_b.title' => 'Database',
    'install.step_b.intro' => 'Use an empty MySQL database created in your hosting panel.',
    'install.db.host' => 'Host',
    'install.db.port' => 'Port',
    'install.db.name' => 'Database name',
    'install.db.user' => 'Username',
    'install.db.password' => 'Password',
    'install.step_b.test' => 'Continue',
    'install.step_b.back' => 'Back',
    'install.step_c.title' => 'Administrator account',
    'install.step_c.intro' => 'This user will sign in to the SeoScope admin area (login in M2).',
    'install.admin.email' => 'Email (login)',
    'install.admin.name' => 'Display name (optional)',
    'install.admin.password' => 'Password',
    'install.admin.password_confirm' => 'Confirm password',
    'install.step_c.finish' => 'Install',
    'install.csrf_invalid' => 'Invalid security token. Please reload the page.',
    'install.error.generic' => 'Installation failed: :message',
    'install.env.php_version' => 'PHP :version is too old. PHP 8.0 or newer is required.',
    'install.env.extension_missing' => 'Required PHP extension missing: :ext',
    'install.env.storage_not_writable' => 'Path not writable: :path',
    'install.env.probe_write_failed' => 'Cannot write test file in :path',
    'install.env.memory_low' => 'memory_limit is :limit; 128M or higher is recommended.',
    'install.env.no_https' => 'HTTPS is not detected. Use HTTPS in production.',
    'install.error.db_connection' => 'Could not connect to the database. Check credentials and that the database exists.',
    'install.error.db_missing_fields' => 'Please fill in host, database name and username.',
    'install.error.db_port_invalid' => 'Invalid database port. Use a value between 1 and 65535.',
    'install.error.db_access_denied' => 'Database access denied. Check username and password.',
    'install.error.db_unknown_database' => 'Database not found. Create it first in your hosting panel.',
    'install.error.db_host_unreachable' => 'Could not reach the database host. Check host/port and firewall restrictions.',
    'install.error.password_short' => 'Password must be at least 12 characters.',
    'install.error.password_mismatch' => 'Passwords do not match.',
    'install.error.invalid_email' => 'Enter a valid email address.',
    'install.error.config_write' => 'Could not write config/local.php. Check file permissions on /config.',
    'install.error.config_exists' => 'Installation cannot continue because config/local.php already exists. Remove it only if you intend to reinstall.',
    'install.rollback.title' => 'Rollback after a failed install',
    'install.rollback.body' => 'If the installer fails after writing config/local.php or creating tables: delete config/local.php, drop tables with the configured prefix, and remove storage/app/install.lock only if it was created by a broken run. Then restart the wizard from step A.',
    'install.success.redirect' => 'Installation complete. Redirecting…',
    'postinstall.just_installed' => 'Installation finished. You can sign in below.',
    'postinstall.stub.title' => 'Application shell',
    'postinstall.stub.body' => 'Sign in to open the admin dashboard.',
    'common.table_prefix' => 'Database table prefix',
    'common.export_csv' => 'Export CSV',
    'common.apply' => 'Apply',
    'common.reset' => 'Reset',
    'common.cancel' => 'Cancel',
    'common.async_request_failed' => 'Request failed. Please try again.',

    'auth.login_title' => 'Sign in',
    'auth.login_badge' => 'Welcome back',
    'auth.login_hero' => 'Sign in to your workspace',
    'auth.email' => 'Email',
    'auth.password' => 'Password',
    'auth.login_submit' => 'Sign in',
    'auth.logout' => 'Log out',
    'account.page_title' => 'Account',
    'account.heading' => 'Account',
    'account.subtitle' => 'Minimal account info and quick actions.',
    'account.username_label' => 'Username',
    'account.username_placeholder' => 'e.g. Diego',
    'account.username_help' => 'Used in the dashboard greeting.',
    'account.email_label' => 'Email',
    'account.email_help' => 'Used for login and password resets.',
    'account.change_password' => 'Change password',
    'account.save' => 'Save changes',
    'account.saved' => 'Account updated.',
    'account.invalid_email' => 'Please enter a valid email address.',
    'account.email_taken' => 'This email is already in use.',
    'account.invalid_username' => 'Invalid username.',
    'account.logout' => 'Log out',
    'account.back' => 'Back',
    'account.password_title' => 'Change password',
    'account.password_heading' => 'Change password',
    'account.password_subtitle' => 'Update your password using your current password.',
    'account.current_password' => 'Current password',
    'account.current_password_invalid' => 'Current password is incorrect.',
    'account.password_save' => 'Save password',
    'account.password_saved' => 'Password updated.',
    'auth.invalid_credentials' => 'Invalid email or password.',
    'auth.csrf_invalid' => 'Invalid security token. Please try again.',
    'auth.too_many_attempts' => 'Too many login attempts. Try again in :seconds seconds.',
    'auth.forgot_link' => 'Forgot your password?',
    'auth.forgot_title' => 'Forgot password',
    'auth.forgot_hero' => 'Reset your password',
    'auth.forgot_subtitle' => 'Enter your email to receive a reset link.',
    'auth.forgot_help' => 'If the email exists, we will send a password reset link.',
    'auth.forgot_submit' => 'Send reset link',
    'auth.forgot_sent' => 'If the email exists, a reset link has been sent.',

    'setup.title' => 'Create admin account',
    'setup.subtitle' => 'No users were found. Create the first admin account to access the dashboard.',
    'setup.create_admin' => 'Create admin',
    'setup.password_hint' => 'Minimum 8 characters.',
    'setup.invalid' => 'Enter a valid email and a password of at least 8 characters.',
    'setup.created' => 'Admin account created. You can now sign in.',
    'auth.back_to_login' => 'Back to sign in',

    'auth.reset_title' => 'Reset password',
    'auth.reset_hero' => 'Choose a new password',
    'auth.reset_subtitle' => 'Use a strong password you do not reuse elsewhere.',
    'auth.reset_help' => 'Your reset link is valid for 60 minutes.',
    'auth.reset_submit' => 'Set new password',
    'auth.reset_invalid' => 'This reset link is invalid or expired.',
    'auth.reset_request_new' => 'Request a new reset link',
    'auth.reset_success' => 'Password updated. You can sign in now.',
    'auth.new_password' => 'New password',
    'auth.new_password_confirm' => 'Confirm new password',
    'auth.password_hint' => 'Minimum 12 characters.',
    'auth.reset_password_short' => 'Password must be at least 12 characters.',
    'auth.reset_password_mismatch' => 'Passwords do not match.',

    'license.title' => 'License',
    'license.heading' => 'Activate license',
    'license.subtitle' => 'Enter your Envato purchase code to activate this installation.',
    'license.purchase_code_label' => 'Purchase code',
    'license.activate_btn' => 'Activate',
    'license.hint' => 'If your license is already in use on another domain, please contact support to request a reset.',
    'license.back_to_login' => 'Back to sign in',
    'license.activated' => 'License activated. Access granted.',
    'license.in_use' => 'License already in use on :domain. Request a reset or purchase a new license.',
    'license.error_empty' => 'Please enter your purchase code.',
    'license.error_invalid' => 'Activation failed. Check the purchase code and try again.',
    'license.status' => 'Status',
    'license.last_check' => 'Last check',

    'nav.section_main' => 'Menu',
    'nav.dashboard' => 'Dashboard',
    'nav.projects' => 'Websites',
    'nav.settings' => 'Settings',
    'nav.section_reports' => 'Reports',
    'nav.keywords' => 'Keywords',
    'nav.quick_win' => 'Quick Win',
    'nav.long_tail' => 'Long Tail',
    'long_tail.page_title' => 'Long Tail',
    'long_tail.heading' => 'Long Tail',
    'long_tail.title' => 'Long Tail',
    'long_tail.subtitle' => 'Long-tail queries (multi-term searches) for :start → :end.',
    'long_tail.no_property' => 'Enable a property in Settings → Google to see long-tail queries.',
    'long_tail.empty' => 'No long-tail queries found for this range. Try a smaller minimum terms value or broaden the date range.',
    'long_tail.min_terms' => 'Min terms (words)',
    'long_tail.col_terms' => 'Terms',
    'nav.pages' => 'Pages',
    'nav.opportunities' => 'Quick Win',
    'nav.decay' => 'Decay',
    'nav.cannibalization' => 'Cannibalization',
    'nav.question_queries' => 'Question Queries',
    'question_queries.page_title' => 'Question Queries',
    'question_queries.heading' => 'Question Queries',
    'question_queries.title' => 'Question Queries',
    'question_queries.subtitle' => 'Queries containing question terms for :start → :end.',
    'question_queries.no_property' => 'Enable a property in Settings → Google to see question queries.',
    'question_queries.empty' => 'No question queries found for this range. Adjust the question terms or broaden the date range.',
    'question_queries.terms_title' => 'Question terms',
    'question_queries.terms_help' => 'Define which words or phrases identify question queries (comma separated, e.g. how, what, where or come, dove, perché).',
    'question_queries.save_terms' => 'Save terms & refresh',
    'question_queries.reset_default' => 'Reset to default',
    'question_queries.terms_saved' => 'Question terms saved.',
    'nav.soon' => 'Soon',

    'global.filter_property' => 'Property',
    'global.filter_range' => 'Range',
    'global.range_last_7' => 'Last 7 days',
    'global.range_last_28' => 'Last 28 days',
    'global.range_last_6' => 'Last 6 months',
    'global.range_last_30' => 'Last 30 days',
    'global.range_last_3' => 'Last 3 months',
    'global.range_last_12' => 'Last 12 months',
    'global.range_last_16' => 'Last 16 months',
    'global.compare' => 'Compare',
    'global.breakdowns_last_28_hint' => 'Device/Country available for Last 28 days.',
    'global.breakdowns_off_hint' => 'Device/Country disabled in Settings.',
    'global.device_all' => 'All devices',
    'global.device_desktop' => 'Desktop',
    'global.device_mobile' => 'Mobile',
    'global.device_tablet' => 'Tablet',
    'global.country_all' => 'All countries',

    'footer.copyright' => 'SeoScope :version · © :year',

    'dashboard.page_title' => 'Dashboard',
    'dashboard.heading' => 'Overview',
    'dashboard.hero.welcome_named' => 'Welcome back, :name! 👋',
    'dashboard.hero.welcome_guest' => 'Welcome back, there! 👋',
    'dashboard.hero.subtitle' => "Here's what's happening with your website today.",
    'dashboard.kpi.clicks' => 'Clicks',
    'dashboard.kpi.impressions' => 'Impressions',
    'dashboard.kpi.ctr' => 'Avg. CTR',
    'dashboard.kpi.position' => 'Avg. position',
    'dashboard.kpi_placeholder' => 'Coming soon',
    'dashboard.kpi_range' => 'Range: :start → :end',
    'dashboard.data_available_through' => 'Data available through :date',
    'dashboard.vs_previous' => 'vs previous period',
    'dashboard.coming_soon' => 'Search Console metrics and charts will appear here after you connect Google (M3+) and sync data.',
    'dashboard.active_property' => 'Active property:',
    'dashboard.last_sync' => 'Last sync:',
    'dashboard.performance.title' => 'Performance',
    'dashboard.performance.range_suffix' => ' (from :from to :to)',
    'dashboard.metrics_group_aria' => 'Metrics',
    'dashboard.chart.aria' => 'Performance chart',
    'dashboard.chart.truncation_note' => 'The graph ends on :date, the last day with traffic in Search Console (API: web search, same options as the GSC UI). Recent days may still be provisional until Google finalizes data.',
    'dashboard.widget.advanced' => 'Advanced widget',
    'dashboard.widget.click' => 'Click',
    'dashboard.widget.compute' => 'Compute',
    'dashboard.widget.to_load' => 'to load.',
    'dashboard.volatility.label' => 'Ranking volatility',
    'dashboard.volatility.tooltip' => 'Impression-weighted average position movement vs previous period (0–100).',
    'dashboard.trend_direction.label' => 'Trend direction',
    'dashboard.trend_direction.tooltip' => 'Impression-weighted balance of improvements vs declines (Top 3/10/50/100 weighted).',
    'dashboard.keywords_up.label' => 'Keywords up',
    'dashboard.keywords_up.tooltip' => 'Number of keywords with better average position vs previous period.',
    'dashboard.keywords_down.label' => 'Keywords down',
    'dashboard.keywords_down.tooltip' => 'Number of keywords with worse average position vs previous period.',
    'dashboard.compared_to_previous' => 'Compared to previous period',
    'dashboard.backfill.note' => 'Backfill in progress — some long-range reports may be incomplete (up to 16 months, if available in GSC). Imported range: :min → :max',
    'dashboard.traffic_device.title' => 'Traffic by device',
    'dashboard.traffic_device.subtitle' => 'Clicks distribution by device.',
    'dashboard.traffic_device.aria' => 'Traffic by device',
    'dashboard.traffic_location.title' => 'Traffic by location',
    'dashboard.traffic_location.subtitle' => 'Top countries by clicks.',
    'dashboard.traffic_location.col_location' => 'Location',
    'dashboard.traffic_location.col_clicks' => 'Clicks',
    'dashboard.traffic_location.col_share' => 'Share',
    'dashboard.kw_dist.title' => 'Keywords distribution',
    'dashboard.kw_dist.subtitle' => 'Keywords by average ranking tiers.',
    'dashboard.kw_dist.aria' => 'Keywords distribution',
    'dashboard.tracked_keywords.title' => 'Tracked keywords',
    'dashboard.tracked_keywords.subtitle' => 'Saved queries for this Search Console property.',
    'dashboard.tracked_keywords.empty' => 'No tracked keywords yet.',
    'dashboard.tracked_keywords.link_all' => 'Open Keywords report',
    'dashboard.tracked_keywords.table_caption' => 'Sorted by impressions in the selected dashboard period (up to :max rows).',
    'dashboard.tracked_pages.title' => 'Tracked pages',
    'dashboard.tracked_pages.subtitle' => 'Saved landing page URLs for this Search Console property.',
    'dashboard.tracked_pages.empty' => 'No tracked pages yet.',
    'dashboard.tracked_pages.link_all' => 'Open Pages report',
    'dashboard.tracked_pages.table_caption' => 'Sorted by impressions in the selected dashboard period (up to :max rows).',
    'dashboard.tracked_table.col_query' => 'Keyword',
    'dashboard.tracked_table.col_page' => 'Page',
    'dashboard.tracked_table.col_clicks' => 'Clicks',
    'dashboard.tracked_table.col_impressions' => 'Impressions',
    'dashboard.tracked_table.col_ctr' => 'CTR',
    'dashboard.tracked_table.col_position' => 'Avg. position',
    'dashboard.empty.no_data' => 'No data yet.',
    'dashboard.chart.dataset.ctr' => 'CTR (%)',
    'dashboard.trend.positive' => 'Positive',
    'dashboard.trend.negative' => 'Negative',
    'dashboard.trend.neutral' => 'Neutral',
    'dashboard.js.computing' => 'Computing…',
    'dashboard.js.retry' => 'Retry',

    'projects.page_title' => 'Websites',
    'projects.heading' => 'Websites',
    'projects.list_title' => 'Your websites',
    'projects.add' => 'Add website',
    'projects.empty' => 'No websites yet. Add one to prepare for Search Console linking.',
    'projects.col_name' => 'Name',
    'projects.col_url' => 'Site URL',
    'projects.col_notes' => 'Notes',
    'projects.col_gsc' => 'GSC property',
    'projects.edit' => 'Edit',
    'projects.delete' => 'Delete',
    'projects.delete_confirm' => 'Delete this website?',
    'projects.new_title' => 'New website',
    'projects.new_heading' => 'New website',
    'projects.edit_title' => 'Edit website',
    'projects.edit_heading' => 'Edit website',
    'projects.field_name' => 'Website name',
    'projects.field_url' => 'Site URL',
    'projects.field_notes' => 'Notes (optional)',
    'projects.field_gsc_property' => 'Google Search Console property',
    'projects.gsc_none' => 'None (not mapped yet)',
    'projects.gsc_help' => 'Choose the Search Console property that matches this website.',
    'projects.save' => 'Save',
    'projects.cancel' => 'Cancel',
    'projects.saved' => 'Website created.',
    'projects.updated' => 'Website updated.',
    'projects.deleted' => 'Website deleted.',
    'projects.error_name' => 'Enter a website name.',
    'projects.error_url' => 'Enter a site URL.',
    'projects.error_url_invalid' => 'Enter a valid URL (including https://).',
    'projects.error_gsc_invalid' => 'Selected GSC property is not in the fetched properties list. Fetch properties again and retry.',

    'projects.gsc_active' => 'Active',
    'projects.gsc_discovered' => 'Discovered',
    'projects.gsc_not_mapped' => 'Not mapped',
    'projects.gsc_properties_title' => 'Google Search Console properties',
    'projects.gsc_properties_subtitle' => 'Discovered properties from your connected Google account, and whether they are mapped to a website.',
    'projects.gsc_properties_empty_prefix' => 'No properties found yet. Click',
    'projects.gsc_properties_empty_suffix' => 'to retrieve the properties of your account.',
    'projects.gsc_filter_label' => 'Show:',
    'projects.gsc_filter_all' => 'All',
    'projects.gsc_filter_verified' => 'Verified',
    'projects.gsc_filter_unverified' => 'Unverified',
    'projects.gsc_prop_col_site' => 'Property',
    'projects.gsc_prop_col_status' => 'Status',
    'projects.gsc_prop_col_enabled' => 'Status',
    'projects.gsc_prop_col_last_synced' => 'Last synced',
    'projects.gsc_prop_col_fullsync' => 'Full sync',
    'projects.gsc_prop_col_imported_range' => 'Imported range',
    'projects.last_synced_ok' => 'OK',
    'projects.last_synced_error' => 'Error',
    'projects.last_synced_never' => 'Never',
    'projects.last_sync_date_label' => 'Last day processed (GSC): :date',
    'projects.gsc_enabled' => 'Enabled',
    'projects.gsc_disabled' => 'Disabled',
    'projects.gsc_enable' => 'Enable',
    'projects.gsc_disable' => 'Disable',
    'projects.gsc_enable_hint' => 'Enable this property and download the last 28 days.',
    'projects.gsc_enable_blocked_hint' => 'Insufficient permission (siteUnverifiedUser).',
    'projects.full_sync' => 'Full sync',
    'projects.full_sync_queued' => 'Full sync queued.',
    'projects.full_sync_already_queued' => 'Full sync is already queued or running.',
    'projects.sync_kickoff_started' => 'Started now (up to ~20s), continuing in background.',
    'projects.sync_kickoff_queued_locked' => 'Queued — another sync run is in progress; continuing in background.',
    'projects.full_sync_requires_enable_hint' => 'Enable the property first.',
    'projects.full_sync_completed_badge' => 'COMPLETED (up to 16m)',
    'projects.full_sync_completed_hint' => 'Already imported up to the maximum available in Google Search Console.',
    'projects.full_sync_rerun_refresh' => 'Re-run backfill (refresh)',
    'projects.full_sync_missing_only' => 'Sync missing only',
    'projects.full_sync_missing_nothing' => 'Nothing missing to sync.',
    'projects.full_sync_blocked' => 'Not available',
    'projects.cron_last_run' => 'Cron last run:',
    'projects.cron_ok' => 'OK',
    'projects.cron_stale' => 'Cron not running',
    'projects.queue_recent' => 'Recent sync jobs',
    'projects.queue_job' => 'Job',
    'projects.queue_property' => 'Property',
    'projects.queue_status' => 'Status',
    'projects.status_pending' => 'Pending',
    'projects.queue_next' => 'Next run',
    'projects.progress_label' => 'Progress:',
    'projects.queue_error' => 'Last error',
    'projects.queue_pause' => 'Pause',
    'projects.queue_resume' => 'Resume',
    'projects.queue_cancel' => 'Cancel',
    'projects.queue_cancel_confirm' => 'Cancel queued sync for this property?',
    'projects.queue_cancel_hint' => 'Cancel queued sync jobs for this property.',
    'projects.queue_cancel_running_hint' => 'Cancellation requested. The job will stop after the current chunk finishes.',
    'projects.queue_paused' => 'Queue paused for this property.',
    'projects.queue_resumed' => 'Queue resumed for this property.',
    'projects.queue_cancelled' => 'Queue cancelled for this property.',
    'projects.queue_action_failed' => 'Queue action failed: :message',

    'settings.page_title' => 'Settings',
    'settings.heading' => 'Settings',
    'settings.subtitle' => 'Configure integrations and application preferences.',
    'settings.ai.title' => 'AI',
    'settings.ai.heading' => 'AI insights',
    'settings.ai.subtitle' => 'Connect an AI provider to generate data-driven readings in reports (Dashboard, Quick Win, Keywords, and more).',
    'settings.ai.privacy_note' => 'API keys are stored encrypted on this server. API usage is billed by your configured provider to your account.',
    'settings.ai.data_disclaimer_title' => 'What is sent to your AI provider',
    'settings.ai.data_disclaimer_summary' => 'When you run an SEO AI insight, SeoScope sends a compact JSON payload from your server to your chosen provider (OpenAI or Anthropic): Search Console data for the active report view, plus minimal workspace context (property, dates, filters). API keys stay on this server; nothing is sent while AI insights are off.',
    'settings.ai.enable_label' => 'Enable AI insights',
    'settings.ai.enabled_saving' => 'Saving…',
    'settings.ai.enabled_on' => 'AI insights enabled.',
    'settings.ai.enabled_off' => 'AI insights disabled.',
    'settings.ai.provider_label' => 'Default provider',
    'settings.ai.provider_hint' => 'Used for all AI readings until you add per-section overrides.',
    'settings.ai.provider_openai' => 'OpenAI',
    'settings.ai.provider_anthropic' => 'Anthropic',
    'settings.ai.openai_key_label' => 'OpenAI API key',
    'settings.ai.anthropic_key_label' => 'Anthropic API key',
    'settings.ai.openai_model_label' => 'OpenAI model',
    'settings.ai.anthropic_model_label' => 'Anthropic model',
    'settings.ai.key_placeholder' => 'sk-…',
    'settings.ai.key_configured' => 'A key is saved. Leave the field unchanged to keep it.',
    'settings.ai.save' => 'Save AI settings',
    'settings.ai.saved' => 'AI settings saved.',
    'settings.ai.saved_missing_key' => 'AI is enabled but the selected provider has no API key yet.',
    'settings.ai.test_btn' => 'Test connection',
    'settings.ai.test_running' => 'Testing connection…',
    'settings.ai.test_no_curl' => 'The PHP cURL extension is required to contact AI providers.',
    'settings.ai.test_missing_key' => 'No API key for the selected provider. Save a key first or paste one in the field.',
    'settings.ai.test_auth_failed' => 'Authentication failed. Check that the API key is valid and not revoked.',
    'settings.ai.test_failed' => 'Connection failed: :detail',
    'settings.ai.test_http_failed' => 'API returned HTTP :status. :detail',
    'settings.ai.test_ok_openai' => 'OpenAI connection OK. Default model: :model',
    'settings.ai.test_ok_anthropic' => 'Anthropic connection OK. Default model: :model',
    'settings.ai.openai_models_refresh_btn' => 'Refresh list',
    'settings.ai.openai_models_from_api' => 'Latest chat models from your OpenAI account (cached 1 hour).',
    'settings.ai.openai_models_fallback' => 'Default list shown until an API key is saved and models are loaded.',
    'settings.ai.openai_models_refreshed' => 'Model list updated from OpenAI.',
    'settings.ai.openai_models_fetch_failed' => 'Could not load models from OpenAI. Check the API key and try again.',
    'settings.ai.tokens_section_title' => 'Token usage (SEO AI Assistant)',
    'settings.ai.tokens_section_intro' => 'Counts come from API usage (total tokens). “Last 30 days” is a rolling window; “Current month” is from the first day of the calendar month (same basis as the monthly cap).',
    'settings.ai.tokens_col_provider' => 'Provider',
    'settings.ai.tokens_col_all_time' => 'All time',
    'settings.ai.tokens_col_last_30' => 'Last 30 days',
    'settings.ai.tokens_col_calendar_month' => 'Current month',
    'settings.ai.token_limit_openai_label' => 'OpenAI monthly token limit (optional)',
    'settings.ai.token_limit_anthropic_label' => 'Anthropic monthly token limit (optional)',
    'settings.ai.token_limit_hint' => 'Leave blank or 0 for no limit. The cap applies to the current calendar month and blocks new SEO AI analyses when reached.',
    'seo_ai.completion.no_curl' => 'The PHP cURL extension is required to call your AI provider.',
    'seo_ai.completion.not_enabled' => 'AI insights are turned off. Enable them under Settings → AI.',
    'seo_ai.completion.missing_key' => 'No API key for the selected AI provider. Add one under Settings → AI.',
    'seo_ai.completion.transport' => 'Could not reach the AI provider: :detail',
    'seo_ai.completion.empty_response' => 'The AI returned no text. Try again in a moment.',
    'seo_ai.completion.parse_failed' => 'The AI response was not usable. Try regenerating the insight.',
    'seo_ai.completion.auth_failed' => 'The AI provider rejected the API key.',
    'seo_ai.completion.provider_rate_limited' => 'The AI provider rate limit was hit. Wait a few minutes and try again.',
    'seo_ai.completion.provider_unavailable' => 'The AI provider is temporarily unavailable. Try again shortly.',
    'seo_ai.completion.provider_timeout' => 'The AI provider took too long to respond. Try again in a moment.',
    'seo_ai.completion.invalid_upstream_json' => 'The AI provider returned data we could not read. Try regenerating the insight.',
    'seo_ai.completion.provider_http' => 'The AI provider returned HTTP :status. Try again in a moment.',
    'seo_ai.completion.transport_detail_fallback' => 'Temporary network error.',
    'seo_ai.completion.rate_limited' => 'Too many AI analyses requested in the last hour. Try again shortly.',
    'seo_ai.completion.token_limit_reached' => 'The monthly token limit for this provider has been reached. Raise the limit under Settings → AI, or wait until next month.',
    'seo_ai.dashboard.no_property' => 'Select an active Search Console property first.',
    'seo_ai.dashboard.not_ready' => 'There isn’t enough Search Console data in this range yet.',
    'seo_ai.dashboard.ai_not_configured' => 'AI is not set up yet. Open Settings → AI to enable it and add your API key.',
    'seo_ai.card.title' => 'SEO AI Assistant',
    'seo_ai.card.intro_hint' => 'Click Generate insight to get an assessment of how your site is performing for the selected time period.',
    'seo_ai.iqqi.intro_hint' => 'Click Generate insight for an AI reading focused on your IQQI opportunities (near-top queries with CTR below benchmark).',
    'seo_ai.iqqi.not_ready' => 'No IQQI opportunities match the current filters. Adjust thresholds or sync more Search Console data, then try again.',
    'seo_ai.iqqi.bad_tab' => 'AI insight is only available on the IQQI tab.',
    'seo_ai.quick_win.bad_tab' => 'AI insight is only available on supported Quick Win tabs (IQQI, CTR Opportunity, Low CTR Pages, Topical Gaps).',
    'seo_ai.ctr.intro_hint' => 'Click Generate insight for an AI reading focused on your CTR Opportunity rows (queries with CTR below benchmark for their position).',
    'seo_ai.ctr.not_ready' => 'No CTR Opportunity rows match the current filters. Adjust thresholds or sync more Search Console data, then try again.',
    'seo_ai.ctr.generate_tooltip' => 'Analyzes top CTR Opportunity rows for this period and filters using your configured AI provider.',
    'seo_ai.low_ctr_pages.intro_hint' => 'Click Generate insight for an AI reading focused on your Low CTR Pages (high-impression URLs with CTR below benchmark for their position).',
    'seo_ai.low_ctr_pages.not_ready' => 'No Low CTR Pages match the current filters. Adjust thresholds or sync more Search Console data, then try again.',
    'seo_ai.low_ctr_pages.generate_tooltip' => 'Analyzes top Low CTR Pages for this period and filters using your configured AI provider.',
    'seo_ai.topical_gaps.intro_hint' => 'Click Generate insight for an AI reading focused on your Topical Gaps (high-impression queries ranking low with few clicks).',
    'seo_ai.topical_gaps.not_ready' => 'No Topical Gaps match the current filters. Adjust thresholds or sync more Search Console data, then try again.',
    'seo_ai.topical_gaps.generate_tooltip' => 'Analyzes top Topical Gap rows for this period and filters using your configured AI provider.',
    'seo_ai.keywords.intro_hint' => 'Click Generate insight for an AI reading of your top keywords for this report (respecting filters, search, and sort).',
    'seo_ai.keywords.not_ready' => 'No keywords match the current filters and date range. Sync Search Console data or adjust filters, then try again.',
    'seo_ai.keywords.generate_tooltip' => 'Analyzes top keyword rows for this report view using your configured AI provider.',
    'seo_ai.pages.intro_hint' => 'Click Generate insight for an AI reading of your top landing pages for this report (respecting filters, search, and sort).',
    'seo_ai.pages.not_ready' => 'No pages match the current filters and date range. Sync Search Console data or adjust filters, then try again.',
    'seo_ai.pages.generate_tooltip' => 'Analyzes top page rows for this report view using your configured AI provider.',
    'seo_ai.cannibalization.intro_hint' => 'Click Generate insight for an AI reading of your top cannibalization cases (queries with multiple competing URLs).',
    'seo_ai.cannibalization.not_ready' => 'No cannibalization cases match the current filters and date range. Sync Search Console data or relax thresholds, then try again.',
    'seo_ai.cannibalization.generate_tooltip' => 'Analyzes top cannibalization cases for this report view using your configured AI provider.',
    'seo_ai.long_tail.intro_hint' => 'Click Generate insight for an AI reading of your top long-tail queries (multi-word searches).',
    'seo_ai.long_tail.not_ready' => 'No long-tail queries match the current filters and date range. Sync Search Console data or lower the minimum terms, then try again.',
    'seo_ai.long_tail.generate_tooltip' => 'Analyzes top long-tail query rows for this report view using your configured AI provider.',
    'seo_ai.question_queries.intro_hint' => 'Click Generate insight for an AI reading of your top question-style search queries (matching your configured question terms).',
    'seo_ai.question_queries.not_ready' => 'No question queries match the current filters, question terms, and date range. Sync Search Console data or adjust question terms, then try again.',
    'seo_ai.question_queries.generate_tooltip' => 'Analyzes top question-query rows for this report view using your configured AI provider.',
    'seo_ai.decay.intro_hint' => 'Click Generate insight for an AI reading of your top decaying queries (period-over-period declines).',
    'seo_ai.decay.not_ready' => 'No decaying queries match the current filters, thresholds, and date range. Sync Search Console data or relax thresholds, then try again.',
    'seo_ai.decay.generate_tooltip' => 'Analyzes top decaying query rows for this report view using your configured AI provider.',
    'seo_ai.iqqi.generate_tooltip' => 'Analyzes top IQQI rows for this period and filters using your configured AI provider.',
    'seo_ai.card.state_no_property' => 'Select an active Search Console property in the bar above to use the SEO AI Assistant.',
    'seo_ai.card.configure_hint' => 'Turn on AI in Settings and add your OpenAI or Anthropic API key. Your key stays on your server.',
    'seo_ai.card.open_settings_ai' => 'Open Settings → AI',
    'seo_ai.card.generate' => 'Generate insight',
    'seo_ai.card.regenerate' => 'Regenerate',
    'seo_ai.card.analyzing' => 'Analysis in progress…',
    'seo_ai.card.health_label' => 'SEO health',
    'seo_ai.card.summary_heading' => 'AI summary',
    'seo_ai.card.insight_heading' => 'Key insight',
    'seo_ai.card.action_heading' => 'Recommended action',
    'seo_ai.card.network_error' => 'Could not reach the server. Check your connection and try again.',
    'seo_ai.card.bad_response' => 'The server returned an unexpected response. Reload the page and try again.',
    'seo_ai.card.csrf_failed' => 'Your session may have expired. Reload the page and try again.',
    'seo_ai.card.health_tooltip' => 'This badge is computed on your server from aggregated Search Console metrics for the selected period and filters (including an optional period compare and a compact daily-series digest). It is not chosen by the AI text. Good, Warning, and Critical reflect how strong negative signals look for this slice—always confirm in Search Console.',
    'seo_ai.card.health_help_aria' => 'More about the SEO health badge',
    'seo_ai.card.generate_tooltip' => 'Uses your configured AI provider to summarise the same dashboard numbers (aggregated). Respects cache when available.',
    'seo_ai.card.regenerate_tooltip' => 'Requests a fresh analysis from your AI provider and updates the saved result for this period and filters.',
    'seo_ai.health.good' => 'Good',
    'seo_ai.health.tooltip_good' => 'Server-side score: broadly healthy signals for this selection (totals, compare if on, and trend digest).',
    'seo_ai.health.warning' => 'Warning',
    'seo_ai.health.tooltip_warning' => 'Server-side score: mixed or thin signals—review the chart and KPIs alongside the AI text.',
    'seo_ai.health.critical' => 'Critical',
    'seo_ai.health.tooltip_critical' => 'Server-side score: several strong negative signals—investigate in Search Console and treat as high priority.',
    'settings.categories.title' => 'Categories',
    'settings.interface.title' => 'Interface',
    'settings.tracked_categories.title' => 'Tracked categories',
    'settings.tracked_categories.heading' => 'Tracked categories',
    'settings.tracked_categories.subtitle' => 'Labels for the currently selected Search Console property. They apply to both tracked keywords and tracked pages.',
    'settings.tracked_categories.no_property' => 'Enable a property in the GSC connection tab first, then pick it in the bar above.',
    'settings.tracked_categories.empty_list' => 'No categories yet. Create one below.',
    'settings.tracked_categories.col_name' => 'Category',
    'settings.tracked_categories.col_actions' => 'Actions',
    'tracked_cat.filter_hint_reports' => 'Use the links below to filter tracked lists. Create or delete categories in Settings.',
    'tracked_cat.manage_link_settings' => 'Open Settings → Tracked categories',
    'settings.interface.heading' => 'Interface',
    'settings.interface.subtitle' => 'Choose the language for the admin interface.',
    'settings.interface.lang_label' => 'Language',
    'settings.interface.save' => 'Save',
    'settings.interface.saved' => 'Language saved.',
    'settings.interface.error_invalid' => 'Invalid language selection.',
    'settings.interface.hint' => 'If a phrase is not translated in your language yet, the English version is shown automatically.',
    'settings.interface.langs.heading' => 'Languages',
    'settings.interface.langs.subtitle' => 'Add a new UI language by downloading the template and uploading your translated JSON file.',
    'settings.interface.langs.code_label' => 'Code',
    'settings.interface.langs.name_label' => 'Language name',
    'settings.interface.langs.add_btn' => 'Add language',
    'settings.interface.langs.add_hint' => 'Use a 2-letter ISO code (e.g. es, fr, de).',
    'settings.interface.langs.none' => 'No custom languages yet.',
    'settings.interface.langs.col_code' => 'Code',
    'settings.interface.langs.col_name' => 'Name',
    'settings.interface.langs.col_actions' => 'Actions',
    'settings.interface.langs.download_btn' => 'Download template',
    'settings.interface.langs.upload_btn' => 'Upload',
    'settings.interface.langs.delete_btn' => 'Delete',
    'settings.interface.langs.upload_hint' => 'Missing keys will automatically fall back to English.',
    'settings.interface.langs.created' => 'Language created.',
    'settings.interface.langs.uploaded' => 'Translations uploaded.',
    'settings.interface.langs.deleted' => 'Language deleted.',
    'settings.interface.langs.error_invalid' => 'Invalid language data.',
    'settings.interface.langs.error_exists' => 'This language code already exists.',
    'settings.interface.langs.error_storage' => 'Cannot write language files. Check permissions on storage/.',
    'settings.interface.langs.error_upload' => 'Upload failed. Please upload a valid .json file (max 2MB).',
    'settings.interface.langs.error_json' => 'Invalid JSON file.',
    'settings.interface.langs.error_extra_keys' => 'Unexpected key in JSON: :key',
    'settings.interface.langs.delete_confirm' => 'Delete language :code? This cannot be undone.',
    'settings.back' => 'Back to Settings',
    'settings.automation.regenerate_confirm' => 'Regenerate token? Existing cron jobs will stop working.',
    'settings.google.step1_label' => 'Step 1:',
    'settings.google.step1_text' => 'upload or paste your OAuth JSON (and/or set Client ID/Secret).',
    'settings.google.step2_label' => 'Step 2:',
    'settings.google.step2_text' => 'connect your Google account.',
    'settings.google.advanced_title' => 'Advanced & troubleshooting',
    'settings.google.oauth.disconnect_confirm' => 'Disconnect Google?',
    'settings.google.creds.invalid_json' => 'Invalid JSON. Please upload a valid OAuth credentials JSON file.',
    'settings.google.creds.json_missing_fields' => 'OAuth JSON is missing client_id or client_secret.',
    'settings.google.creds.missing_manual' => 'Please provide Client ID and Client Secret, or upload the OAuth JSON file.',
    'settings.google.creds.saved' => 'Google OAuth credentials saved.',

    'settings.setup.title' => 'Setup checklist',
    'settings.setup.subtitle' => 'Follow these steps to connect Google and enable automatic sync.',
    'settings.setup.status_done' => 'Done',
    'settings.setup.status_missing' => 'Not set',
    'settings.setup.status_locked' => 'Locked',
    'settings.setup.status_connected' => 'Connected',
    'settings.setup.status_needs_attention' => 'Needs attention',
    'settings.setup.step1.title' => '1) Add OAuth credentials',
    'settings.setup.step1.subtitle' => 'Upload the JSON or paste Client ID/Secret.',
    'settings.setup.step1.redirect_help' => 'In Google Cloud Console, add this exact URL under Authorized redirect URIs when you create the OAuth client (or before downloading the JSON).',
    'settings.setup.step1.redirect_missing' => 'Set a valid https URL in config/local.php (app.url) to show your redirect URI here.',
    'settings.setup.step1.cta' => 'Open',
    'settings.setup.step2.title' => '2) Connect to Google',
    'settings.setup.step2.subtitle' => 'Authorize access and store tokens.',
    'settings.setup.step2.cta' => 'Open',
    'settings.setup.step3.title' => '3) Configure cron',
    'settings.setup.step3.subtitle' => 'Run sync jobs automatically in the background.',
    'settings.setup.step3.cta' => 'Open Automation',
    'settings.setup.step4.title' => '4) Fetch properties',
    'settings.setup.step4.subtitle_prefix' => 'Go to',
    'settings.setup.step4.websites' => 'Websites',
    'settings.setup.step4.subtitle_suffix' => 'and click Fetch properties.',

    'settings.decay.page_title' => 'Decay thresholds',
    'settings.decay.heading' => 'Decay',
    'settings.decay.title' => 'Decay thresholds',
    'settings.decay.subtitle' => 'Tune how decay is detected between periods.',
    'settings.decay.open' => 'Open Decay settings',
    'settings.decay.min_impressions' => 'Min impressions (current period)',
    'settings.decay.clicks_drop_pct' => 'Clicks drop threshold (%)',
    'settings.decay.impr_drop_pct' => 'Impressions drop threshold (%)',
    'settings.decay.position_worsen' => 'Position worsen threshold (Δ)',
    'settings.decay.pct_help' => 'Example: 20 means -20% or worse.',
    'settings.decay.save' => 'Save thresholds',
    'settings.decay.saved' => 'Decay thresholds saved.',
    'settings.decay.invalid' => 'Invalid values. Check thresholds and try again.',

    'settings.automation.page_title' => 'Automation',
    'settings.automation.heading' => 'Automation',
    'settings.automation.title' => 'Cron',
    'settings.automation.subtitle' => 'Run sync jobs automatically via a secure cron URL.',
    'settings.automation.open' => 'Open Automation settings',
    'settings.automation.cron_url' => 'Cron URL',
    'settings.automation.cron_url_help' => 'Copy the full HTTPS address below (HTTP GET). Schedule it using the short guides for your host—Plesk, cPanel, or anything else.',
    'settings.automation.note_lock' => 'A lock prevents overlapping runs; concurrent calls return HTTP 409.',
    'settings.automation.howto_title' => 'How to schedule this URL',
    'settings.automation.section_plesk' => 'Plesk',
    'settings.automation.plesk_step1' => 'Open Tools & Settings (or Domains → your subscription) → Scheduled Tasks → Add Task.',
    'settings.automation.plesk_step2' => 'Choose Fetch a URL (HTTP GET). Paste this Cron URL:',
    'settings.automation.plesk_step3' => 'Run every 5–10 minutes (e.g. every 5 minutes: */5 * * * *). Do not add a second task that hits the same URL (e.g. Fetch URL plus a curl)—you may see HTTP 409.',
    'settings.automation.section_cpanel' => 'cPanel',
    'settings.automation.cpanel_step1' => 'Open Cron Jobs → Add New Cron Job.',
    'settings.automation.cpanel_step2' => 'Set the schedule (e.g. every 5 minutes: */5 * * * *) and paste the following curl command:',
    'settings.automation.cpanel_step3' => 'If your host rejects the command because of quoting, wrap the URL in single quotes inside curl instead of double quotes.',
    'settings.automation.section_other' => 'Other hosting (VPS, no panel, custom)',
    'settings.automation.other_step1' => 'Use the same curl one-liner in your system crontab (cron -e), or systemd timer, replacing /usr/bin/curl if needed (which curl). wget -qO- "..." works if curl is unavailable.',
    'settings.automation.other_step2' => 'Cloud panels (RunCloud, Cloudways, etc.): create an scheduled HTTP GET to this exact URL.',
    'settings.automation.other_step3' => 'Do not rely on simple uptime pings—they must execute a full GET to this URL including the secret token.',
    'settings.automation.howto_common' => 'General notes',
    'settings.automation.howto_freq' => 'Recommended interval: every 5 minutes on */5 * * * * (or every 10 minutes on busy shared hosting).',
    'settings.automation.howto_example' => 'Example curl (Linux; paste into cPanel Cron Command or cron -e—adjust paths if needed):',
    'settings.automation.howto_relative_only' => 'Set a full https URL in config/local.php (app.url) so this page can show a complete cron address. Until then, only a site-relative path is shown.',
    'settings.automation.howto_409' => 'HTTP 409 means another sync is still running (by design). Common causes: two schedulers hitting the same URL (e.g. “Fetch a URL” plus a curl task), or the next run starting before the previous one finished—use only one task or a longer interval. Plesk may show 409 as a “task error” even though the URL is correct.',
    'settings.automation.howto_loops' => 'The example adds &loops=4 (max 10). You can change the number or omit it; the server default is 4 when the parameter is missing.',
    'settings.automation.howto_token' => 'If you regenerate the token, update your hosting cron URL accordingly.',
    'settings.automation.token' => 'Token',
    'settings.automation.token_help' => 'This token protects the public cron endpoint.',
    'settings.automation.regenerate' => 'Regenerate token',
    'settings.automation.token_regenerated' => 'Cron token regenerated.',
    'settings.automation.token_missing' => 'Token not set. Click “Regenerate token”.',

    'settings.update.title' => 'Update',
    'settings.update.heading' => 'Install update',
    'settings.update.subtitle' => 'Upload the new SeoScope ZIP package downloaded from your CodeCanyon account.',
    'settings.update.backup_note' => 'Back up your database and files (especially config and storage) before updating. The installer does not create automatic backups. If something goes wrong, restore from your backup.',
    'settings.update.installed_version' => 'Installed version',
    'settings.update.php_limits' => 'PHP upload limits (hosting)',
    'settings.update.releases_heading' => 'Latest version (informational)',
    'settings.update.releases_unavailable' => 'Could not load release information (:code). You can still install from a ZIP you downloaded from CodeCanyon.',
    'settings.update.releases_not_configured' => 'No remote release data available.',
    'settings.update.latest_listed' => 'Latest listed version: :version',
    'settings.update.released_at' => 'Released: :date',
    'settings.update.changelog_link' => 'Changelog / documentation',
    'settings.update.upload_title' => 'Upload package',
    'settings.update.upload_subtitle' => 'The archive must be the official product ZIP; version inside the package must be newer than the installed version.',
    'settings.update.upload_btn' => 'Install from ZIP',
    'settings.update.zip_hint' => 'Only .zip is accepted. The install preserves config/local.php and the entire storage/ directory.',
    'settings.update.success' => 'Update applied. New version: :version (:files file(s) replaced or added). Open any page to finish loading. Database migrations have been run if needed.',
    'settings.update.error_no_file' => 'No file uploaded.',
    'settings.update.error_upload' => 'Upload failed (code :code).',
    'settings.update.error_too_big' => 'The file is too large for the server upload limits. Increase upload_max_filesize and post_max_size, or ask your host.',
    'settings.update.error_no_zip' => 'The PHP zip extension (ZipArchive) is required. Enable ext-zip in PHP.',
    'settings.update.error_invalid_zip' => 'The archive could not be read or extracted (:detail).',
    'settings.update.error_not_package' => 'This does not look like a SeoScope package (public/index.php and app/Version.php not found in the expected layout).',
    'settings.update.error_no_version_file' => 'app/Version.php is missing in the package.',
    'settings.update.error_not_newer' => 'The package version (:version) is not newer than the current installation. Download the latest file from CodeCanyon.',
    'settings.update.error_write' => 'Could not write to disk or paths are invalid. Check file permissions, disk space, and open basedir: :message',
    'settings.update.error_apply' => 'Update failed: :message',

    'settings.diagnostics.page_title' => 'Diagnostics',
    'settings.diagnostics.heading' => 'Diagnostics',
    'settings.diagnostics.title' => 'Diagnostics',
    'settings.diagnostics.subtitle' => 'Support-friendly status and recent errors (no secrets).',
    'settings.diagnostics.open' => 'Open Diagnostics',
    'settings.diagnostics.export' => 'Export diagnostics',
    'settings.diagnostics.export_failed' => 'Export failed: :message',
    'settings.diagnostics.env_title' => 'Environment',
    'settings.diagnostics.google_title' => 'Google & OAuth',
    'settings.diagnostics.generated_at' => 'Generated at:',
    'settings.diagnostics.php_version' => 'PHP:',
    'settings.diagnostics.check' => 'Check',
    'settings.diagnostics.status' => 'Status',
    'settings.diagnostics.google_connected' => 'Connected at:',
    'settings.diagnostics.google_reconnect' => 'Reconnect required:',
    'settings.diagnostics.google_last_error' => 'Last token error:',
    'settings.diagnostics.breakdowns_policy' => 'Breakdowns policy:',
    'settings.diagnostics.sync_logs_title' => 'Sync runs (recent)',
    'settings.diagnostics.no_runs' => 'No sync runs yet.',
    'settings.diagnostics.run_started' => 'Started',
    'settings.diagnostics.run_status' => 'Status',
    'settings.diagnostics.run_mode' => 'Mode',
    'settings.diagnostics.run_range' => 'Range',
    'settings.diagnostics.run_summary' => 'Summary',
    'settings.diagnostics.sync_items_title' => 'Per-property results (recent)',
    'settings.diagnostics.item_site' => 'Property',
    'settings.diagnostics.item_range' => 'Range',
    'settings.diagnostics.item_status' => 'Status',

    'settings.reset.title' => 'Reset',
    'settings.reset.subtitle' => 'Delete imported data and restart sync when needed.',
    'settings.reset.props_title' => 'Reset property',
    'settings.reset.props_subtitle' => 'Deletes all imported data for the selected properties (reports, dashboard widgets, caches, jobs & logs).',
    'settings.reset.select_all' => 'Select all',
    'settings.reset.select_none' => 'Select none',
    'settings.reset.col_property' => 'Property',
    'settings.reset.col_status' => 'Status',
    'settings.reset.no_properties' => 'No properties found.',
    'settings.reset.reset_selected_btn' => 'Reset selected properties',
    'settings.reset.props_note' => 'This permanently deletes imported data for the selected properties.',
    'settings.reset.confirm_title' => 'Confirm reset',
    'settings.reset.confirm_props_text' => 'This will permanently delete imported data for the selected properties. This cannot be undone.',
    'settings.reset.confirm_ack' => 'I understand this cannot be undone.',
    'settings.reset.type_reset' => 'Type RESET to confirm',
    'settings.reset.delete_data_btn' => 'Delete data',
    'settings.reset.all_title' => 'Reset all data',
    'settings.reset.all_subtitle' => 'Restores the plugin to the initial state. Deletes all properties, settings, imported data, jobs, logs and users.',
    'settings.reset.reset_all_btn' => 'Reset everything',
    'settings.reset.danger_title' => 'Danger zone',
    'settings.reset.confirm_all_text' => 'This will permanently delete all application data, including user accounts. This cannot be undone.',
    'settings.reset.type_delete_all' => 'Type DELETE ALL to confirm',
    'settings.reset.delete_everything_btn' => 'Delete everything',
    'settings.reset.invalid_confirm' => 'Confirmation failed. Type RESET to proceed.',
    'settings.reset.invalid_confirm_all' => 'Confirmation failed. Type DELETE ALL to proceed.',
    'settings.reset.no_selection' => 'Select at least one property.',
    'settings.reset.props_done' => 'Selected properties were reset.',
    'settings.reset.failed' => 'Reset failed: :message',
    'settings.reset.jobs_running' => 'A sync is currently running for one or more selected properties. Cancellation was requested — please retry the reset in a moment.',
    'settings.diagnostics.item_error' => 'Error',

    'settings.google.page_title' => 'Google credentials',
    'settings.google.heading' => 'Google',
    'settings.google.title' => 'GSC connection',
    'settings.google.subtitle' => 'Provide OAuth credentials to enable Google authentication in the next milestone.',
    'settings.google.open' => 'Open Google settings',
    'settings.google.save' => 'Save credentials',
    'settings.google.client_id' => 'Client ID',
    'settings.google.client_secret' => 'Client Secret',
    'settings.google.manual.title' => 'Manual input',
    'settings.google.manual.subtitle' => 'Paste Client ID and Client Secret from your Google Cloud OAuth app.',
    'settings.google.json.title' => 'OAuth JSON',
    'settings.google.json.subtitle' => 'Upload the OAuth credentials JSON, or paste its contents below.',
    'settings.google.json.upload' => 'Upload JSON file',
    'settings.google.json.paste' => 'Paste JSON',
    'settings.google.note_plaintext' => 'Credentials are stored encrypted at rest.',

    'settings.google.diagnostics.title' => 'Diagnostics (pre-OAuth)',
    'settings.google.diagnostics.subtitle' => 'Run checks before starting the OAuth connection flow.',
    'settings.google.diagnostics.run' => 'Check configuration',
    'settings.google.diagnostics.last_run' => 'Last run:',
    'settings.google.diagnostics.redirect_uri' => 'Expected redirect URI:',

    'settings.google.diag.app_url.label' => 'Application URL (app.url)',
    'settings.google.diag.app_url.ok' => 'Valid URL detected.',
    'settings.google.diag.app_url.fail' => 'Set a valid https:// URL in config/local.php (app.url).',
    'settings.google.diag.https.label' => 'HTTPS',
    'settings.google.diag.https.ok' => 'HTTPS scheme detected.',
    'settings.google.diag.https.fail' => 'OAuth requires HTTPS. Use https:// in app.url and enable SSL on the domain.',
    'settings.google.diag.base_path.label' => 'Base path (app.base_path)',
    'settings.google.diag.base_path.ok' => 'Base path format looks OK.',
    'settings.google.diag.base_path.fail' => 'Use empty or a subdirectory path without trailing slash (e.g. /seoscope).',
    'settings.google.diag.ext_openssl.label' => 'PHP extension: OpenSSL',
    'settings.google.diag.ext_openssl.ok' => 'OpenSSL is available.',
    'settings.google.diag.ext_openssl.fail' => 'Enable the OpenSSL extension in PHP to support encryption and OAuth.',
    'settings.google.diag.ext_curl.label' => 'PHP extension: cURL',
    'settings.google.diag.ext_curl.ok' => 'cURL is available.',
    'settings.google.diag.ext_curl.fail' => 'Enable cURL to allow Google API requests.',
    'settings.google.diag.app_key.label' => 'Application key (app.key)',
    'settings.google.diag.app_key.ok' => 'Application key is present.',
    'settings.google.diag.app_key.fail' => 'Missing app.key. Re-run installer or ensure config/local.php contains app.key.',
    'settings.google.diag.storage.label' => 'Writable storage directories',
    'settings.google.diag.storage.ok' => 'Storage directories are writable.',
    'settings.google.diag.storage.fail' => 'Ensure storage/* directories exist and are writable by PHP.',
    'settings.google.diag.storage.unknown' => 'Cannot resolve SEOSCOPE_ROOT to verify storage paths.',
    'settings.google.diag.db.label' => 'Database settings table',
    'settings.google.diag.db.ok' => 'Settings table is accessible.',
    'settings.google.diag.db.fail' => 'Settings table not accessible. Verify database credentials and migrations.',
    'settings.google.diag.creds.label' => 'Google credentials saved',
    'settings.google.diag.creds.ok' => 'Credentials appear to be saved.',
    'settings.google.diag.creds.fail' => 'Save Client ID + Client Secret, or upload the OAuth JSON file first.',

    'settings.google.oauth.title' => 'Connect Google',
    'settings.google.oauth.subtitle' => 'Start the OAuth connection flow and store tokens securely.',
    'settings.google.oauth.connect' => 'Connect Google',
    'settings.google.oauth.status_connected' => 'Connected',
    'settings.google.oauth.status_reconnect' => 'Reconnect required',
    'settings.google.oauth.note' => 'You will be redirected to Google to grant access. Tokens are stored encrypted at rest.',
    'settings.google.oauth.missing_creds' => 'Save Client ID and Client Secret before connecting.',
    'settings.google.oauth.bad_state' => 'Invalid OAuth state. Please try connecting again.',
    'settings.google.oauth.denied' => 'OAuth was cancelled or denied (:error).',
    'settings.google.oauth.missing_code' => 'OAuth callback did not include an authorization code.',
    'settings.google.oauth.token_failed' => 'Token exchange failed: :message',
    'settings.google.oauth.connected' => 'Google account connected.',
    'settings.google.oauth.refresh_now' => 'Refresh token',
    'settings.google.oauth.reconnect' => 'Reconnect',
    'settings.google.oauth.refreshed' => 'Token refreshed.',
    'settings.google.oauth.refresh_failed' => 'Token refresh failed: :message',
    'settings.google.oauth.reconnect_required' => 'Your Google connection needs to be reconnected (refresh token revoked/expired).',
    'settings.google.oauth.last_error' => 'Last token error: ',
    'settings.google.oauth.disconnect' => 'Disconnect',
    'settings.google.oauth.disconnected' => 'Google account disconnected.',

    'settings.google.props.title' => 'Properties (GSC sites)',
    'settings.google.props.subtitle' => 'Fetch the list of accessible properties from Google Search Console.',
    'settings.google.props.fetch' => 'Fetch properties',
    'settings.google.props.empty' => 'No properties fetched yet.',
    'settings.google.props.fetched' => 'Fetched :count properties.',
    'settings.google.props.fetch_failed' => 'Failed to fetch properties: :message',
    'settings.google.props.col_site' => 'Property',
    'settings.google.props.col_type' => 'Type',
    'settings.google.props.col_perm' => 'Permission',
    'settings.google.props.col_enabled' => 'Enabled',
    'settings.google.props.col_fetched' => 'Fetched at',
    'settings.google.props.col_sync' => 'Sync status',
    'settings.google.props.enable' => 'Enable',
    'settings.google.props.disable' => 'Disable',
    'settings.google.props.enable_hint' => 'Enable this property and download the last 28 days.',
    'settings.google.props.enabled_badge' => 'Enabled',
    'settings.google.props.disabled_badge' => 'Disabled',
    'settings.google.props.enabled' => 'Property enabled.',
    'settings.google.props.disabled' => 'Property disabled.',
    'settings.google.props.sync_ok_badge' => 'Synced',
    'settings.google.props.sync_error_badge' => 'Error',
    'settings.google.props.sync_none_badge' => 'Not synced',
    'settings.google.props.enable_blocked_hint' => 'Insufficient permission (siteUnverifiedUser).',
    'settings.google.props.enable_blocked_unverified' => 'Cannot enable this property: insufficient permission (siteUnverifiedUser).',

    'settings.google.sync.title' => 'Sync configuration',
    'settings.google.sync.subtitle' => 'Define the default date range and paging limits for upcoming sync jobs.',
    'settings.google.sync.mode' => 'Date range mode',
    'settings.google.sync.mode_last_30' => 'Last 30 days',
    'settings.google.sync.mode_last_3' => 'Last 3 months',
    'settings.google.sync.mode_last_12' => 'Last 12 months',
    'settings.google.sync.mode_last_16' => 'Up to 16 months (recommended)',
    'settings.google.sync.row_limit' => 'Row limit per request',
    'settings.google.sync.row_limit_help' => 'Max 25000 (Google API limit). Lower values reduce memory usage.',
    // settings.google.sync.enable_breakdowns* removed: device/country filters not exposed; home widgets use property-level aggregates.
    'settings.google.quickwin.title' => 'Quick Win thresholds',
    'settings.google.quickwin.subtitle' => 'Defaults used by the Quick Win report tabs. You can tune these anytime.',
    'settings.google.quickwin.iqqi_min_impr' => 'IQQI: min impressions',
    'settings.google.quickwin.iqqi_pos_min' => 'IQQI: min position',
    'settings.google.quickwin.iqqi_pos_max' => 'IQQI: max position',
    'settings.google.quickwin.ctr_min_impr' => 'CTR Opportunity: min impressions',
    'settings.google.quickwin.lowctr_pages_min_impr' => 'Low CTR Pages: min impressions',
    'settings.google.quickwin.lowctr_coeff' => 'Low CTR Pages: CTR coeff',
    'settings.google.quickwin.lowctr_coeff_help' => 'A page is flagged when CTR is below (expected CTR × coeff).',
    'settings.google.quickwin.topical_min_impr' => 'Topical Gaps: min impressions',
    'settings.google.quickwin.topical_pos_min' => 'Topical Gaps: min position',
    'settings.google.quickwin.topical_max_clicks' => 'Topical Gaps: max clicks',
    'settings.google.quickwin.save' => 'Save thresholds',
    'settings.google.quickwin.saved' => 'Quick Win thresholds saved.',
    'settings.google.sync.save' => 'Save sync settings',
    'settings.google.sync.saved' => 'Sync settings saved.',
    'settings.google.sync.error_row_limit' => 'Row limit must be between 1 and 25000.',
    'settings.google.sync.safety_title' => 'Sync safety',
    'settings.google.sync.safety_subtitle' => 'Reduce API load by adding a small delay between days.',
    'settings.google.sync.sleep_ms' => 'Delay between days (ms)',
    'settings.google.sync.sleep_ms_help' => 'Default: 100 ms. Use 0 for no delay. Many hosts find 100–300 ms safest for large backfills.',
    'settings.google.sync.safety_saved' => 'Sync safety settings saved.',

    'settings.google.sync.run_title' => 'Run sync (manual test)',
    'settings.google.sync.run_subtitle' => 'Fetch daily query/page data for enabled properties and store it locally.',
    'settings.google.sync.run_now' => 'Run sync now',
    'settings.google.sync.run_ok' => 'Sync completed.',
    'settings.google.sync.run_ok_partial' => 'Sync completed with :count properties in error. Disable them or fix permissions.',
    'settings.google.sync.run_failed' => 'Sync failed: :message',
    'settings.google.sync.last_summary' => 'Last run:',
    'settings.google.sync.run_note' => 'To avoid timeouts on shared hosting, each run processes up to 7 days per enabled property. Run again to continue.',
    'settings.google.sync.logs_view_in_diagnostics' => 'View sync run history in Diagnostics',

    'settings.google.sync.logs_title' => 'Sync logs',
    'settings.google.sync.logs_subtitle' => 'History of sync runs and per-property results (no secrets).',
    'settings.google.sync.logs_empty' => 'No sync runs yet.',
    'settings.google.sync.logs_col_started' => 'Started',
    'settings.google.sync.logs_col_status' => 'Status',
    'settings.google.sync.logs_col_range' => 'Range',
    'settings.google.sync.logs_col_summary' => 'Summary',
    'settings.google.sync.logs_items_title' => 'Per-property results (recent)',
    'settings.google.sync.logs_item_col_site' => 'Property',
    'settings.google.sync.logs_item_col_range' => 'Range',
    'settings.google.sync.logs_item_col_status' => 'Status',
    'settings.google.sync.logs_item_col_counts' => 'Counts',

    'tracked_cat.panel_title' => 'Tracked categories',
    'tracked_cat.panel_hint' => 'Categories apply to both tracked keywords and tracked pages for this property.',
    'tracked_cat.filter_label' => 'Category filter',
    'tracked_cat.filter_all' => 'All',
    'tracked_cat.filter_none' => 'Uncategorized',
    'tracked_cat.col_category' => 'Category',
    'tracked_cat.uncategorized' => 'Uncategorized',
    'tracked_cat.create_placeholder' => 'New category name…',
    'tracked_cat.create_submit' => 'Add category',
    'tracked_cat.delete_label' => 'Delete',
    'tracked_cat.btn_edit' => 'Edit',
    'tracked_cat.btn_save' => 'Save',
    'tracked_cat.btn_cancel' => 'Cancel',
    'tracked_cat.rename_ok' => 'Category renamed.',
    'tracked_cat.rename_unchanged' => 'No changes to save.',
    'tracked_cat.rename_invalid' => 'Enter a valid category name.',
    'tracked_cat.rename_not_found' => 'Category not found.',
    'tracked_cat.rename_duplicate' => 'A category with this name already exists.',
    'tracked_cat.rename_aria' => 'Category name',
    'tracked_cat.delete_submit' => 'Delete',
    'tracked_cat.delete_confirm' => 'Remove this category? Tracked items will become uncategorized.',
    'tracked_cat.assign_placeholder' => 'Assign…',
    'tracked_cat.property_error' => 'You do not have access to this property.',
    'tracked_cat.create_ok' => 'Category created.',
    'tracked_cat.create_invalid' => 'Enter a valid category name.',
    'tracked_cat.create_duplicate' => 'A category with this name already exists.',
    'tracked_cat.create_at_limit' => 'You can create at most :max categories per property.',
    'tracked_cat.delete_ok' => 'Category deleted.',
    'tracked_cat.delete_invalid' => 'Choose a category to delete.',
    'tracked_cat.delete_not_found' => 'Category not found.',
    'tracked_cat.delete_error' => 'Could not delete the category.',
    'tracked_cat.assign_ok' => 'Category updated.',
    'tracked_cat.assign_error' => 'Could not update the category.',
    'tracked_cat.assign_invalid_query' => 'Invalid query.',
    'tracked_cat.assign_invalid_page' => 'Invalid page URL.',
    'tracked_cat.assign_not_tracked' => 'That query is not in your tracked list.',
    'tracked_cat.assign_not_tracked_page' => 'That page is not in your tracked list.',
    'tracked_cat.assign_invalid_category' => 'Invalid category.',

    'keywords.page_title' => 'Keywords',
    'keywords.heading' => 'Keywords',
    'keywords.title' => 'Keywords',
    'keywords.subtitle' => 'Top queries for :start → :end.',
    'keywords.active_property' => 'Property:',
    'keywords.no_property' => 'Enable a property in Settings → Google to see keywords.',
    'keywords.empty' => 'No keyword data yet. Run sync to fetch Search Console data.',
    'keywords.col_query' => 'Query',
    'keywords.col_clicks' => 'Clicks',
    'keywords.col_impressions' => 'Impressions',
    'keywords.col_ctr' => 'CTR',
    'keywords.col_position' => 'Position',
    'keywords.pages_for_query' => 'Pages for this query',
    'keywords.pages_loading' => 'Loading…',
    'keywords.pages_empty' => 'No page data for this query in the selected range.',
    'keywords.pages_failed' => 'Failed to load pages. Try again.',
    'keywords.pages_col_page' => 'Page',
    'keywords.col_delta_clicks' => 'Δ Clicks',
    'keywords.col_delta_impr' => 'Δ Impr.',
    'keywords.col_delta_ctr' => 'Δ CTR',
    'keywords.col_delta_pos' => 'Δ Pos.',
    'keywords.prev' => 'Prev',
    'keywords.next' => 'Next',
    'keywords.page_x_of_y' => 'Page :x of :y',
    'keywords.filter_search' => 'Search',
    'keywords.filter_search_ph' => 'Filter queries…',
    'keywords.filter_range' => 'Range',
    'keywords.filter_start' => 'Start',
    'keywords.filter_end' => 'End',
    'keywords.filter_per_page' => 'Rows',
    'keywords.range_28d' => 'Last 28 days',
    'keywords.range_7d' => 'Last 7 days',
    'keywords.range_custom' => 'Custom',
    'keywords.compare' => 'Compare to previous period',
    'keywords.prev_range' => 'Previous: :start → :end',
    'keywords.apply' => 'Apply',
    'keywords.reset' => 'Reset',
    'keywords.show_label' => 'Show:',
    'keywords.show_all' => 'All',
    'keywords.show_tracked' => 'Tracked',
    'keywords.tracked_empty_none' => 'You have not tracked any queries yet. Switch to All to pick queries from your data.',
    'keywords.tracked_empty_range' => 'No data for your tracked queries in this range or with the current filters. Try another date range or clear the search filter.',
    'keywords.col_track_actions' => 'Tracking',
    'keywords.track_aria_add' => 'Track this query',
    'keywords.track_aria_tracked' => 'Already tracked',
    'keywords.untrack_aria_remove' => 'Remove from tracked',
    'keywords.track_added' => 'Query added to tracked.',
    'keywords.track_added_with_category' => 'Query added to tracked with the selected category.',
    'keywords.track_added_category_invalid' => 'Query added to tracked, but the selected category could not be applied.',
    'keywords.track_added_category_failed' => 'Query was added to tracked, but assigning the category failed. You can set it from the Tracked view.',
    'keywords.track_category_aria' => 'Category (optional) when adding to tracked',
    'keywords.track_duplicate' => 'This query is already tracked.',
    'keywords.track_invalid' => 'This query cannot be tracked.',
    'keywords.track_property_error' => 'You do not have access to this property.',
    'keywords.untrack_removed' => 'Query removed from tracked.',
    'keywords.untrack_not_found' => 'That tracked query was not found.',
    'keywords.untrack_invalid' => 'Invalid query.',
    'keywords.track_limit_reached' => 'You are already tracking the maximum of :max queries for this property.',
    'keywords.track_limit_hint' => 'Tracking list is full (:max queries). Remove some from Tracked to add more.',
    'keywords.track_limit_banner' => 'You are tracking the maximum of :max queries for this property. Remove entries from Tracked to add new ones.',

    'pages.page_title' => 'Pages',
    'pages.heading' => 'Pages',
    'pages.title' => 'Pages',
    'pages.subtitle' => 'Top pages for :start → :end.',
    'pages.active_property' => 'Property:',
    'pages.no_property' => 'Enable a property in Settings → Google to see pages.',
    'pages.empty' => 'No page data yet. Run sync to fetch Search Console data.',
    'pages.show_label' => 'Show:',
    'pages.show_all' => 'All',
    'pages.show_tracked' => 'Tracked',
    'pages.tracked_empty_none' => 'You are not tracking any pages yet. Switch to All to browse URLs.',
    'pages.tracked_empty_range' => 'No tracked pages have data in this range. Try a different range or add more URLs to Tracked.',
    'pages.col_track_actions' => 'Tracking',
    'pages.track_aria_add' => 'Track this page URL',
    'pages.track_aria_tracked' => 'Already tracked',
    'pages.untrack_aria_remove' => 'Remove from tracked',
    'pages.track_added' => 'Page URL added to tracked.',
    'pages.track_added_with_category' => 'Page URL added to tracked with the selected category.',
    'pages.track_added_category_invalid' => 'Page URL added to tracked, but the selected category could not be applied.',
    'pages.track_added_category_failed' => 'The page was added to tracked, but assigning the category failed. You can set it from the Tracked view.',
    'pages.track_category_aria' => 'Category (optional) when adding to tracked',
    'pages.track_duplicate' => 'This page URL is already tracked.',
    'pages.track_invalid' => 'This page URL cannot be tracked.',
    'pages.track_property_error' => 'You do not have access to this property.',
    'pages.untrack_removed' => 'Page URL removed from tracked.',
    'pages.untrack_not_found' => 'That tracked page URL was not found.',
    'pages.untrack_invalid' => 'Invalid page URL.',
    'pages.track_limit_reached' => 'You are already tracking the maximum of :max page URLs for this property.',
    'pages.track_limit_hint' => 'Tracking list is full (:max URLs). Remove some from Tracked to add more.',
    'pages.track_limit_banner' => 'You are tracking the maximum of :max page URLs for this property. Remove entries from Tracked to add new ones.',
    'pages.col_page' => 'Page',
    'pages.col_clicks' => 'Clicks',
    'pages.col_impressions' => 'Impressions',
    'pages.col_ctr' => 'CTR',
    'pages.col_position' => 'Position',
    'pages.keywords_for_page' => 'Keywords for this page',
    'pages.rows_per_page' => 'Rows per page:',
    'pages.keywords_loading' => 'Loading…',
    'pages.keywords_empty' => 'No keyword data for this page in the selected range.',
    'pages.keywords_failed' => 'Failed to load keywords. Try again.',
    'pages.keywords_col_query' => 'Query',
    'pages.col_delta_clicks' => 'Δ Clicks',
    'pages.col_delta_impr' => 'Δ Impr.',
    'pages.col_delta_ctr' => 'Δ CTR',
    'pages.col_delta_pos' => 'Δ Pos.',
    'pages.prev' => 'Prev',
    'pages.next' => 'Next',
    'pages.page_x_of_y' => 'Page :x of :y',
    'pages.filter_search' => 'Search',
    'pages.filter_search_ph' => 'Filter pages…',
    'pages.filter_range' => 'Range',
    'pages.filter_start' => 'Start',
    'pages.filter_end' => 'End',
    'pages.filter_per_page' => 'Rows',
    'pages.range_28d' => 'Last 28 days',
    'pages.range_7d' => 'Last 7 days',
    'pages.range_custom' => 'Custom',
    'pages.compare' => 'Compare to previous period',
    'pages.prev_range' => 'Previous: :start → :end',
    'pages.apply' => 'Apply',
    'pages.reset' => 'Reset',

    'opportunities.page_title' => 'Opportunities',
    'opportunities.heading' => 'Quick Win',
    'opportunities.title' => 'Quick Win',
    'opportunities.subtitle' => 'Potential wins flagged by rules for :start → :end.',
    'quickwin.tab_desc.iqqi' => 'Near-top queries (positions close to the first results) where your CTR is below the expected value for that position.',
    'quickwin.iqqi_meaning' => 'IQQI (Impressions × Query Quality Index):',
    'quickwin.tab_desc.ctr_opportunity' => 'Queries with a positive CTR gap: your CTR is below the expected CTR for the current average position.',
    'quickwin.ctr_opportunity_meaning' => 'CTR Opportunity:',
    'quickwin.tab_desc.low_ctr_pages' => 'Pages that get many impressions but underperform in CTR compared to the expected CTR for their position.',
    'quickwin.low_ctr_pages_meaning' => 'Low CTR Pages:',
    'quickwin.tab_desc.topical_gaps' => 'High-impression queries that rank low and get few clicks — candidates for new content or stronger topical coverage.',
    'quickwin.topical_gaps_meaning' => 'Topical Gaps:',
    'quickwin.suggested_action' => 'Suggested action:',
    'quickwin.tab_action.iqqi' => 'Pick a query close to the top results and improve the snippet/intent match (title + meta description + on-page) to lift CTR and move into top positions.',
    'quickwin.tab_action.ctr_opportunity' => 'Prioritize the biggest CTR gaps: update title/meta, align content to intent, and test richer SERP snippets to capture more clicks.',
    'quickwin.tab_action.low_ctr_pages' => 'Open the page, compare it to competing results, and improve the snippet + above-the-fold content; then validate via the Page → Queries drilldown.',
    'quickwin.tab_action.topical_gaps' => 'Create a dedicated page or expand existing topical clusters; strengthen internal links so the query can rank higher.',
    'opportunities.active_property' => 'Property:',
    'opportunities.no_property' => 'Enable a property in Settings → Google to see opportunities.',
    'opportunities.empty' => 'No opportunities found for this range yet. Run sync or broaden the date range.',
    'opportunities.col_query' => 'Query',
    'opportunities.col_score' => 'Impact',
    'opportunities.col_impressions' => 'Impressions',
    'opportunities.col_ctr' => 'CTR',
    'opportunities.col_position' => 'Position',
    'opportunities.col_clicks' => 'Clicks',
    'opportunities.col_why' => 'Why',
    'opportunities.rule_low_ctr' => 'Low CTR',
    'opportunities.rule_near_top' => 'Near top',
    'opportunities.prev' => 'Prev',
    'opportunities.next' => 'Next',
    'opportunities.page_x_of_y' => 'Page :x of :y',

    'decay.page_title' => 'Decay',
    'decay.heading' => 'Decay',
    'decay.title' => 'Decay',
    'decay.subtitle' => 'Drops detected for :start → :end.',
    'decay.prev_range' => 'Previous: :start → :end',
    'decay.active_property' => 'Property:',
    'decay.no_property' => 'Enable a property in Settings → Google to see decay.',
    'decay.empty' => 'No decay detected for this range. Run sync or broaden the date range.',
    'decay.col_query' => 'Query',
    'decay.col_delta_clicks' => 'Δ Clicks',
    'decay.col_delta_impr' => 'Δ Impr.',
    'decay.col_delta_pos' => 'Δ Pos.',
    'decay.col_clicks' => 'Clicks',
    'decay.col_impressions' => 'Impressions',
    'decay.col_ctr' => 'CTR',
    'decay.col_position' => 'Position',
    'decay.col_why' => 'Why',
    'decay.why_clicks' => 'Clicks down',
    'decay.why_impr' => 'Impr. down',
    'decay.why_pos' => 'Position worse',
    'decay.prev' => 'Prev',
    'decay.next' => 'Next',
    'decay.page_x_of_y' => 'Page :x of :y',

    'cannibalization.page_title' => 'Cannibalization',
    'cannibalization.heading' => 'Cannibalization',
    'cannibalization.title' => 'Cannibalization',
    'cannibalization.subtitle' => 'Queries with multiple competing URLs for :start → :end.',
    'cannibalization.active_property' => 'Property:',
    'cannibalization.min_impressions' => 'Min impressions',
    'cannibalization.min_urls' => 'Min URLs',
    'cannibalization.no_property' => 'Enable a property in Settings → Google to see cannibalization.',
    'cannibalization.empty' => 'No cannibalization detected for this range. Run sync or broaden the date range.',
    'cannibalization.filters_hint' => 'Filters: min impressions :impr, min URLs :pages.',
    'cannibalization.filters_relax' => 'Try more results',
    'cannibalization.col_query' => 'Query',
    'cannibalization.col_pages' => 'URLs',
    'cannibalization.col_impressions' => 'Impressions',
    'cannibalization.col_clicks' => 'Clicks',
    'cannibalization.col_top_pages' => 'Top URLs (share)',
    'cannibalization.col_position' => 'Position',
    'cannibalization.expand_urls' => 'View URLs',
    'cannibalization.col_suggestion' => 'Suggested action',
    'cannibalization.suggest_many_urls' => 'Many URLs compete. Consider consolidation/canonical and internal linking.',
    'cannibalization.suggest_split_even' => 'Traffic is split across URLs. Pick a primary page and consolidate signals.',
    'cannibalization.suggest_split_some' => 'Some competition. Strengthen the primary page and clarify intent.',
    'cannibalization.suggest_dominant' => 'One URL dominates. Monitor and avoid creating near-duplicates.',
    'cannibalization.suggest_default' => 'Review competing URLs and align to one intent.',
    'cannibalization.prev' => 'Prev',
    'cannibalization.next' => 'Next',
    'cannibalization.page_x_of_y' => 'Page :x of :y',
];
