<?php

return [
    'nav' => [
        'dashboard' => 'Dashboard',
        'analytics' => 'Analytics',
        'tasks' => 'Tasks',
        'distribution' => 'Distribution',
        'articles' => 'Articles',
        'materials' => 'Materials',
        'ai_config' => 'AI Configurator',
        'site_settings' => 'Site Settings',
        'security' => 'Sensitive Words',
        'admin_users' => 'User Management',
        'back_home' => 'Back to Dashboard',
        'system_settings' => 'System Settings',
        'admin_management' => 'User Management',
        'activity_logs' => 'Activity Logs',
        'api_tokens' => 'API Tokens',
    ],
    'header' => [
        'welcome' => 'Welcome, :name',
        'super_admin' => 'Super Admin',
        'admin' => 'Admin',
        'language' => 'Language',
        'language_switch_label' => 'Interface',
        'language_switch_hint' => '中文 / English',
        'language_switch_to' => 'Switch interface to :language',
        'notifications' => [
            'label' => 'Notifications',
            'title' => 'Notifications',
            'badge_new' => 'Update',
            'update_available' => 'New version v:version available',
            'update_desc' => 'A newer GEOFlow release is available on GitHub. Review the changelog and back up your database and uploads before upgrading.',
            'up_to_date' => 'GEOFlow is up to date',
            'no_update_desc' => 'No newer GitHub version was detected.',
            'disabled' => 'Update checks are disabled',
            'disabled_desc' => 'GitHub version checks are disabled. Enable GEOFLOW_UPDATE_CHECK_ENABLED if you want reminders.',
            'unavailable' => 'Update status unavailable',
            'unavailable_desc' => 'GitHub release metadata could not be loaded. GEOFlow will keep trying with the daily cache policy.',
            'current_version' => 'Current version: v:version',
            'latest_version' => 'Latest version: v:version',
            'daily_check' => 'GitHub is checked at most once per day.',
            'checked_at' => 'Last checked: :time',
            'view_changelog' => 'View changelog',
            'open_github' => 'Open GitHub',
        ],
    ],
    'button' => [
        'create' => 'Create',
        'save' => 'Save',
        'cancel' => 'Cancel',
        'edit' => 'Edit',
        'delete' => 'Delete',
        'search' => 'Search',
        'clear' => 'Clear',
        'view' => 'View',
        'apply' => 'Apply',
        'jump' => 'Go',
        'execute' => 'Run',
        'run' => 'Start',
        'pause' => 'Pause',
        'review_center' => 'Review Center',
        'trash' => 'Trash',
        'bulk_actions' => 'Bulk Actions',
        'create_task' => 'Create Task',
        'create_article' => 'Create Article',
        'run_all_tasks' => 'Start All Tasks',
        'category_manage' => 'Categories',
        'generate_articles' => 'Create Task to Generate Articles',
        'new_task' => 'New Task',
        'logout' => 'Log Out',
        'add' => 'Add',
        'upload' => 'Upload',
        'import' => 'Import',
        'previous' => 'Previous',
        'next' => 'Next',
        'refresh' => 'Refresh',
        'filter' => 'Filter',
        'reset' => 'Reset',
        'close_panel' => 'Close Panel',
        'chunks' => 'Chunks',
    ],
    'flash' => [
        'success' => 'Success',
        'error' => 'Error',
    ],
    'message' => [
        'csrf_failed' => 'CSRF validation failed',
        'processing' => 'Processing...',
        'copied' => 'Copied to clipboard',
        'csrf_invalid' => 'CSRF validation failed',
        'success' => 'Success',
        'error' => 'Error',
    ],
    'common' => [
        'seconds' => 's',
        'minutes' => 'm',
        'hours' => 'h',
        'days' => 'd',
        'articles_unit' => '',
        'close' => 'Close',
        'created_at' => 'Created At',
        'updated_at' => 'Last Updated',
        'total' => 'Total',
        'description' => 'Description',
        'name' => 'Name',
        'type' => 'Type',
        'usage' => 'Usage',
        'actions' => 'Actions',
        'none' => 'No data',
        'back' => 'Back',
        'total_count' => 'Total',
        'avg_per_library' => 'Average per library',
        'search_placeholder_keyword' => 'Search keywords...',
        'none_desc' => 'No description',
        'word_count' => 'Word Count',
        'file_type' => 'File Type',
        'file_path' => 'File Path',
        'basic_info' => 'Basic Information',
        'related_tasks' => 'Related Tasks',
        'content' => 'Content',
        'current_word_count' => 'Current length: :count chars',
        'total_records' => ':count total',
        'not_found' => 'Record not found or has been deleted',
        'not_found_title' => 'Information Not Found',
        'not_found_desc' => 'The content you requested does not exist, was removed, or the link is no longer valid.',
    ],
    'footer' => [
        'copyright' => '© 2026 GEOFlow',
        'version' => 'Version :version',
        'author' => 'Author: Yao Jingang',
        'author_x_profile' => 'Author X Profile',
        'project_github_link' => 'Project GitHub',
        'changelog_link' => 'Changelog',
        'project_intro_link' => 'Project intro',
    ],
    'login' => [
        'title' => 'Admin Login',
        'subtitle' => ':site_name Admin Console',
        'username' => 'Username',
        'password' => 'Password',
        'username_placeholder' => 'Enter username',
        'password_placeholder' => 'Enter password',
        'submit' => 'Sign In',
        'submitting' => 'Signing in...',
        'remember_30_days' => 'Keep me signed in for 30 days',
        'remember_30_days_hint' => 'For trusted devices',
        'language_label' => 'Interface Language',
        'language_hint' => 'Choose a language before signing in. The admin console will continue with this selection after login.',
        'language_switch_to' => 'Switch interface to :language',
        'back_home' => 'Back to Home',
        'error' => [
            'invalid_request' => 'Invalid request',
            'empty_credentials' => 'Please enter both username and password',
            'invalid_credentials' => 'Invalid username or password, or the account is disabled',
            'account_locked' => 'This account has been locked. Please contact an administrator to unlock it.',
        ],
        'success' => [
            'password_updated' => 'Password updated. Please sign in again with the new password.',
        ],
    ],
    'tasks' => [
        'page_title' => 'Task Management',
        'page_subtitle' => 'Manage AI content generation tasks',
        'list_title' => 'Task List',
        'empty_title' => 'No tasks yet',
        'empty_desc' => 'Create your first AI content generation task',
        'column' => [
            'name' => 'Task Name',
            'created_at' => 'Created At',
            'model' => 'AI Model',
            'article_stats' => 'Article Stats',
            'loop_count' => 'Loop / Publish',
            'status' => 'Status',
            'actions' => 'Actions',
        ],
        'label' => [
            'title_library' => 'Title Library',
            'created_articles' => 'Created: :count',
            'created_of_limit' => 'Created: :created / :limit',
            'draft_articles' => 'Drafts: :count',
            'published_articles' => 'Published: :count',
            'success_fail' => 'Success: :success Failed: :fail',
            'loop_times' => ':count times',
            'loop' => 'Loop',
            'pending_running' => 'Pending :pending · Running :running',
            'estimated' => 'ETA :time',
            'pending_queue' => 'Queued · :count',
            'next_run_at' => 'Next run: :time',
            'publish_interval_minutes' => 'Publish every :count min',
            'retrying_with_attempts' => 'Retrying :current/:max',
            'latest_reason' => 'Latest reason: :message',
        ],
        'status' => [
            'running' => 'Running',
            'paused' => 'Paused',
            'enabled' => 'Enabled',
            'disabled' => 'Paused',
            'pending' => 'Queued',
            'waiting' => 'Enabled, waiting for next run',
            'waiting_publish' => 'Waiting for publish interval',
            'draft_pool_full' => 'Draft Pool Full',
            'limit_reached' => 'Total Article Limit Reached',
            'retrying' => 'Retrying',
            'completed' => 'Run Completed',
            'failed' => 'Execution Failed',
        ],
        'mode' => [
            'fixed' => 'Fixed',
            'smart_failover' => 'Smart Failover',
        ],
        'action' => [
            'settings' => 'Task Settings',
            'articles' => 'Manage Articles',
            'delete' => 'Delete Task',
            'start_batch' => 'Start Generation',
            'stop_batch' => 'Stop and Pause Task',
            'paused' => 'Task Paused',
            'starting' => 'Starting',
            'stopping' => 'Stopping',
            'activating' => 'Activating...',
            'pausing' => 'Pausing...',
        ],
        'confirm' => [
            'delete' => 'Delete this task? Related articles will be moved to trash.',
            'run_all' => 'Run all tasks now?',
            'start' => 'Start task ":name"?\\n\\nIt will be queued immediately and continue according to the total article limit, draft pool limit, and publish interval.',
            'stop' => 'Stop and pause task ":name"?\\n\\nPending jobs will be canceled, running jobs will exit after the current round, and future automatic scheduling will be paused.',
            'activate' => 'Activate this task?',
            'pause' => 'Pause this task?',
        ],
        'message' => [
            'paused_stopped' => 'Task paused. Running batch execution has been stopped.',
            'activated' => 'Task activated',
            'status_update_failed' => 'Failed to update status',
            'delete_success' => 'Task deleted',
            'delete_failed' => 'Delete failed: :message',
            'query_failed' => 'Database query failed: :message',
            'no_runnable' => 'No active tasks can be queued right now',
            'task_queued' => 'Task ":name" has been queued',
            'task_stopped' => 'Task ":name" has stopped automatic scheduling',
            'start_failed' => 'Start failed: :message',
            'stop_failed' => 'Stop failed: :message',
            'request_failed' => 'Request failed: :message',
            'bulk_submitted' => 'Submitted :success/:total tasks to the queue',
            'bulk_submitted_partial' => 'Batch submission finished. Success :success/:total',
        ],
        'stats' => [
            'total_tasks' => 'Total Tasks',
            'running' => 'Running',
            'enabled' => 'Enabled',
            'total_articles' => 'Total Articles',
            'total_published' => 'Published',
        ],
        'worker' => [
            'title' => 'Worker Status',
            'none' => 'No worker heartbeat yet',
            'current_job' => 'Current Job',
            'idle' => 'Idle',
            'last_seen' => 'Last Seen',
        ],
        'queue' => [
            'title' => 'Queue Overview',
            'pending' => 'Pending',
            'running' => 'Running',
            'failed' => 'Failed',
            'completed' => 'Completed',
        ],
        'jobs' => [
            'recent' => 'Recent Jobs',
            'none' => 'No job records yet',
            'unknown_task' => 'Unknown Task',
            'updated_at' => 'Updated At',
            'task_prefix' => 'Task',
        ],
        'failure' => [
            'empty_content' => 'Empty body blocked',
            'empty_content_detail' => 'The model returned an empty body. The system marked this run as failed and skipped saving.',
            'content_too_short' => 'Body too short',
            'content_too_short_detail' => 'Generated content did not meet the minimum body length and was blocked.',
            'title_exhausted' => 'Title library exhausted',
            'title_exhausted_detail' => 'No more titles are available in the current title library. Add more titles or switch the library.',
            'paused' => 'Task paused',
            'paused_detail' => 'Pending jobs were canceled. This is not a model generation error.',
            'model_timeout' => 'Model timeout',
            'model_timeout_detail' => 'The model did not return within :seconds seconds. The task will continue according to the retry policy.',
            'execution_failed' => 'Execution failed',
            'recent_failed' => 'Recent execution failed',
        ],
    ],
    'articles' => [
        'page_title' => 'Article Management',
        'page_subtitle' => 'View publishing and review states in one place without splitting the workflow.',
        'list_title' => 'Article List',
        'list_total' => '(:count total)',
        'empty_title' => 'No articles',
        'empty_desc' => 'No articles matched the current filters',
        'column' => [
            'id' => 'ID',
            'info' => 'Article Info',
            'task_author' => 'Task / Author',
            'workflow' => 'Workflow',
            'created_at' => 'Created At',
            'actions' => 'Actions',
            'category' => 'Category',
            'author' => 'Author',
        ],
        'stats' => [
            'total' => 'Total',
            'published' => 'Published',
            'draft' => 'Drafts',
            'pending_review' => 'Pending Review',
            'today' => 'Added Today',
        ],
        'badge' => [
            'hot' => 'Hot',
            'featured' => 'Featured',
        ],
        'filters' => [
            'title' => 'Filters and Search',
            'task' => 'Task',
            'status' => 'Publish Status',
            'review_status' => 'Review Status',
            'author' => 'Author',
            'date_from' => 'Start Date',
            'date_to' => 'End Date',
            'search' => 'Search',
            'search_placeholder' => 'Search title or content...',
            'all_tasks' => 'All Tasks',
            'all_status' => 'All Publish Statuses',
            'all_review' => 'All Review Results',
            'all_authors' => 'All Authors',
            'current_task' => 'Showing articles from task ":task" only',
            'clear_task' => 'View all articles',
        ],
        'bulk' => [
            'selected' => ':count articles selected',
            'selected_prefix' => '',
            'selected_suffix' => ' articles selected',
            'select_action' => 'Select Action',
            'update_status' => 'Change Publish Status',
            'update_review' => 'Change Review Result',
            'delete' => 'Delete Articles',
            'status_to' => 'Change Publish Status',
            'review_to' => 'Change Review Result',
        ],
        'keywords' => 'Keywords',
        'ai_generated' => 'AI Generated',
        'publish_prefix' => 'Publish',
        'review_prefix' => 'Review',
        'published_at' => 'Published: :time',
        'pagination' => [
            'summary' => 'Showing :from - :to of :total',
            'pages' => '(Page :page of :total_pages)',
            'per_page' => 'Per page',
            'go_to' => 'Go to',
            'prev' => 'Previous',
            'next' => 'Next',
            'first' => 'First',
            'last' => 'Last',
        ],
        'status' => [
            'published' => 'Published',
            'draft' => 'Draft',
            'private' => 'Private',
        ],
        'review' => [
            'approved' => 'Approved',
            'auto_approved' => 'Auto Approved',
            'rejected' => 'Rejected',
            'pending' => 'Pending Manual Review',
            'title' => 'Article Review',
            'subtitle' => 'Handle pending, approved, auto-approved, and rejected results in one place.',
            'subtitle_flow' => 'Review results automatically converge to the corresponding publish state, so you do not need to maintain two separate flows.',
            'back' => 'Back to Articles',
            'filter_title' => 'Filters',
            'filter_status' => 'Review Result',
            'filter_task' => 'Task',
            'filter_search' => 'Search',
            'list_title' => 'Article List',
            'bulk' => 'Bulk Review',
            'empty_title' => 'No Articles',
            'empty_desc' => 'No articles match the current filters.',
            'apply' => 'Apply Review Result',
            'note_placeholder' => 'Review note (optional)',
            'task_prefix' => 'Task',
            'author_prefix' => 'Author',
            'created_prefix' => 'Created',
            'last_note' => 'Latest review note',
            'view_detail' => 'View Detail',
            'stats_pending' => 'Pending Review',
            'stats_approved' => 'Approved',
            'stats_rejected' => 'Rejected',
            'stats_auto' => 'Auto Approved',
            'selected_prefix' => '',
            'selected_suffix' => ' articles selected',
            'select_result' => 'Select review result',
            'confirm_batch' => 'Are you sure you want to :action the selected :count articles?',
            'prompt_note' => 'Enter a review note (optional):',
            'alert_select_articles' => 'Please select articles to review.',
            'alert_select_result' => 'Please select a review result.',
        ],
        'action' => [
            'approve' => 'Approve',
            'reject' => 'Reject',
            'review' => 'Review',
        ],
        'confirm' => [
            'delete' => 'Delete this article? It will be moved to trash.',
            'delete_title' => 'Confirm deletion',
            'delete_selected' => 'Delete the selected :count articles?',
            'quick_review' => 'Are you sure you want to :action this article?',
        ],
        'message' => [
            'batch_status_updated' => 'Batch update succeeded. Updated :count articles.',
            'batch_status_failed' => 'Batch update failed',
            'batch_status_required' => 'Please select articles and a target status first',
            'batch_review_updated' => 'Batch review result updated. Processed :count articles.',
            'batch_review_failed' => 'Batch review failed',
            'batch_review_required' => 'Please select articles and a review result first',
            'batch_delete_success' => 'Deleted :count articles',
            'batch_delete_failed' => 'Delete failed',
            'batch_delete_required' => 'Please select articles to delete first',
            'delete_failed_refresh' => 'Delete failed. Please refresh and try again.',
            'select_articles' => 'Please select articles to operate on.',
            'select_action' => 'Please select an action.',
            'select_status' => 'Please select the target publish status.',
            'select_review' => 'Please select the target review result.',
            'review_failed_refresh' => 'Review failed. Please refresh and try again.',
        ],
        'trash' => [
            'title' => 'Article Trash',
            'subtitle' => 'Manage deleted articles, restore them, or delete them permanently.',
            'back' => 'Back to Articles',
            'empty' => 'Empty Trash',
            'stats_total' => 'Items in Trash',
            'stats_sensitive' => 'Sensitive-word Deletes',
            'stats_manual' => 'Manual Deletes',
            'all_authors' => 'All Authors',
            'search_placeholder' => 'Search deleted articles...',
            'current_author' => 'Showing trash articles for author ":name" only.',
            'list_title' => 'Deleted Articles',
            'bulk' => 'Bulk Actions',
            'empty_title' => 'Trash Is Empty',
            'empty_desc' => 'No deleted articles were found.',
            'selected_prefix' => '',
            'selected_suffix' => ' articles selected',
            'column' => [
                'info' => 'Article Info',
                'task_author' => 'Task / Author',
                'deleted_at' => 'Deleted At',
                'actions' => 'Actions',
            ],
            'deleted' => 'Deleted',
            'created_prefix' => 'Created',
            'confirm_batch_restore' => 'Restore the selected :count articles?',
            'confirm_batch_delete' => 'Permanently delete the selected :count articles? This cannot be undone.',
            'confirm_restore' => 'Restore this article?',
            'confirm_delete' => 'Permanently delete this article? This cannot be undone.',
            'confirm_empty' => 'Empty the trash? This will permanently delete all trashed articles and cannot be undone.',
            'action_restore' => 'Restore',
            'action_force_delete' => 'Delete permanently',
            'alert_select' => 'Please select articles to operate on.',
            'message' => [
                'restore_success' => 'Restored :count articles successfully',
                'restore_failed' => 'Failed to restore articles',
                'delete_success' => 'Permanently deleted :count articles',
                'delete_failed' => 'Permanent deletion failed: :message',
                'empty_success' => 'Trash emptied successfully. Permanently deleted :count articles',
                'empty_already' => 'The trash is already empty',
                'empty_failed' => 'Failed to empty the trash: :message',
            ],
        ],
        'filter' => [
            'uncategorized' => 'Uncategorized',
        ],
    ],
    'authors' => [
        'page_title' => 'Author Management',
        'page_subtitle' => 'Manage article author information',
        'create' => 'Add Author',
        'stats_total' => 'Total Authors',
        'stats_active' => 'Active Authors',
        'stats_average' => 'Average Articles',
        'search_placeholder' => 'Search author name, email, or bio...',
        'list_title' => 'Author List',
        'empty_title' => 'No Authors',
        'empty_desc' => 'Start by adding author information.',
        'empty_search' => 'No matching authors were found.',
        'article_count' => 'Articles: :count',
        'published_count' => 'Published: :count',
        'trashed_count' => 'Trash: :count',
        'created_prefix' => 'Created: :date',
        'edit' => 'Edit',
        'delete' => 'Delete',
        'modal_create' => 'Add Author',
        'modal_edit' => 'Edit Author',
        'field_name' => 'Name *',
        'field_email' => 'Email',
        'field_bio' => 'Bio',
        'field_website' => 'Website',
        'field_social' => 'Social Links',
        'placeholder_name' => 'Enter author name',
        'placeholder_email' => 'Enter email address',
        'placeholder_bio' => 'Short biography for the author',
        'placeholder_social' => 'Weibo, WeChat, and other social links',
        'save_create' => 'Add Author',
        'save_edit' => 'Save Changes',
        'confirm_delete' => 'Delete author ":name"? If this author has articles, deletion will be blocked.',
        'confirm_delete_trashed' => 'Delete author ":name"? There are still :count trashed articles referencing this author. Please remove or migrate them first.',
        'error' => [
            'name_required' => 'Author name is required',
            'not_found' => 'Author not found',
            'delete_visible' => 'Cannot delete this author because :count active articles still reference it. Please migrate or remove those articles first.',
            'delete_trashed' => 'Cannot delete this author because :count trashed articles still reference it. Please permanently remove or migrate those articles first.',
        ],
        'message' => [
            'create_success' => 'Author created successfully',
            'create_failed' => 'Failed to create author',
            'update_success' => 'Author updated successfully',
            'update_failed' => 'Failed to update author',
            'delete_success' => 'Author deleted successfully',
            'delete_failed' => 'Deletion failed',
        ],
        'action' => [
            'view_articles' => 'View author articles',
            'view_trashed_articles' => 'View trashed articles',
        ],
    ],
    'ai_models' => [
        'page_title' => 'AI Model Configuration',
        'page_subtitle' => 'Manage chat models and embedding retrieval models in one place',
        'create' => 'Add Model',
        'vector_title' => 'Vector Retrieval Status',
        'vector_desc' => 'Knowledge retrieval uses a dedicated embedding model and pgvector',
        'pgvector' => 'pgvector Extension',
        'pgvector_enabled' => 'Enabled',
        'pgvector_fallback' => 'Disabled, currently falling back',
        'default_embedding' => 'Default Embedding Model',
        'embedding_auto' => 'Automatically choose the latest available embedding model',
        'embedding_help' => 'Article generation still uses chat models; this setting is only used for chunk vectorization and retrieval queries.',
        'save_default' => 'Save Default Model',
        'chunking_title' => 'Knowledge Chunking Strategy',
        'chunking_desc' => 'Use structured rule chunking by default, with optional LLM semantic boundary planning',
        'chunk_strategy' => 'Chunking Strategy',
        'chunk_strategy_rule' => 'Structured rule chunking',
        'chunk_strategy_auto' => 'Auto: semantic planning when a model is available, otherwise rule chunking',
        'chunk_strategy_semantic' => 'LLM semantic planning',
        'chunk_strategy_help' => 'The LLM only plans block boundaries. Chunk text is rebuilt from the original content, and failures fall back to structured rules.',
        'chunking_model' => 'Semantic Planning Model',
        'chunking_model_none' => 'Do not use a semantic planning model',
        'chunking_model_help' => 'Choose a low-cost, fast chat model such as Gemini Flash Lite.',
        'save_chunking' => 'Save Chunking Strategy',
        'type_title' => 'Model Type Notes',
        'type_desc' => 'Avoid assigning embedding models to the task center by mistake',
        'type_chat' => 'Chat models are used for article generation, keyword generation, description generation, and AI title generation in the task center.',
        'type_embedding' => 'Embedding models are used for knowledge chunk vectorization and retrieval recall. They support either a base URL or a full embedding endpoint and do not appear in the task-center model dropdown.',
        'type_rerank' => 'Rerank: the admin has not yet wired an independent rerank model configuration and invocation path. It will follow the same provider URL rules later.',
        'type_fallback' => 'Fallback strategy: if pgvector is unavailable or no embedding model is usable, the system falls back to lightweight retrieval without blocking article generation.',
        'list_title' => 'AI Model List',
        'list_desc' => 'Review chat models and embedding models in one place',
        'column' => [
            'info' => 'Model Info',
            'version' => 'Version',
            'usage' => 'Usage',
            'limit' => 'Limit',
            'status' => 'Status',
            'actions' => 'Actions',
        ],
        'empty' => 'No AI models configured yet',
        'add_first' => 'Add the first model',
        'chat' => 'Chat Model',
        'embedding_default' => 'Default Retrieval Model',
        'api_key_mask' => 'Key',
        'usage_tasks' => 'Tasks: :count',
        'usage_articles' => 'Articles: :count',
        'usage_total' => 'Total: :count',
        'limit_today' => 'Today / Limit',
        'limit_unlimited' => 'Unlimited',
        'status_active' => 'Active',
        'status_inactive' => 'Inactive',
        'status_unknown' => 'Unknown',
        'test' => 'Test',
        'testing' => 'Testing...',
        'test_success_prefix' => 'Test passed: ',
        'test_failed_prefix' => 'Test failed: ',
        'test_network_error' => 'Test failed: network request error, please try again later',
        'test_success' => ':type model connection is healthy',
        'test_error_api_url_missing' => 'API URL is empty. Please enter the API Base URL first.',
        'test_error_api_key_missing' => 'API key is empty or cannot be decrypted. Please re-enter the key.',
        'test_error_model_missing' => 'Model ID is empty. Please enter the model ID first.',
        'test_failed_with_status' => 'HTTP :status, response: :message',
        'test_invalid_response' => 'The API returned an unrecognized format. Response preview: :message',
        'test_exception' => 'Request exception: :message',
        'edit' => 'Edit',
        'delete' => 'Delete',
        'modal_create' => 'Add AI Model',
        'modal_edit' => 'Edit AI Model',
        'quick_chat' => 'Quick Fill (Chat Models)',
        'quick_embedding' => 'Quick Fill (Embedding Models)',
        'quick_help' => 'Click to auto-fill common provider settings. Gemini uses the native Google v1beta API; other chat models resolve chat endpoints by provider rules, and embedding models resolve /v1/embeddings or provider-specific /embeddings. Volcengine Ark chat models typically use an inference endpoint ID such as ep-xxxx as the model ID.',
        'gemini_embedding_notice' => 'Gemini Embedding 2 automatically applies retrieval query/document prefixes; this system does not support gemini-embedding-001 task_type configuration.',
        'field_name' => 'Model Name *',
        'field_version' => 'Model Version',
        'field_type' => 'Model Type *',
        'field_model_id' => 'Model ID *',
        'field_api_key' => 'API Key *',
        'field_api_url' => 'API URL (Base URL or Full Endpoint)',
        'field_failover_priority' => 'Failover Priority',
        'field_daily_limit' => 'Daily Call Limit',
        'field_status' => 'Status',
        'type_chat_option' => 'Chat Model',
        'type_embedding_option' => 'Embedding Retrieval Model',
        'type_help' => 'Chat models are used for task-center generation. Embedding models are used for knowledge vectorization and retrieval. Rerank is not yet wired.',
        'placeholder_name' => 'Example: Claude Sonnet 4',
        'placeholder_version' => 'Example: 20250514',
        'placeholder_model_id' => 'Example: claude-sonnet-4-20250514',
        'placeholder_api_key' => 'Enter API key',
        'placeholder_api_key_keep' => 'Leave blank to keep the current API key',
        'placeholder_api_url' => 'Example: https://api.openai.com or https://open.bigmodel.cn/api/paas/v4 or a full .../chat/completions / .../embeddings URL',
        'api_url_help' => 'You can enter either a base URL or a full endpoint URL. Gemini is normalized to https://generativelanguage.googleapis.com/v1beta; other chat models default to /v1/chat/completions, embedding models default to /v1/embeddings, and versioned providers such as Zhipu /api/paas/v4 and Ark /api/v3 automatically resolve the capability-specific path.',
        'limit_help' => '0 means unlimited; values above 0 define the maximum daily call count.',
        'failover_priority_label' => 'Failover priority: :priority',
        'failover_priority_help' => 'Lower numbers are tried first as fallback models. The primary model is always attempted first; failover only starts after it fails.',
        'api_key_help_create' => 'Required when creating a model.',
        'api_key_help_edit' => 'Leave blank while editing to keep the current key. Enter a new value only when rotating credentials.',
        'confirm_delete' => 'Delete model ":name"? This action cannot be undone.',
        'error' => [
            'required_fields' => 'Model name, API key, and model ID are required',
            'invalid_required_fields' => 'Invalid parameters or missing required fields',
            'invalid_id' => 'Invalid model ID',
            'not_found' => 'AI model not found',
            'in_use' => 'Cannot delete this model because :count tasks are still using it',
            'embedding_unavailable' => 'The selected default embedding model is unavailable',
            'chunking_model_unavailable' => 'The selected semantic chunking model is unavailable',
            'chunking_model_required' => 'LLM semantic planning requires an available chat model',
            'crypto_key_missing' => 'APP_KEY is not configured, so API keys cannot be encrypted and saved',
        ],
        'message' => [
            'create_success' => 'AI model created successfully',
            'create_failed' => 'Failed to create AI model',
            'update_success' => 'AI model updated successfully',
            'update_failed' => 'Failed to update AI model',
            'delete_success' => 'AI model deleted successfully',
            'delete_failed' => 'Failed to delete AI model',
            'embedding_default_updated' => 'Default embedding model updated',
            'embedding_default_update_failed' => 'Failed to update the default embedding model',
            'chunking_config_updated' => 'Knowledge chunking strategy updated',
        ],
    ],
    'front' => [
        'nav' => [
            'home' => 'Home',
            'categories' => 'Categories',
            'all_articles' => 'All Articles',
            'admin' => 'Admin',
        ],
        'language' => [
            'label' => 'Language',
        ],
        'home' => [
            'featured_articles' => 'Featured Articles',
            'latest_articles' => 'Latest Articles',
            'featured_badge' => 'Featured',
            'read_more' => 'Read More',
        ],
        'search' => [
            'breadcrumb' => 'Search: :term',
            'empty_title' => 'No matching content found',
            'empty_description' => 'Try a different keyword',
        ],
        'articles' => [
            'empty_title' => 'No articles yet',
            'empty_description' => 'No published articles are available yet',
        ],
        'back_home' => 'Back to Home',
        'back_archive' => 'Back to Archive',
        'archive' => [
            'title' => 'Archive',
            'page_title' => 'Article Archive',
            'page_title_month' => ':period Archive',
            'page_description' => 'Browse all archived articles by time - :site',
            'page_description_month' => 'View all articles published in :period - :site',
            'meta_keywords' => 'article archive,content archive,AI content,GEO content system',
            'overview_description' => 'Browse all articles by time',
            'month_description' => ':count articles published this month',
            'empty_title' => 'No archive entries yet',
            'empty_description' => 'No published articles are available yet',
            'month_empty_description' => 'No published articles are available for this month yet',
            'article_count' => ':count articles',
            'error' => [
                'invalid_date' => 'Invalid date format',
            ],
            'summary' => [
                'type_label' => 'Archive Type',
                'month_type' => 'Monthly Archive Page',
                'overview_type' => 'Archive Overview Page',
                'page_label' => 'Current Page',
            ],
        ],
        'category' => [
            'empty_description' => 'No published content is available in this category yet',
            'error' => [
                'not_found' => 'Category not found',
            ],
            'meta_fallback' => ':name category content',
            'summary' => [
                'name_label' => 'Category Name',
                'count_label' => 'Total Articles',
                'page_label' => 'Current Page',
            ],
        ],
        'article' => [
            'published_on' => 'Published: :date',
            'related_articles' => 'Related Articles',
            'breadcrumb' => 'Breadcrumb',
            'ad_close' => 'Close advertisement',
        ],
    ],
    'legacy' => [
        'title' => 'This page is a legacy / compatibility page',
    ],
    'dashboard' => [
        'page_title' => 'Admin Dashboard',
        'heading' => 'Dashboard',
        'subtitle' => ':site Overview',
        'last_updated' => 'Last updated: :time',
        'refresh' => 'Refresh',
        'total_articles' => 'Total Articles',
        'today_added' => 'Added today: :count',
        'published' => 'Published',
        'publish_rate' => 'Publish rate: :rate%',
        'ai_generated' => 'AI Generated',
        'ai_generated_ratio' => 'Share: :rate%',
        'total_views' => 'Total Views',
        'today_views' => 'Today: :count',
        'active_tasks' => 'Active Tasks',
        'active_tasks_detail' => 'Running :running · Queued :pending',
        'ai_models' => 'AI Models',
        'material_total' => 'Total Materials',
        'pending_review' => 'Pending Review',
        'category_distribution' => 'Category Distribution',
        'manage_categories' => 'Manage Categories',
        'no_data' => 'No data',
        'system_performance' => 'System Performance',
        'task_success_rate' => 'Task Success Rate',
        'avg_generation_time' => 'Avg. Generation Time',
        'daily_ai_quota' => 'Daily AI Quota',
        'latest_articles' => 'Latest Articles',
        'view_all' => 'View All',
        'no_articles' => 'No articles yet',
        'uncategorized' => 'Uncategorized',
        'trend_title' => 'Weekly Trend',
        'week_articles' => 'Articles This Week',
        'week_tasks' => 'Tasks This Week',
        'approved_articles' => 'Approved Articles',
        'article_trend' => 'Article Publishing Trend (Last 7 Days)',
        'task_status' => 'Task Status',
        'task_status_running' => 'Running',
        'task_status_pending' => 'Queued',
        'task_status_idle' => 'Idle',
        'total_stat' => 'Total: :count articles',
        'avg_stat' => 'Daily avg: :count articles',
        'peak_stat' => 'Peak: :count articles',
        'content_funnel' => 'Content Production Funnel',
        'content_funnel_desc' => 'Track the path from assets to drafts, review, publishing, and real views.',
        'funnel_titles' => 'Title Reserve',
        'funnel_drafts' => 'Draft Pool',
        'funnel_pending_review' => 'Pending Review',
        'funnel_published' => 'Published',
        'funnel_viewed' => 'Viewed',
        'todo_title' => 'Needs Attention',
        'todo_empty' => 'No obvious risks right now. Continue the current production rhythm.',
        'todo_failed_jobs' => 'Failed task runs need attention',
        'todo_pending_review' => 'Articles are waiting for review',
        'todo_no_chat_model' => 'No active chat model is configured',
        'todo_no_embedding_model' => 'Knowledge bases exist, but no embedding model is configured',
        'todo_unvectorized_chunks' => 'Knowledge chunks are not fully vectorized',
        'todo_low_titles' => 'Title reserve is low. Add more title libraries',
        'todo_url_import_failed' => 'URL smart import has failed records',
        'task_health' => 'Task Health',
        'task_active' => 'Enabled Tasks',
        'task_paused' => 'Paused Tasks',
        'task_running' => 'Running',
        'task_pending' => 'Queued',
        'recent_failures' => 'Recent Failures',
        'no_failures' => 'No recent task failures.',
        'unknown_task' => 'Unknown task',
        'material_health' => 'Material Asset Health',
        'material_keywords' => 'Keyword Libraries',
        'material_titles' => 'Title Libraries',
        'material_knowledge' => 'Knowledge Bases',
        'material_images' => 'Image Libraries',
        'material_authors' => 'Authors',
        'material_chunks' => 'Knowledge Chunks',
        'material_vectorized' => 'Knowledge Vectorization',
        'ai_health' => 'AI Model Health',
        'ai_chat_models' => 'Chat Models',
        'ai_embedding_models' => 'Embedding Models',
        'ai_used_today' => 'Calls Today',
        'ai_total_calls' => 'Total Calls',
        'url_import_health' => 'URL Smart Import',
        'url_import_total' => 'Total Jobs',
        'url_import_running' => 'Running',
        'url_import_completed' => 'Completed',
        'url_import_failed' => 'Failed',
        'url_import_waiting_import' => 'Waiting Import',
        'popular_articles' => 'Popular Content',
        'view_count_short' => ':count views',
        'analytics_card_title' => 'Full Analytics',
        'analytics_card_desc' => 'Category, performance, task, material, AI usage, URL import, and log trends now live on the Analytics page with date and dimension filters.',
        'analytics_card_button' => 'Open Analytics',
        'navigation' => [
            'heading' => 'Home Navigation',
            'subtitle' => 'Enter common workspaces through single-site operations or multi-site distribution.',
            'single_site_title' => 'Single-Site Operations',
            'single_site_desc' => 'Configure models, build assets, generate content, manage articles, and review analytics for the main site.',
            'multi_site_title' => 'Multi-Site Distribution',
            'multi_site_desc' => 'Connect channel sites, deploy site packages, monitor distribution queues, and manage remote content.',
            'ai_config_title' => 'Configure AI',
            'ai_config_desc' => 'Maintain chat models, embedding models, and prompts.',
            'materials_title' => 'Configure Materials',
            'materials_desc' => 'Manage knowledge bases, title libraries, keyword libraries, image libraries, and authors.',
            'url_import_title' => 'URL Smart Import',
            'url_import_desc' => 'Extract structured assets from external pages.',
            'create_task_title' => 'Create Production Task',
            'create_task_desc' => 'Set topics, assets, models, publishing cadence, and distribution scope.',
            'articles_title' => 'Manage Articles',
            'articles_desc' => 'Review, edit, publish, and maintain local articles.',
            'site_settings_title' => 'Site Settings',
            'site_settings_desc' => 'Maintain title, theme, SEO, copyright, and safety rules.',
            'analytics_title' => 'View Analytics',
            'analytics_desc' => 'Review content, tasks, distribution, access logs, and AI crawler trends.',
            'prompt_config_title' => 'Prompt Configuration',
            'prompt_config_desc' => 'Maintain body-generation prompts plus special prompts for keywords and descriptions.',
            'body_prompt_label' => 'Body Prompts',
            'special_prompt_label' => 'Special Prompts',
            'admin_users_title' => 'User Management',
            'admin_users_desc' => 'Manage admin accounts, roles, status, and security actions.',
            'distribution_channels_title' => 'Manage Channels',
            'distribution_channels_desc' => 'Maintain target-site Agents, secrets, templates, and remote settings.',
            'create_channel_title' => 'Create Channel Site',
            'create_channel_desc' => 'Generate the target site package and connection secret.',
            'distribution_jobs_title' => 'View Distribution Queue',
            'distribution_jobs_desc' => 'Track remote publish, update, delete, and retry status.',
            'remote_content_title' => 'Remote Content',
            'remote_content_desc' => 'Edit or delete remote copies and refresh target-site pages.',
        ],
        'quick_start' => [
            'eyebrow' => 'Quick Start',
            'title' => 'Generate and publish content in three steps',
            'subtitle' => 'Connect an AI model, prepare knowledge, title, keyword, and image assets, then create a task to generate drafts and publish them on schedule.',
            'api_title' => 'Configure API',
            'api_desc' => 'Add at least one working chat model. Configure an embedding model if you want knowledge-base RAG retrieval.',
            'api_button' => 'Configure AI Models',
            'material_title' => 'Configure Materials',
            'material_desc' => 'Turn real and reliable business information into reusable assets that generation tasks can prioritize.',
            'knowledge' => 'Knowledge',
            'titles' => 'Titles',
            'keywords' => 'Keywords',
            'images' => 'Images',
            'authors' => 'Authors',
            'task_title' => 'Create Task',
            'task_desc' => 'Choose title libraries, materials, and models, set generation limits and publishing frequency, then let GEOFlow generate and publish content.',
            'task_button' => 'Create Task',
        ],
        'skill_resources' => [
            'title' => 'Companion Skill Tools',
            'desc' => 'Use these skills with multi-site distribution, target-site templates, and batch operations to connect template planning, theme design, and CLI workflows.',
            'open' => 'View Skill',
            'template_title' => 'yao-geoflow-template',
            'template_desc' => 'Analyze the GEOFlow frontend contract and map reference sites into compatible template packages, page modules, and preview plans.',
            'design_title' => 'yao-geoflow-design',
            'design_desc' => 'Discover, preview, clone, and iterate Laravel Blade themes while preserving GEOFlow business contracts.',
            'cli_title' => 'yao-geoflow-cli',
            'cli_desc' => 'Operate GEOFlow through the local CLI or API for task orchestration, article upload, review, publishing, and batch management.',
        ],
    ],
    'analytics' => [
        'page_title' => 'Analytics',
        'heading' => 'Analytics',
        'subtitle' => 'Analyze content production and traffic trends by date, site, content, and log source.',
        'last_updated' => 'Last updated: :time',
        'refresh' => 'Refresh',
        'overall_title' => 'Overall Data Overview',
        'overall_desc' => 'System-level metrics that are not constrained by the current filters, useful for quickly reading the current site health.',
        'single_site_title' => 'Single-Site Operations Data',
        'single_site_desc' => 'Focuses on the current main site by default. Use date, category, task, and article filters above to review content production, assets, models, and traffic in a selected range.',
        'multi_site_title' => 'Multi-Site Distribution Data',
        'multi_site_desc' => 'Review distribution channels, remote sync status, failed queues, and pending distribution independently. This area can later expand into multi-channel comparisons.',
        'self_log_title' => 'Self-Service Log Data',
        'self_log_desc' => 'Analyze PV, AI crawler visits, errors, and popular paths from local view logs and future server or channel-site log sources.',
        'global_overview' => [
            'title' => 'Overall Data Overview',
            'desc' => 'Global metrics moved from the dashboard.',
        ],
        'filters' => [
            'title' => 'Filters',
            'preset' => 'Date preset',
            'date_from' => 'From',
            'date_to' => 'To',
            'channel' => 'Channel',
            'task' => 'Task',
            'category' => 'Category',
            'article' => 'Article',
            'traffic_type' => 'Traffic type',
            'log_source' => 'Log source',
            'apply' => 'Apply',
            'reset' => 'Reset',
            'all' => 'All',
            'today' => 'Today',
            'yesterday' => 'Yesterday',
            '7d' => 'Last 7 days',
            '30d' => 'Last 30 days',
            '90d' => 'Last 90 days',
            'custom' => 'Custom',
            'human' => 'Human',
            'search_bot' => 'Search bots',
            'ai_bot' => 'AI bots',
            'other_bot' => 'Other bots',
            'unknown' => 'Unknown',
            'local' => 'Local view logs',
            'server' => 'Server logs',
            'channel_source' => 'Channel-site logs',
            'source_pending' => ':source (not connected)',
        ],
        'kpi' => [
            'articles' => 'Articles in range',
            'published' => 'Published in range',
            'running_tasks' => 'Running tasks',
            'failed_tasks' => 'Failed tasks',
            'ai_calls' => 'AI/API calls',
            'distribution_failed' => 'Distribution failed',
            'distribution_pending' => 'Pending distribution',
            'total_views' => 'Content views',
            'distribution_synced' => 'Synced',
        ],
        'content_title' => 'Content Analytics',
        'content_desc' => 'Track content production and publishing status from articles, tasks, AI models, and distribution queues.',
        'publication_trend' => 'Publication Trend',
        'task_trend' => 'Task Trend',
        'content_funnel' => 'Content Funnel',
        'ai_usage' => 'AI/API Usage',
        'distribution_status' => 'Distribution Status',
        'top_content' => 'Top Content in Range',
        'created_articles' => 'Created',
        'published_articles' => 'Published',
        'completed' => 'Completed',
        'failed' => 'Failed',
        'running' => 'Running',
        'pending' => 'Pending',
        'synced' => 'Synced',
        'model' => 'Model',
        'used_today' => 'Today',
        'total_used' => 'Total',
        'article' => 'Article',
        'category' => 'Category',
        'views' => 'Views',
        'status' => 'Status',
        'no_data' => 'No data',
        'funnel' => [
            'created' => 'Created',
            'draft' => 'Draft',
            'review' => 'Review',
            'published' => 'Published',
            'viewed' => 'Viewed',
        ],
        'logs_title' => 'Log Analytics',
        'logs_desc' => 'Based on front-site access logs, this section shows PV, AI crawler visits, top pages, status codes, and channel-site traffic trends.',
        'logs_overview' => 'Access Log Overview',
        'logs_trend' => 'Traffic Trend',
        'logs_bot_breakdown' => 'Traffic Type Breakdown',
        'logs_top_articles' => 'Top Article Visits',
        'logs_top_paths' => 'Top Page Paths',
        'logs_kpi' => [
            'pv' => 'PV',
            'unique_ip' => 'Unique IPs',
            'ai_bot_pv' => 'AI Bot Visits',
            'errors' => 'Error Requests',
        ],
        'logs_bot' => [
            'human' => 'Human',
            'search_bot' => 'Search bots',
            'ai_bot' => 'AI bots',
            'other_bot' => 'Other bots',
            'unknown' => 'Unknown',
        ],
        'logs_table' => [
            'date' => 'Date',
            'path' => 'Path',
            'article' => 'Article',
            'views' => 'Views',
            'unique_ip' => 'Unique IPs',
        ],
        'logs_empty_title' => 'No log data yet',
        'logs_empty_desc' => 'This first version focuses on content analytics. Once Nginx/Apache or channel-site logs are connected, traffic trends, AI crawler visits, and error pages will appear here.',
    ],
    'materials' => [
        'page_title' => 'Materials',
        'heading' => 'Materials',
        'subtitle' => 'Manage keyword libraries, title libraries, image libraries, and AI knowledge bases',
        'author_manage' => 'Authors',
        'library_count' => ':count libraries',
        'keyword_libraries' => 'Keyword Libraries',
        'keyword_count' => ':count keywords',
        'title_libraries' => 'Title Libraries',
        'title_count' => ':count titles',
        'image_libraries' => 'Image Libraries',
        'image_count' => ':count images',
        'knowledge_bases' => 'AI Knowledge Bases',
        'author_count' => ':count authors',
        'unit_libraries' => ':count',
        'unit_items' => ':count',
        'unit_images' => ':count',
        'view_all' => 'View All',
        'keyword_manage_title' => 'Keyword Library Management',
        'keyword_library_count' => 'Keyword Libraries',
        'keyword_total_count' => 'Total Keywords',
        'manage_keyword_libraries' => 'Manage Keyword Libraries',
        'title_manage_title' => 'Title Library Management',
        'title_library_count' => 'Title Libraries',
        'title_total_count' => 'Total Titles',
        'manage_title_libraries' => 'Manage Title Libraries',
        'image_manage_title' => 'Image Library Management',
        'image_library_count' => 'Image Libraries',
        'image_total_count' => 'Total Images',
        'manage_image_libraries' => 'Manage Image Libraries',
        'knowledge_manage_title' => 'AI Knowledge Base Management',
        'knowledge_base_count' => 'Knowledge Bases',
        'author_total_count' => 'Authors',
        'manage_knowledge_bases' => 'Manage Knowledge Bases',
        'keywords_summary' => 'Manage keyword assets for AI content generation',
        'titles_summary' => 'Manage manually created and AI-generated article titles',
        'images_summary' => 'Manage article cover images and media assets',
        'knowledge_summary' => 'Manage knowledge documents used during AI content generation',
        'quick_actions' => 'Quick Actions',
        'manage_keywords_short' => 'Manage keywords',
        'manage_titles_short' => 'Manage titles',
        'manage_images_short' => 'Manage images',
        'manage_knowledge_short' => 'Manage knowledge',
        'url_import' => 'URL Smart Import',
        'url_import_iterating' => 'In Iteration',
        'url_import_short' => 'Generate materials from a web page with one click. Capability is still evolving.',
        'url_import_history' => 'Import History',
        'url_import_history_short' => 'View URL import jobs and logs',
        'url_import_warning' => 'This feature is still evolving and not yet mature',
        'url_import_title' => 'Enter a web page URL to generate importable assets automatically',
        'url_import_description' => 'The system extracts article content, performs AI cleaning and semantic analysis, then prepares AI knowledge base, keyword library, and title library previews for one-click import.',
        'url_import_caution' => 'Currently recommended only for single-page trial imports with manual review. Extraction accuracy, deduplication, source mapping, and final import confirmation are still being refined.',
        'url_import_target_label' => 'Target URL',
        'url_import_placeholder' => 'Enter an article, topic, or report URL, for example: https://example.com/article',
        'url_import_start' => 'Start Smart Parsing',
        'url_import_option_knowledge' => 'Knowledge Base',
        'url_import_option_keywords' => 'Keyword Library',
        'url_import_option_titles' => 'Title Library',
        'url_import_option_ai_cleaning' => 'AI Cleaning',
        'url_import_option_semantic' => 'Semantic Analysis',
        'url_import_flow_label' => 'Pipeline',
        'url_import_flow_title' => 'Fetch → Clean → Preview → Import',
        'url_import_flow_desc' => 'Focused on high-quality single-page imports instead of whole-site crawling.',
        'url_import_assets_label' => 'Output Assets',
        'url_import_assets_title' => 'Knowledge / Keywords / Titles',
        'url_import_assets_desc' => 'Assets flow into the existing libraries to reduce manual splitting and entry.',
        'url_import_stage_label' => 'Current Stage',
        'url_import_stage_title' => 'Single-page high-quality import',
        'url_import_stage_desc' => 'Preview and history are already available. Source mapping, deduplication, and final import confirmation are next.',
        'url_import_upcoming_title' => 'Upcoming Standard Workflow',
        'url_import_upcoming_step_1' => 'Enter a URL and import strategy to extract the body content and generate page JSON',
        'url_import_upcoming_step_2' => 'Run AI cleaning plus keyword and title generation based on page content',
        'url_import_upcoming_step_3' => 'Confirm the preview, then write assets into the libraries with source mapping',
        'url_import_progress_title' => 'Smart Processing Progress',
        'url_import_waiting_start' => 'Waiting to start',
        'url_import_stage_status_title' => 'Stage Status',
        'url_import_log_title' => 'Processing Log',
        'url_import_waiting_log_status' => 'Waiting for the job to start',
        'url_import_preview_title' => 'Smart Parsing Preview',
        'url_import_preview_subtitle' => 'This currently shows the parsing result. Real content extraction and asset import confirmation will continue to improve.',
        'url_import_knowledge_preview_title' => 'Knowledge Base Preview',
        'url_import_result_title' => 'Keyword and Title Preview',
        'url_import_keywords_label' => 'Keywords',
        'url_import_titles_label' => 'Titles',
        'url_import_stage_completed' => 'Done',
        'url_import_stage_in_progress' => 'In Progress',
        'url_import_stage_pending' => 'Pending',
        'url_import_step_fetch' => 'Fetch Page',
        'url_import_step_extract' => 'Extract Content',
        'url_import_step_ai_clean' => 'AI Cleaning',
        'url_import_step_keywords' => 'Generate Keywords',
        'url_import_step_titles' => 'Generate Titles',
        'url_import_step_knowledge' => 'Organize Knowledge',
        'url_import_step_completed' => 'Completed',
        'url_import_waiting_logs' => 'Waiting for job logs...',
        'url_import_status_fetch_failed' => 'Failed to load job status',
        'url_import_processing_done' => 'Completed',
        'url_import_processing' => 'Processing',
        'url_import_task_failed' => 'Job failed',
        'url_import_error_required' => 'Please enter a URL to import',
        'url_import_processing_button' => 'Processing',
        'url_import_task_create_failed' => 'Failed to create job',
        'url_import_task_started' => 'Job started',
    ],
    'ai_configurator' => [
        'page_title' => 'AI Configurator',
        'heading' => 'AI Configurator',
        'subtitle' => 'Manage AI models and prompt configuration',
        'models_title' => 'AI Model Settings',
        'models_desc' => 'Manage AI models',
        'models_action' => 'Configure AI Models',
        'prompts_title' => 'Prompt Settings',
        'prompts_desc' => 'Manage content prompts',
        'prompts_action' => 'Configure Content Prompts',
        'special_title' => 'Other Prompts',
        'special_desc' => 'Special prompt settings',
        'special_action' => 'Configure Special Prompts',
        'overview' => 'Configuration Overview',
        'active_models' => 'Active AI Models',
        'prompt_templates' => 'Prompt Templates',
        'total_calls' => 'Total Calls',
        'today_calls' => 'Calls Today',
        'help_title' => 'Usage Notes',
        'help_models' => 'AI Model Settings: manage available models, API keys, rate limits, and related settings',
        'help_content_prompts' => 'Content Prompts: used directly by the task center for body generation. Supports {{title}}, {{keyword}}, {{Knowledge}}, and {{#if Knowledge}}...{{/if}}. {{Knowledge}} is filled with retrieved knowledge snippets automatically.',
        'help_special_prompts' => 'Special Prompts: used for keyword and description generation. Supports {{content}}, {{title}}, and {{keyword}}.',
        'help_pipeline' => 'Execution Pipeline: the task center, manual test pages, and the worker now share the same AIEngine rendering logic.',
    ],
    'activity_logs' => [
        'page_title' => 'Admin Activity Logs',
        'heading' => 'Admin Activity Logs',
        'subtitle' => 'View requests and actions initiated by admins in the backend',
        'total_logs' => 'Total Logs',
        'today_logs' => 'Today',
        'active_admins' => 'Active Admins (7 days)',
        'search' => 'Search',
        'search_placeholder' => 'Search admin, action, page, or details',
        'admin' => 'Admin',
        'all_admins' => 'All Admins',
        'filter' => 'Filter',
        'reset' => 'Reset',
        'list_title' => 'Log List',
        'time' => 'Time',
        'action' => 'Action',
        'page' => 'Page',
        'target' => 'Target',
        'details' => 'Details',
        'ip' => 'IP',
        'empty' => 'No logs match the current filters',
        'role_super_admin' => 'Super Admin',
        'role_admin' => 'Admin',
        'page_summary' => ':total logs, page :page / :total_pages',
        'prev' => 'Previous',
        'next' => 'Next',
    ],
    'categories' => [
        'page_title' => 'Category Management',
        'heading' => 'Category Management',
        'subtitle' => 'Manage article categories and structure',
        'add' => 'Add Category',
        'back_to_articles' => 'Back to Articles',
        'add_form' => 'Add Category',
        'edit_form' => 'Edit Category',
        'empty' => 'No categories yet',
        'empty_desc' => 'No categories have been created yet',
        'add_first' => 'Add First Category',
        'list_title' => 'Category List',
        'column_info' => 'Category',
        'column_article_count' => 'Articles',
        'column_sort_order' => 'Sort',
        'column_created_at' => 'Created At',
        'field_name' => 'Category Name *',
        'field_slug' => 'URL Slug',
        'field_description' => 'Category Description',
        'field_sort_order' => 'Sort Weight',
        'placeholder_name' => 'Enter category name',
        'placeholder_slug' => 'Leave blank to auto-generate',
        'placeholder_description' => 'Enter category description',
        'placeholder_sort_order' => 'Smaller numbers sort first',
        'slug_help' => 'Used in URLs. Leave blank to generate automatically.',
        'sort_help' => 'Lower numbers appear first. Default is 0.',
        'url_label' => 'URL',
        'article_count_badge' => ':count articles',
        'save_add' => 'Add Category',
        'save_edit' => 'Save Changes',
        'confirm_delete' => 'Delete this category?',
        'delete_disabled' => 'This category still has articles and cannot be deleted',
        'error' => [
            'name_required' => 'Category name is required',
            'name_exists' => 'Category name already exists',
            'delete_blocked' => 'Cannot delete this category because it still contains :count articles',
            'fetch_list_failed' => 'Failed to load category list: :message',
            'not_found' => 'Category not found',
            'fetch_detail_failed' => 'Failed to load category details: :message',
        ],
        'message' => [
            'add_success' => 'Category created successfully',
            'update_success' => 'Category updated successfully',
            'delete_success' => 'Category deleted successfully',
            'action_failed' => 'Operation failed: :message',
            'delete_failed' => 'Delete failed: :message',
        ],
    ],
    'ai_prompts' => [
        'page_title' => 'Content Prompt Configuration',
        'heading' => 'Content Prompt Configuration',
        'subtitle' => 'Manage the content-generation prompt templates used by tasks',
        'add' => 'Add Content Prompt',
        'help_banner' => 'This page only manages <code>content</code> prompts used for task body generation. Maintain keyword and description prompts on the <a href=":url" class="font-medium underline">Special Prompt Configuration</a> page.',
        'list_title' => 'Content Prompt List',
        'list_subtitle' => 'These prompts are referenced directly by the task center “Content Prompt” field.',
        'column_info' => 'Prompt',
        'column_type' => 'Type',
        'column_usage' => 'Usage',
        'column_created_at' => 'Created At',
        'empty' => 'No content prompts configured yet',
        'add_first' => 'Add the first content prompt',
        'type_content' => 'Content Prompt',
        'task_usage' => 'Tasks: :count',
        'modal_create' => 'Add Content Prompt',
        'modal_edit' => 'Edit Content Prompt',
        'field_name' => 'Prompt Name *',
        'field_content' => 'Prompt Content *',
        'placeholder_name' => 'For example: Technology Article Body Generation',
        'placeholder_content' => 'Enter prompt content. Variables are supported...',
        'variable_title' => 'Available variables for content prompts:',
        'variable_title_label' => '<code>{{title}}</code> - current article title',
        'variable_keyword_label' => '<code>{{keyword}}</code> - keyword bound to the title',
        'variable_knowledge_label' => '<code>{{Knowledge}}</code> - knowledge snippets retrieved for the task',
        'variable_help' => 'Conditional blocks are supported via <code>{{#if Knowledge}}...{{/if}}</code>. The system retrieves relevant snippets by title and keyword before rendering <code>{{Knowledge}}</code>. Body generation does not provide <code>{{content}}</code>.',
        'confirm_delete' => 'Delete prompt “:name”? This action cannot be undone.',
        'error' => [
            'required' => 'Prompt name and content are required',
            'invalid_fields' => 'Invalid parameters or missing required fields',
            'invalid_id' => 'Invalid prompt ID',
            'in_use' => 'Cannot delete this prompt because :count tasks are still using it',
            'fetch_failed' => 'Failed to load prompts: :message',
        ],
        'message' => [
            'create_success' => 'Prompt created successfully',
            'create_failed' => 'Failed to create prompt',
            'update_success' => 'Prompt updated successfully',
            'update_failed' => 'Failed to update prompt',
            'delete_success' => 'Prompt deleted successfully',
            'delete_failed' => 'Failed to delete prompt',
            'create_error' => 'Create failed: :message',
            'update_error' => 'Update failed: :message',
            'delete_error' => 'Delete failed: :message',
        ],
    ],
    'ai_special' => [
        'page_title' => 'Special Prompt Configuration',
        'heading' => 'Special Prompt Configuration',
        'subtitle' => 'Configure special prompts for keyword and article description generation',
        'keyword_title' => 'Keyword Prompt Settings',
        'keyword_subtitle' => 'Configure the prompt used when AI generates keywords',
        'keyword_field' => 'Keyword Generation Prompt',
        'keyword_placeholder' => 'Enter the keyword-generation prompt...',
        'keyword_help' => 'This prompt guides AI keyword generation.',
        'keyword_save' => 'Save Keyword Prompt',
        'description_title' => 'Description Prompt Settings',
        'description_subtitle' => 'Configure the prompt used when AI generates article descriptions',
        'description_field' => 'Article Description Prompt',
        'description_placeholder' => 'Enter the article-description prompt...',
        'description_help' => 'This prompt guides AI SEO description generation.',
        'description_save' => 'Save Description Prompt',
        'variable_help' => 'Available variables: <code>{{content}}</code>, <code>{{title}}</code>, and <code>{{keyword}}</code>. Conditional blocks are supported via <code>{{#if keyword}}...{{/if}}</code>.',
        'help_title' => 'Usage Notes',
        'help_keyword' => 'Keyword prompt: guides AI to generate relevant keywords from a topic or body of content.',
        'help_description' => 'Description prompt: guides AI to generate SEO-friendly article descriptions from content.',
        'help_variables' => 'Variable support: {{content}}, {{title}}, and {{keyword}}, plus conditional blocks with {{#if keyword}}...{{/if}}.',
        'help_auto_apply' => 'Auto apply: saved prompts are applied automatically to the task center and worker generation pipeline.',
        'error' => [
            'keyword_required' => 'Keyword prompt content cannot be empty',
            'description_required' => 'Article description prompt content cannot be empty',
        ],
        'message' => [
            'keyword_saved' => 'Keyword prompt saved successfully',
            'keyword_failed' => 'Failed to save the keyword prompt',
            'description_saved' => 'Description prompt saved successfully',
            'description_failed' => 'Failed to save the description prompt',
            'save_error' => 'Save failed: :message',
        ],
    ],
    'status' => [
        'markdown' => 'Markdown',
        'word_document' => 'Word Document',
        'text' => 'Plain Text',
        'unknown' => 'Unknown',
        'running' => 'Running',
        'paused' => 'Paused',
        'label' => 'Status',
    ],
    'knowledge_bases' => [
        'page_title' => 'AI Knowledge Base Management',
        'heading' => 'AI Knowledge Base Management',
        'subtitle' => 'Manage knowledge documents used for AI training and references',
        'upload' => 'Upload Knowledge Base',
        'total' => 'Knowledge Bases',
        'total_words' => 'Total Words',
        'markdown_count' => 'Markdown',
        'word_count' => 'Word Documents',
        'list_title' => 'Knowledge Base List',
        'column_knowledge_base' => 'Knowledge Base',
        'empty' => 'No knowledge bases yet',
        'empty_desc' => 'Create your first knowledge base to provide domain knowledge for AI.',
        'create_first' => 'Create Knowledge Base',
        'upload_doc' => 'Upload Document',
        'text_unit' => ':count chars',
        'created_at' => 'Created: :value',
        'updated_at' => 'Updated: :value',
        'usage_count' => 'Usage: :count',
        'modal_create' => 'Create Knowledge Base',
        'modal_upload' => 'Upload Knowledge Document',
        'field_name' => 'Knowledge Base Name *',
        'field_doc_type' => 'Document Type',
        'field_description' => 'Description',
        'field_content' => 'Knowledge Content *',
        'field_file' => 'Choose File *',
        'file_choose' => 'Choose File',
        'file_none_selected' => 'No file selected',
        'placeholder_name' => 'Enter knowledge base name',
        'placeholder_name_optional' => 'Leave blank to use the file name',
        'placeholder_description' => 'Optional description of this knowledge base',
        'placeholder_upload_description' => 'Optional knowledge base description',
        'placeholder_content' => 'Enter knowledge content. Markdown is supported...',
        'format_help' => 'Supported file formats:',
        'format_txt' => 'TXT - plain text file',
        'format_md' => 'MD - Markdown file',
        'format_docx' => 'DOCX - Word document with automatic body extraction',
        'format_doc' => 'DOC - legacy Word document; please save as DOCX before uploading',
        'confirm_delete' => 'Delete knowledge base “:name”? This action cannot be undone.',
        'confirm_refresh_chunks' => 'Rebuild chunks for “:name” and call the embedding model to write real vectors?',
        'refresh_confirm_title' => 'Confirm Chunk Update',
        'refresh_confirm_intro' => 'The system will rebuild this knowledge base into chunks and call the current default embedding model to write real vectors.',
        'refresh_confirm_body' => 'Do not click repeatedly while the update is running. When it finishes, you will return to the knowledge base list with the latest chunk and vectorization status.',
        'refresh_confirm_target' => 'Target Knowledge Base',
        'refresh_confirm_rebuild' => 'Rebuild Chunks',
        'refresh_confirm_rebuild_desc' => 'Split the source text using the current chunking strategy.',
        'refresh_confirm_embedding' => 'Call Embedding Model',
        'refresh_confirm_embedding_desc' => 'Generate real vectors for every chunk.',
        'refresh_confirm_write' => 'Write Vector Index',
        'refresh_confirm_write_desc' => 'Refresh vector fields used by retrieval.',
        'refresh_confirm_continue' => 'Start Updating Chunks',
        'refresh_progress_button' => 'Updating',
        'refresh_progress_initial' => 'Preparing',
        'refresh_progress_embedding' => 'Vectorizing',
        'refresh_progress_writing' => 'Writing',
        'refresh_chunks' => 'Update Chunks',
        'vectorized_summary' => 'Vectorized :vectorized / :chunks',
        'error' => [
            'name_required' => 'Knowledge base name is required',
            'content_required' => 'Knowledge base content is required',
            'file_required' => 'Please choose a file to upload',
            'file_too_large' => 'File size exceeds the limit. Upload a file smaller than 10 MB.',
            'file_type_invalid' => 'Unsupported file type. Upload TXT, MD, or DOCX files.',
            'in_use' => 'This knowledge base is referenced by :count tasks. Remove the references before deleting it.',
            'not_found' => 'Knowledge base not found',
            'embedding_required' => 'No available embedding model is configured. Configure an embedding model for vectorization first.',
            'embedding_sync_failed' => 'Fallback vectors were blocked: the embedding model did not return complete real vectors. Check the model configuration and try again.',
            'embedding_sync_partial' => 'Generated :chunks chunks, but only :vectorized were written with real vectors. Check the embedding model and try again.',
            'embedding_api_failed' => 'Embedding model call failed: :message',
        ],
        'message' => [
            'create_success' => 'Knowledge base created successfully. Generated :count knowledge chunks.',
            'update_success' => 'Knowledge base updated successfully. Refreshed :count knowledge chunks.',
            'delete_success' => 'Knowledge base deleted successfully',
            'upload_success' => 'Knowledge document uploaded successfully. Generated :count knowledge chunks.',
            'chunks_refreshed' => 'Knowledge chunks updated: :chunks chunks, :vectorized vectorized.',
            'create_failed' => 'Failed to create the knowledge base',
            'update_failed' => 'Failed to update the knowledge base',
            'delete_failed' => 'Delete failed',
            'save_failed' => 'Failed to save to the database',
            'upload_failed' => 'File upload failed',
            'create_error' => 'Create failed: :message',
            'update_error' => 'Update failed: :message',
            'delete_error' => 'Delete failed: :message',
            'upload_error' => 'Upload failed: :message',
            'chunks_refresh_error' => 'Failed to update chunks: :message',
        ],
        'task_references' => ': :tasks',
        'vector_notice_configure_link' => 'Configure Vector Model',
        'vector_config_modal_title' => 'Vector Model Not Configured',
        'vector_config_prompt' => "No available embedding model was detected.\nPlease configure a vector model in AI Configurator before running chunk vectorization.",
    ],
    'knowledge_detail' => [
        'page_title' => 'Knowledge Base Details',
        'heading' => 'Knowledge Base Details',
        'subtitle' => 'View and edit knowledge base content',
        'back_to_list' => 'Back to List',
        'content_title' => 'Knowledge Base Content',
        'field_name' => 'Knowledge Base Name',
        'field_description' => 'Description',
        'field_content' => 'Content',
        'placeholder_description' => 'Optional: add a description for this knowledge base',
        'save_changes' => 'Save Changes',
        'chunk_count' => 'Knowledge Chunks',
        'vectorized_count' => 'Vectorized Chunks',
        'created_at' => 'Created At',
        'updated_at' => 'Updated At',
        'related_tasks_empty' => 'No related tasks',
        'chunk_preview_title' => 'Chunk Preview',
        'chunk_preview_desc' => 'Use this table to inspect chunk and embedding status quickly.',
        'chunk_preview_empty' => 'No chunk records available',
        'chunk_index' => 'Chunk',
        'chunk_status' => 'Embedding Status',
        'chunk_length' => 'Text Length',
        'chunk_tokens' => 'Token Count',
        'chunk_embedding' => 'Embedding Metadata',
        'chunk_preview_column' => 'Preview',
        'chunk_status_vectorized' => 'Vectorized',
        'chunk_status_fallback' => 'Fallback',
        'chunk_embedding_meta' => 'Model ID: :model_id / Dimensions: :dimensions',
        'chunk_embedding_none' => 'No embedding metadata',
        'chunk_strategy_label' => 'Chunking',
        'chunk_strategy_structured_rule' => 'Structured Rules',
        'chunk_strategy_semantic_llm' => 'Semantic Planning',
        'chunk_strategy_semantic_fallback' => 'Semantic Fallback',
    ],
    'title_libraries' => [
        'page_title' => 'Title Library Management',
        'heading' => 'Title Library Management',
        'subtitle' => 'Manage manually created and AI-generated article titles',
        'create' => 'Create Title Library',
        'total' => 'Title Libraries',
        'total_titles' => 'Total Titles',
        'ai_generated' => 'AI Generated',
        'list_title' => 'Title Library List',
        'empty' => 'No title libraries yet',
        'empty_desc' => 'Create your first title library to start managing titles.',
        'create_first' => 'Create Title Library',
        'title_count' => ':count titles',
        'ai_count' => 'AI: :count',
        'created_at' => 'Created: :value',
        'updated_at' => 'Updated: :value',
        'modal_create' => 'Create Title Library',
        'modal_import' => 'Import Titles To',
        'field_name' => 'Library Name *',
        'field_description' => 'Description',
        'field_titles' => 'Titles',
        'placeholder_name' => 'Enter a title library name',
        'placeholder_description' => 'Optional description of this title library',
        'placeholder_titles' => 'Enter titles, one per line',
        'import_help' => 'Import Notes:',
        'import_line' => 'One title per line',
        'import_dedupe' => 'Duplicates are skipped automatically',
        'import_length' => 'Recommended title length: 15-30 characters',
        'import_button' => 'Import Titles',
        'confirm_delete' => 'Delete title library “:name”? All titles in it will also be removed. This cannot be undone.',
        'error' => [
            'name_required' => 'Title library name is required',
            'library_required' => 'Please select a title library',
            'titles_required' => 'Please enter at least one title',
            'keyword_required' => 'Please enter a keyword',
            'no_ai_model' => 'No active AI model configuration is available',
            'ai_failed' => 'AI title generation failed',
            'delete_blocked' => 'This title library is still referenced by tasks and cannot be deleted. Please update or remove those tasks first: :tasks',
            'delete_more_tasks' => ' and :count more tasks',
        ],
        'message' => [
            'create_success' => 'Title library created successfully',
            'create_failed' => 'Failed to create the title library',
            'update_success' => 'Title library updated successfully',
            'delete_success' => 'Title library deleted successfully',
            'import_success' => 'Imported :count titles successfully',
            'ai_success' => 'AI generated :count titles successfully',
            'create_error' => 'Create failed: :message',
            'delete_error' => 'Delete failed: :message',
            'import_error' => 'Import failed: :message',
            'ai_error' => 'AI generation failed: :message',
        ],
    ],
    'title_detail' => [
        'page_title_suffix' => ' - Title Library Details',
        'subtitle' => 'Manage title library details',
        'import_batch' => 'Batch Import',
        'add_title' => 'Add Title',
        'ai_generate' => 'Generate with AI',
        'total_titles' => 'Total Titles',
        'created_date' => 'Created Date',
        'usage_total' => 'Usage Count',
        'list_title' => 'Title List',
        'search_placeholder' => 'Search titles...',
        'empty' => 'No titles yet',
        'empty_desc' => 'Add your first title',
        'empty_search' => 'No matching titles found',
        'ai_badge' => 'AI',
        'usage_count' => 'Usage: :count',
        'created_at' => 'Created: :value',
        'pagination' => 'Showing :start - :end of :total',
        'modal_add' => 'Add Title',
        'modal_import' => 'Batch Import Titles',
        'field_title' => 'Title *',
        'field_keyword' => 'Related Keyword',
        'field_titles' => 'Titles',
        'placeholder_title' => 'Enter a title',
        'placeholder_keyword' => 'Optional related keyword',
        'placeholder_titles' => 'Enter titles in one of the supported formats:',
        'import_format_title' => 'Supported formats:',
        'import_format_line' => 'One title per line',
        'import_format_pipe' => 'Title|Keyword (separate title and keyword with a pipe)',
        'import_format_dedupe' => 'Duplicates are skipped automatically',
        'import_button' => 'Import Titles',
        'error' => [
            'csrf' => 'CSRF token validation failed',
            'title_required' => 'Title is required',
            'title_exists' => 'This title already exists',
            'content_required' => 'Title content is required',
        ],
        'message' => [
            'add_success' => 'Title added successfully',
            'delete_success' => 'Title deleted successfully',
            'import_success' => 'Imported :count titles successfully',
            'import_skip' => ', skipped :count duplicate titles',
        ],
        'confirm_delete' => 'Delete title “:name”? This action cannot be undone.',
    ],
    'keyword_libraries' => [
        'page_title' => 'Keyword Library Management',
        'heading' => 'Keyword Library Management',
        'subtitle' => 'Manage keyword libraries and keyword data',
        'create' => 'Create Keyword Library',
        'total' => 'Keyword Libraries',
        'total_keywords' => 'Total Keywords',
        'list_title' => 'Keyword Library List',
        'empty' => 'No keyword libraries yet',
        'empty_desc' => 'Create your first keyword library to start managing keywords.',
        'keyword_count' => ':count keywords',
        'created_at' => 'Created: :value',
        'updated_at' => 'Updated: :value',
        'modal_create' => 'Create Keyword Library',
        'modal_import' => 'Import Keywords To',
        'field_name' => 'Library Name *',
        'field_description' => 'Description',
        'field_keywords' => 'Keyword Content',
        'placeholder_name' => 'Enter a keyword library name',
        'placeholder_description' => 'Optional description of this keyword library',
        'placeholder_keywords' => 'Enter keywords using one of the supported formats:',
        'format_title' => 'Supported formats:',
        'format_line' => 'One keyword per line',
        'format_comma' => 'Separate multiple keywords with commas',
        'format_dedupe' => 'Duplicates are skipped automatically',
        'import_button' => 'Import Keywords',
        'confirm_delete' => 'Delete keyword library “:name”? All keywords in it will also be removed. This cannot be undone.',
        'error' => [
            'name_required' => 'Keyword library name is required',
            'library_required' => 'Please select a keyword library',
            'keywords_required' => 'Please enter at least one keyword',
        ],
        'message' => [
            'create_success' => 'Keyword library created successfully',
            'create_failed' => 'Failed to create the keyword library',
            'update_success' => 'Keyword library updated successfully',
            'delete_success' => 'Keyword library deleted successfully',
            'import_success' => 'Imported :count keywords successfully',
            'import_skip' => ', skipped :count duplicate keywords',
            'create_error' => 'Create failed: :message',
            'delete_error' => 'Delete failed: :message',
            'import_error' => 'Import failed: :message',
        ],
    ],
    'keyword_detail' => [
        'page_title_suffix' => ' - Keyword Library Details',
        'home' => 'Dashboard',
        'tasks' => 'Tasks',
        'articles' => 'Articles',
        'materials' => 'Materials',
        'ai_config' => 'AI Config',
        'site_settings' => 'Site Settings',
        'security' => 'Security',
        'welcome' => 'Welcome, :name',
        'logout' => 'Log Out',
        'no_description' => 'No description',
        'edit_info' => 'Edit Info',
        'add_keyword' => 'Add Keyword',
        'total_keywords' => 'Total Keywords',
        'usage_total' => 'Usage Count',
        'created_date' => 'Created Date',
        'updated_date' => 'Last Updated',
        'list_title' => 'Keyword List',
        'list_total' => '(:count total)',
        'empty' => 'No keywords yet',
        'empty_search' => 'No matching keywords found',
        'empty_desc' => 'Start adding keywords to this library',
        'selected_count' => ':count keywords selected',
        'delete_selected' => 'Delete Selected',
        'search_placeholder' => 'Search keywords...',
        'batch_actions' => 'Bulk Actions',
        'pagination' => 'Showing :start - :end of :total',
        'modal_add' => 'Add Keyword',
        'modal_edit' => 'Edit Keyword Library',
        'field_keyword' => 'Keyword *',
        'field_name' => 'Library Name *',
        'field_description' => 'Description',
        'placeholder_keyword' => 'Enter a keyword',
        'error' => [
            'keyword_required' => 'Keyword is required',
            'keyword_exists' => 'This keyword already exists',
            'library_name_required' => 'Keyword library name is required',
            'select_required' => 'Select at least one keyword to delete',
        ],
        'message' => [
            'add_success' => 'Keyword added successfully',
            'delete_success' => 'Deleted :count keywords successfully',
            'update_success' => 'Keyword library updated successfully',
        ],
        'confirm_delete_keyword' => 'Delete keyword “:name”?',
        'confirm_delete_selected' => 'Delete the selected :count keywords?',
    ],
    'image_libraries' => [
        'page_title' => 'Image Library Management',
        'heading' => 'Image Library Management',
        'subtitle' => 'Manage image assets and libraries',
        'create' => 'Create Image Library',
        'total' => 'Image Libraries',
        'total_images' => 'Total Images',
        'storage' => 'Storage',
        'list_title' => 'Image Library List',
        'empty' => 'No image libraries yet',
        'empty_desc' => 'Create your first image library to start managing images.',
        'image_count' => ':count images',
        'created_at' => 'Created: :value',
        'updated_at' => 'Updated: :value',
        'upload_images' => 'Upload Images',
        'modal_create' => 'Create Image Library',
        'field_name' => 'Library Name *',
        'field_description' => 'Description',
        'placeholder_name' => 'Enter an image library name',
        'placeholder_description' => 'Optional description of this image library',
        'supported_formats' => 'Supported image formats:',
        'confirm_delete' => 'Delete image library “:name”? All image files inside it will also be removed. This cannot be undone.',
        'error' => [
            'name_required' => 'Image library name is required',
            'in_use' => 'This image library is referenced by :count tasks. Remove the references before deleting it.',
        ],
        'message' => [
            'create_success' => 'Image library created successfully',
            'create_failed' => 'Failed to create the image library',
            'update_success' => 'Image library updated successfully',
            'delete_success' => 'Image library deleted successfully',
            'delete_cleanup_partial' => ', but :count files could not be removed from disk',
            'create_error' => 'Create failed: :message',
            'delete_error' => 'Delete failed: :message',
        ],
    ],
    'image_detail' => [
        'page_title' => 'Image Library Details',
        'total_images' => 'Total Images',
        'search_placeholder' => 'Search image names...',
        'list_title' => 'Image List',
        'total_images_count' => ':count total',
        'empty' => 'No images yet',
        'empty_search' => 'No matching images found',
        'empty_desc' => 'Start uploading images to this library',
        'selected_count' => ':count images selected',
        'delete_selected' => 'Delete Selected',
        'pagination_summary' => 'Showing :from - :to of :total',
        'modal_upload' => 'Upload Images To :name',
        'upload_hint' => 'Drag images here or click to choose files',
        'upload_formats' => 'Supports JPEG, PNG, GIF, and WebP',
        'select_images' => 'Choose Images',
        'selected_files' => 'Selected Files:',
        'modal_edit' => 'Edit Image Library',
        'dimensions_label' => 'Dimensions',
        'size_label' => 'Size',
        'url_label' => 'Image URL',
        'uploading' => 'Uploading...',
        'error' => [
            'select_images' => 'Please choose images to upload',
            'upload_none' => 'No images were uploaded successfully. ',
            'upload_failed_detail' => 'Image upload failed: :message. Please check whether storage/app/public is writable and run php artisan storage:link.',
            'no_records' => 'No image records found to delete',
            'select_delete' => 'Please select images to delete',
        ],
        'message' => [
            'upload_success' => 'Uploaded :count images successfully',
            'upload_skipped' => ', skipped :count invalid files',
            'upload_error' => 'Upload failed: :message',
            'delete_success' => 'Deleted :count images successfully',
            'delete_cleanup_partial' => ', but :count files could not be removed from disk',
            'delete_error' => 'Delete failed: :message',
            'update_success' => 'Image library updated successfully',
            'update_failed' => 'Update failed',
            'update_error' => 'Update failed: :message',
        ],
        'confirm_delete_selected_prefix' => 'Delete the selected',
        'confirm_delete_selected_suffix' => 'images? This action cannot be undone.',
    ],
    'admin_users' => [
        'page_title' => 'User Management',
        'page_subtitle' => 'Create standard backend user accounts and review backend access.',
        'view_logs' => 'View Activity Logs',
        'add_admin' => 'Add Admin',
        'total_admins' => 'Total Users',
        'active_admins' => 'Active Users',
        'super_admins' => 'Super Admins',
        'permission_notice' => 'Standard users have the same business permissions as the current backend. Only “User Management” and “Admin Activity Logs” are restricted to super admins.',
        'list_title' => 'User List',
        'column_account' => 'Account',
        'column_role' => 'Role',
        'column_status' => 'Status',
        'column_last_login' => 'Last Login',
        'column_created' => 'Created',
        'column_activity' => 'Activity',
        'role_super_admin' => 'Super Admin',
        'role_admin' => 'Admin',
        'status_active' => 'Active',
        'status_inactive' => 'Inactive',
        'none_last_login' => 'Never',
        'system_init' => 'System Init',
        'created_by' => 'Created by: :value',
        'activity_count' => ':count entries',
        'action_enable' => 'Enable',
        'action_disable' => 'Disable',
        'confirm_delete' => 'Delete admin ":username"? This account will no longer be able to sign in.',
        'modal_create' => 'Add Admin',
        'modal_edit' => 'Edit Admin',
        'field_username' => 'Username *',
        'field_display_name' => 'Display Name',
        'field_email' => 'Email',
        'field_password' => 'Initial Password *',
        'field_confirm_password' => 'Confirm Password *',
        'field_new_password' => 'New Password',
        'field_confirm_new_password' => 'Confirm New Password',
        'placeholder_username' => 'Example: editor_01',
        'placeholder_display_name' => 'Example: Content Ops A',
        'placeholder_email' => 'Optional',
        'create_help' => 'New accounts are created as standard admins and enabled by default.',
        'edit_help' => 'Leave the password fields blank to keep the current password. Super admin accounts cannot be edited here.',
        'create_admin_submit' => 'Create Admin',
        'update_admin_submit' => 'Save Changes',
        'error' => [
            'username_required' => 'Username is required',
            'username_invalid' => 'Username may only contain letters, numbers, dots, underscores, and hyphens, with a length of 3-50 characters',
            'password_required' => 'Password is required',
            'password_mismatch' => 'Passwords do not match',
            'password_too_short' => 'Password must be at least 8 characters long',
            'username_exists' => 'This username already exists',
            'status_invalid' => 'Invalid admin status',
            'invalid_id' => 'Invalid admin ID',
            'cannot_toggle_self' => 'You cannot change your own status',
            'not_found' => 'Admin not found',
            'cannot_toggle_super_admin' => 'Super admin status cannot be changed',
            'cannot_edit_super_admin' => 'Super admin accounts cannot be edited here',
            'cannot_delete_self' => 'You cannot delete the current signed-in account',
            'cannot_delete_super_admin' => 'Super admin accounts cannot be deleted',
        ],
        'message' => [
            'create_success' => 'Admin account created successfully',
            'create_error' => 'Create failed: :message',
            'update_success' => 'Admin updated successfully',
            'update_error' => 'Update failed: :message',
            'enabled' => 'Admin enabled successfully',
            'disabled' => 'Admin disabled successfully',
            'toggle_error' => 'Failed to update status: :message',
            'delete_success' => 'Admin deleted successfully',
            'delete_error' => 'Delete failed: :message',
        ],
    ],
    'security' => [
        'page_title' => 'Sensitive Word Management',
        'page_subtitle' => 'Manage the sensitive words checked before article publishing',
        'total_sensitive_words' => 'Sensitive Words',
        'back_to_site_settings' => 'Back to Site Settings',
        'sensitive_words_desc' => 'Sensitive word checks run before articles are published to reduce the risk of non-compliant content reaching the frontend. Keep the list focused on terms that must be blocked to avoid over-filtering normal content.',
        'current_admin' => 'Current Admin',
        'account_created' => 'Account Created',
        'current_role' => 'Current Role',
        'super_admin_entry' => 'Super Admin Entry',
        'add_sensitive_words' => 'Add Sensitive Words',
        'words_label' => 'Sensitive Word List',
        'words_placeholder' => 'One sensitive word per line&#10;Example:&#10;blocked-word-1&#10;blocked-word-2&#10;blocked-word-3',
        'words_help' => 'Enter one sensitive word per line. Duplicates are removed automatically.',
        'words_list' => 'Sensitive Words',
        'empty_words' => 'No sensitive words yet. Add some from the form on the left.',
        'word_added_at' => 'Added on :value',
        'confirm_delete_word' => 'Delete this sensitive word?',
        'change_password' => 'Change Admin Password',
        'current_password' => 'Current Password',
        'current_password_placeholder' => 'Enter the current password',
        'new_password' => 'New Password',
        'new_password_placeholder' => 'Enter a new password (minimum 6 characters)',
        'confirm_new_password' => 'Confirm New Password',
        'confirm_new_password_placeholder' => 'Enter the new password again',
        'tips_title' => 'Security Tips',
        'tip_publish_check' => 'Sensitive word detection runs automatically before publishing articles',
        'tip_auto_trash' => 'Articles containing sensitive words are automatically deleted and moved to the trash',
        'tip_update_words' => 'Update the sensitive word list regularly to improve filtering quality',
        'tip_strong_password' => 'Use strong passwords for admin accounts and rotate them regularly',
        'error' => [
            'words_required' => 'Sensitive words are required',
            'invalid_word_id' => 'Invalid sensitive word ID',
            'password_fields_required' => 'All password fields are required',
            'password_mismatch' => 'The new password and confirmation do not match',
            'password_too_short' => 'The new password must be at least 6 characters long',
            'current_password_wrong' => 'The current password is incorrect',
        ],
        'message' => [
            'words_added' => 'Added :count sensitive words successfully',
            'words_add_error' => 'Add failed: :message',
            'word_deleted' => 'Sensitive word deleted successfully',
            'word_delete_failed' => 'Delete failed',
            'word_delete_error' => 'Delete failed: :message',
            'password_update_failed' => 'Failed to update the password',
            'password_update_error' => 'Failed to update the password: :message',
        ],
    ],
    'site_settings' => [
        'page_title' => 'Site Settings',
        'page_subtitle' => 'Configure the site profile and SEO settings',
        'section_basic' => 'Basic Site Settings',
        'field_site_name' => 'Site Name *',
        'field_logo' => 'Site Logo URL',
        'field_admin_base_path' => 'Admin URL Path *',
        'field_description' => 'Site Description',
        'field_subtitle' => 'Site Subtitle',
        'field_keywords' => 'Site Keywords',
        'module_sensitive_words' => 'Sensitive Word Management',
        'module_sensitive_words_desc' => 'Add, review, and remove sensitive words used by article publishing checks.',
        'field_copyright' => 'Copyright Notice',
        'field_featured_limit' => 'Featured Articles on Homepage',
        'field_per_page' => 'Articles Per Frontend Page',
        'section_home_carousel' => 'Homepage Carousel',
        'home_carousel_desc' => 'Configure up to 3 homepage poster images. Multiple images rotate every 10 seconds; one image stays static.',
        'home_carousel_slide' => 'Slide :index',
        'field_home_carousel_image' => 'Image URL',
        'field_home_carousel_title' => 'Image Description',
        'field_home_carousel_link' => 'Target Link',
        'field_home_carousel_enabled' => 'Enabled',
        'placeholder_home_carousel_image' => 'https://example.com/banner.jpg or /storage/banner.jpg',
        'placeholder_home_carousel_title' => 'Used as the image alt text',
        'placeholder_home_carousel_link' => 'Optional, for example /article/demo or https://example.com',
        'field_seo_title_template' => 'Page Title Template',
        'field_seo_description_template' => 'Page Description Template',
        'field_favicon' => 'Favicon URL',
        'field_analytics' => 'Analytics Code',
        'placeholder_site_name' => 'Enter the site name',
        'placeholder_admin_base_path' => 'Example: geo_admin or admin-panel',
        'placeholder_description' => 'Enter the site description',
        'placeholder_subtitle' => 'Used in the homepage hero and title templates',
        'placeholder_keywords' => 'keyword1, keyword2, keyword3',
        'placeholder_analytics' => '<!-- Google Analytics or other tracking code -->',
        'keywords_help' => 'Separate multiple keywords with commas',
        'admin_base_path_help' => 'After saving, the admin entry moves to the new URL immediately. Use only lowercase letters, numbers, hyphens, and underscores. Keep the new URL before saving so you do not lose access.',
        'section_seo' => 'SEO Settings',
        'seo_title_help' => 'Available variables: {title}, {site_name}, {category}',
        'seo_description_help' => 'Available variables: {description}, {site_name}, {keywords}',
        'section_analytics' => 'Analytics',
        'analytics_help' => 'This snippet is injected into the page <head> tag',
        'analytics_super_admin_only' => 'Analytics code is injected directly into public pages. Only super admins can edit it.',
        'save_settings' => 'Save Settings',
        'error' => [
            'site_name_required' => 'Site name is required',
            'admin_base_path_required' => 'Admin URL path is required',
            'admin_base_path_invalid' => 'Invalid admin URL path. Use 3-48 lowercase letters, numbers, hyphens, or underscores, and start/end with a letter or number.',
            'admin_base_path_reserved' => 'This admin URL path conflicts with a system path. Choose another one.',
            'admin_base_path_save_failed' => 'Failed to save the admin URL path: :message',
        ],
        'message' => [
            'saved' => 'Site settings updated successfully',
            'saved_admin_base_path' => 'Site settings updated successfully. New admin URL: :url',
            'save_error' => 'Update failed: :message',
        ],
        'theme' => [
            'section_title' => 'Site Templates',
            'section_desc' => 'Themes live under resources/views/theme/{themeId}/ with an optional manifest.json. Override home, article, category, archive-index, archive-month Blade files as needed; missing pages fall back to resources/views/site/.',
            'current_label' => 'Currently Active Template',
            'current_help' => 'Switching templates does not change articles, categories, SEO, or content contracts. It only replaces the frontend presentation layer.',
            'default_name' => 'Default Frontend Template',
            'default_desc' => 'Keep using the system’s current frontend without activating a theme package.',
            'preview_home' => 'Preview Home',
            'preview_category' => 'Preview Category',
            'preview_article' => 'Preview Article',
            'preview_archive' => 'Preview Archive',
            'save' => 'Save Template Settings',
            'active_badge' => 'Active',
            'version_badge' => 'v:version',
            'no_description' => 'No description provided',
            'invalid_selection' => 'The selected template does not exist or is no longer available',
            'message' => [
                'default_enabled' => 'Switched back to the default frontend template',
                'activated' => 'Template activated: :name',
                'save_failed' => 'Failed to save the template settings',
            ],
        ],
        'ads' => [
            'section_title' => 'Article Detail Page Ads',
            'section_desc' => 'Configure the sticky ad shown near the bottom of article pages. You can add, edit, and remove multiple ads, while the frontend displays the first enabled one.',
            'add' => 'Add Ad Slot',
            'preview_title' => 'Ad Preview',
            'preview_badge' => 'Featured',
            'preview_heading' => 'Place the next action right after the reader finishes the article',
            'preview_copy' => 'Use a short supporting line here and guide the user with a sticky CTA beneath the article.',
            'preview_cta' => 'Learn More',
            'position_label' => 'Bottom sticky ad slot',
            'field_name' => 'Ad Name',
            'field_badge' => 'Badge Text',
            'field_title' => 'Ad Title',
            'field_copy' => 'Ad Copy *',
            'field_button_text' => 'Button Text *',
            'field_button_url' => 'Button URL *',
            'field_enabled' => 'Enable This Ad',
            'enabled_help' => 'The frontend displays only the first enabled ad and automatically falls through when it is disabled.',
            'placeholder_name' => 'Example: Main article CTA',
            'placeholder_badge' => 'Example: Featured / Limited Time',
            'placeholder_title' => 'Example: Get the industry content template and start using it now',
            'placeholder_copy' => 'Write a short supporting line, ideally one or two lines long',
            'placeholder_button_text' => 'Example: Contact Us',
            'placeholder_button_url' => '/contact or https://example.com',
            'empty_title' => 'No ad slots configured yet',
            'empty_desc' => 'Click “Add Ad Slot” to create the first sticky ad for article detail pages',
            'save' => 'Save Ad Slots',
            'new_slot' => 'New Ad Slot',
            'default_name' => 'Ad Slot :index',
            'validation_required' => 'Ad slot #:index is missing required content. Fill in the copy, button text, and button URL.',
            'save_failed' => 'Failed to save ad slots',
            'saved' => 'Article detail page ads updated successfully',
        ],
        'system_name' => 'GEOFlow',
    ],
    'distribution' => [
        'page_title' => 'Distribution',
        'page_heading' => 'Distribution',
        'page_subtitle' => 'Manage target site Agents, article distribution queues, and remote sync logs.',
        'create_title' => 'Create Distribution Channel',
        'create_heading' => 'Create Distribution Channel',
        'create_subtitle' => 'Create an independent Agent key for a target site.',
        'edit_title' => 'Edit Distribution Channel',
        'edit_heading' => 'Edit Distribution Channel',
        'edit_subtitle' => 'Maintain the target site Agent URL, status, and notes.',
        'detail_title' => 'Distribution Channel Detail',
        'jobs_title' => 'Distribution Queue',
        'jobs_heading' => 'Distribution Queue',
        'jobs_subtitle' => 'Track article sync jobs sent to target sites.',
        'channels_title' => 'Distribution Channels',
        'recent_logs_title' => 'Recent Distribution Logs',
        'empty_channels_title' => 'No distribution channels yet',
        'empty_channels_desc' => 'Create the first target site Agent channel so tasks can distribute articles after local publishing.',
        'empty_logs' => 'No distribution logs yet.',
        'empty_jobs' => 'No distribution jobs yet.',
        'secret_notice_title' => 'Save this channel secret now',
        'secret_notice_desc' => 'The secret is shown temporarily and hidden after refresh. Super admins can reveal it again from the channel detail page with their current password.',
        'queue_summary' => 'Pending :pending, failed :failed',
        'stats' => [
            'total' => 'Total Channels',
            'active' => 'Active Channels',
            'pending' => 'Pending Distributions',
            'failed' => 'Failed Distributions',
        ],
        'field' => [
            'name' => 'Channel Name',
            'domain' => 'Target Domain',
            'endpoint_url' => 'Target Site / Agent Base URL',
            'channel_type' => 'Channel Type',
            'front_mode' => 'Frontend URL Mode',
            'template_key' => 'Template Key',
            'status' => 'Status',
            'queue' => 'Queue',
            'key_id' => 'Key ID',
            'secret' => 'Secret',
            'health_status' => 'Health Status',
            'health_check_url' => 'Health Check URL',
            'last_used_at' => 'Last Used',
            'admin_password' => 'Current Admin Password',
            'article' => 'Article',
            'channel' => 'Channel',
            'action' => 'Action',
            'remote_url' => 'Remote URL',
            'attempt_count' => 'Attempts',
            'last_error' => 'Last Error',
            'event' => 'Event',
            'time' => 'Time',
        ],
        'button' => [
            'create' => 'Create Channel',
            'jobs' => 'View Queue',
            'health' => 'Test Connection',
            'save_and_generate_secret' => 'Save and Generate Secret',
            'save' => 'Save Channel',
            'pause' => 'Pause Channel',
            'activate' => 'Activate Channel',
            'rotate_secret' => 'Rotate Secret',
            'reveal_secret' => 'Verify and Show Secret',
            'download_package' => 'Download Site Package',
            'sync_settings' => 'Sync Settings',
            'update_target_site' => 'Update Target Site',
            'retry' => 'Retry',
            'edit_remote_article' => 'Edit Remote Article',
            'delete_remote_article' => 'Delete Remote Copy',
        ],
        'channel_type' => [
            'geoflow_agent' => 'GEOFlow Agent',
            'geoflow_agent_desc' => 'Use the GEOFlow target-site package and signed Agent protocol for new channel sites.',
            'wordpress_rest' => 'WordPress REST',
            'wordpress_rest_desc' => 'Publish, update, and delete posts through the WordPress REST API and Application Passwords.',
        ],
        'wordpress' => [
            'section_title' => 'WordPress Connection',
            'section_desc' => 'Enter the WordPress site URL, username, and Application Password. The Application Password is not the login password and can be created or revoked from the WordPress user profile.',
            'edit_section_desc' => 'Maintain WordPress REST publishing settings. Leave Application Password blank to keep the saved secret; enter a new value to replace it.',
            'username' => 'WordPress Username',
            'application_password' => 'Application Password',
            'application_password_help' => 'Create it in WordPress under Users - Profile - Application Passwords. GEOFlow stores it encrypted.',
            'application_password_update_help' => 'Leave blank to keep the current Application Password; enter a new value to revoke the old secret and save the new one.',
            'application_password_placeholder' => 'Leave blank to keep current secret',
            'post_status' => 'Default Post Status',
            'post_status_publish' => 'Publish',
            'post_status_draft' => 'Draft',
            'post_status_pending' => 'Pending Review',
            'post_status_private' => 'Private',
            'image_strategy' => 'Image Handling',
            'image_upload_to_media' => 'Upload to Media Library and replace URLs',
            'image_keep_original' => 'Keep original image URLs',
            'category_strategy' => 'Category Strategy',
            'category_match_or_create' => 'Match or create from GEOFlow category',
            'category_match_only' => 'Match existing categories only',
            'category_fixed' => 'Fixed category',
            'fixed_category' => 'Fixed Category ID or Name',
            'tag_strategy' => 'Tag Strategy',
            'tag_keywords_to_tags' => 'Sync keywords as tags',
            'tag_disabled' => 'Do not sync tags',
            'secret_hint' => 'The WordPress Application Password is encrypted and never shown in plaintext. To replace it, enter a new Application Password on the edit page.',
            'guide_title' => 'WordPress Connection Guide',
            'guide_desc' => 'WordPress channels do not need the GEOFlow target-site package or rewrite rules. After confirming the REST API works, publish the first test article as a draft.',
            'guide_step_password' => 'Create an Application Password in the WordPress user profile and confirm the user can edit, publish, and upload.',
            'guide_step_config' => 'Save the username, Application Password, post status, category, tag, and image strategies in GEOFlow.',
            'guide_step_health' => 'Click Test Connection so GEOFlow can check /wp-json and current user permissions.',
            'guide_step_draft' => 'Start with Draft status, verify categories, images, and layout, then switch to direct publishing.',
        ],
        'front_mode' => [
            'static' => 'Static file mode',
            'static_desc' => 'Default mode. Article distribution generates index.html and article/{slug}/index.html on the target site, suitable for normal hosting without rewrite setup.',
            'rewrite' => 'Rewrite mode',
            'rewrite_desc' => 'The target site renders pages dynamically and requires server rewrite rules. Use it when dynamic routing is required.',
        ],
        'remote_site' => [
            'section_title' => 'Target Site Settings',
            'section_desc' => 'These settings apply only to this distribution channel’s target site. They control the remote site title, SEO, copyright, and template selection without changing GEOFlow’s own site settings. Saving the channel automatically syncs them to the target site; if the remote site is unavailable, retry from “Sync Settings” on the detail page.',
            'theme_help' => 'Choose the frontend template used by the target site. The new target site package switches base styles by this template key; custom Agents can map it to their own theme or layout. Old site packages need to be downloaded and deployed again before template styling takes effect.',
        ],
        'target_update' => [
            'title' => 'Update Target Site',
            'desc' => 'After overwriting the target with a newer site package, click here to sync this channel’s settings and requeue already distributed articles for update. Article updates resend image assets and trigger the target site to rebuild its home page, article pages, llms.txt, and sitemap.txt.',
        ],
        'rewrite' => [
            'title' => 'Rewrite Rules',
            'desc' => 'Apache usually reads the bundled .htaccess after unzip. Prefer the Nginx/BT rules in the Nginx server config; if BT Panel rewrite does not apply location blocks, use the BT rewrite-only rules. Rules are generated from the current Agent Base URL.',
            'base_path' => 'Current matched path: :path',
            'copy_apache' => 'Copy Apache .htaccess',
            'copy_nginx' => 'Copy Nginx Server Rules',
            'copy_bt' => 'Copy BT Rewrite-Only Rules',
            'copied' => 'Copied',
        ],
        'status' => [
            'active' => 'Active',
            'paused' => 'Paused',
        ],
        'health_status' => [
            'ok' => 'OK',
            'failed' => 'Failed',
        ],
        'job_status' => [
            'queued' => 'Queued',
            'sending' => 'Sending',
            'synced' => 'Synced',
            'failed' => 'Failed',
        ],
        'action' => [
            'publish' => 'Publish',
            'update' => 'Update',
            'delete' => 'Delete',
        ],
        'job_state' => [
            'remote_copy_deleting' => 'Deleting',
            'remote_copy_deleted' => 'Remote copy deleted',
        ],
        'log_level' => [
            'info' => 'Info',
            'warning' => 'Warning',
            'error' => 'Error',
            'debug' => 'Debug',
        ],
        'article_status' => [
            'queued' => 'Distributing',
            'synced' => 'Distributed',
            'failed' => 'Distribution Failed',
        ],
        'task_status' => [
            'queued' => 'Distributing :count',
            'synced' => 'Distributed :count',
            'failed' => 'Distribution Failed :count',
        ],
        'filter' => [
            'all_statuses' => 'All Statuses',
            'all_channels' => 'All Channels',
        ],
        'placeholder' => [
            'name' => 'Example: Main website GEO channel',
            'endpoint_url' => 'Example: www.example.com or https://www.example.com',
            'description' => 'Optional: note the site purpose, owner, or install details.',
        ],
        'help' => [
            'channel_type' => 'Choose the target type for content sync. GEOFlow Agent uses a target-site package; WordPress REST connects to an existing WordPress site.',
            'channel_type_locked' => 'The channel type stays fixed after creation to avoid mixing remote IDs and protocol semantics for already synced articles.',
            'endpoint_url' => 'For GEOFlow Agent channels, enter the base URL where the target site package is installed. For WordPress channels, enter the WordPress site URL or /wp-json URL. If no scheme is provided, GEOFlow uses https://.',
            'front_mode' => 'New channels use static file mode by default. Static mode generates real HTML after upload and unzip; rewrite mode requires server rewrite rules.',
            'reveal_secret' => 'Only super admins can temporarily reveal the plaintext secret with their current password. It is hidden again after refresh.',
            'download_package' => 'The site package includes this channel secret, so super admins must verify their current password before downloading it.',
        ],
        'validation' => [
            'endpoint_url' => 'Enter a valid http or https Agent base URL.',
            'wordpress_username' => 'Enter the WordPress username.',
            'wordpress_application_password' => 'Enter the WordPress Application Password.',
        ],
        'detail' => [
            'basic' => 'Basic Information',
            'secret' => 'Secret Information',
            'agent_guide' => 'Target Site Deployment Guide',
            'agent_package' => 'Recommended Deployment',
            'agent_package_name' => 'Target site ZIP package with key and site settings',
            'agent_step_deploy' => 'Download the target site package, upload it to the directory behind the Agent Base URL, and unzip it.',
            'agent_step_configure' => 'Confirm the storage directory is writable; static mode does not require manually editing PHP keys.',
            'agent_step_health' => 'Return here and click Test Connection. The system will detect the /index.php no-rewrite entry automatically.',
            'agent_step_task' => 'Bind tasks to this channel on the task create or edit page. Locally published articles will enter the distribution queue automatically.',
            'agent_config_hint' => 'The target site package includes the Agent API, frontend pages, llms.txt, and sitemap.txt; uploading and unzipping is usually enough.',
            'target_package' => 'Target Site Package',
            'target_package_desc' => 'Generate a minimal PHP site package for this channel. Upload and unzip it to get Agent endpoints, a home list page, article detail pages, and the current channel site settings and template key.',
            'target_package_files' => 'Package Contents',
            'target_package_file_config' => 'config.php: channel secret, site name, and base URL',
            'target_package_file_index' => 'public/index.php: Agent endpoints, home list page, and article detail page',
            'target_package_file_storage' => 'storage/articles: local JSON storage for received articles',
            'target_package_feature_health' => 'Health Check Endpoint',
            'target_package_feature_article' => 'Article Receive Endpoint',
            'target_package_feature_home' => 'Home List Page',
            'target_package_feature_detail' => 'Article Detail Page',
            'package_configured_base' => 'Agent Base URL Written Into Package',
            'package_no_rewrite_entry' => 'No-Rewrite Test Entry',
            'health_before_deploy_title' => 'Test Connection returns 404 until the target site package is deployed',
            'health_before_deploy_desc' => 'Download the site package and unzip it directly into the directory that matches the Agent Base URL. If the server has no rewrite config, Test Connection automatically tries the /index.php entry and updates this channel’s Agent Base URL after success.',
        ],
        'confirm' => [
            'rotate_secret' => 'Rotate this channel secret? The old secret will stop working immediately and the new secret is shown temporarily until refresh.',
        ],
        'message' => [
            'created' => 'Distribution channel created.',
            'updated' => 'Distribution channel updated.',
            'updated_and_settings_synced' => 'Distribution channel updated and synced to the target site.',
            'paused' => 'Distribution channel paused.',
            'activated' => 'Distribution channel activated.',
            'secret_rotated' => 'Distribution channel secret rotated.',
            'secret_revealed' => 'Channel secret temporarily revealed. Copy it into the target site Agent config now.',
            'secret_reveal_forbidden' => 'Only super admins can reveal channel secrets.',
            'package_download_forbidden' => 'Only super admins can download target site packages that include secrets.',
            'password_invalid' => 'The current admin password is incorrect.',
            'active_secret_not_found' => 'This channel has no active secret. Rotate the secret first.',
            'secret_decrypt_failed' => 'Failed to decrypt the channel secret. Rotate it and configure the target Agent again.',
            'not_found' => 'Distribution channel not found.',
            'job_not_found' => 'Distribution job not found.',
            'retry_queued' => 'Distribution job requeued.',
            'health_ok' => 'Health check passed: ',
            'health_failed' => 'Health check failed: :message',
            'settings_synced' => 'Target site settings synced.',
            'settings_synced_with_content_refresh' => 'Target site settings synced. :count articles were requeued to refresh remote pages and image assets.',
            'settings_sync_failed' => 'Failed to sync target site settings: :message',
            'remote_article_updated' => 'Remote article updated, and the local GEOFlow article was updated too.',
            'remote_article_update_failed' => 'Failed to update the remote article: :message',
            'remote_article_deleted' => 'Remote article copy deleted and the target home page refreshed.',
            'remote_article_delete_failed' => 'Failed to delete the remote article: :message',
            'wordpress_secret_rotation_hint' => 'For WordPress channels, replace the secret by entering a new Application Password on the edit page.',
            'package_not_available_for_wordpress' => 'WordPress channels do not need a target-site package. Configure the WordPress REST connection instead.',
        ],
        'remote_article' => [
            'edit_title' => 'Edit Remote Article',
            'edit_desc' => 'This updates the local GEOFlow article first, then syncs the same content to this target channel.',
            'title' => 'Title',
            'excerpt' => 'Excerpt',
            'content' => 'Markdown Content',
            'keywords' => 'Keywords',
            'meta_description' => 'SEO Description',
        ],
    ],
    'task_create' => [
        'page_title' => 'Create Task',
        'page_heading' => 'Create New Task',
        'page_subtitle' => 'Configure the parameters for an AI content generation task.',
        'section' => [
            'basic_title' => 'Basic Information',
            'basic_desc' => 'Set the basic task information.',
            'content_title' => 'Content Settings',
            'content_desc' => 'Configure AI content generation parameters.',
            'image_title' => 'Image Settings',
            'image_desc' => 'Configure article illustration behavior.',
            'publish_title' => 'Review and Publishing',
            'publish_desc' => 'Configure manual review, draft storage, and auto-publishing parameters.',
            'distribution_title' => 'Content Distribution',
            'distribution_desc' => 'Choose target site Agents for articles after local publishing.',
            'seo_title' => 'SEO Settings',
            'seo_desc' => 'Configure automatic keyword and description generation.',
            'category_title' => 'Category Settings',
            'category_desc' => 'Configure how categories are assigned to generated articles.',
            'advanced_title' => 'Advanced Settings',
            'advanced_desc' => 'Configure advanced task execution behavior.',
        ],
        'field' => [
            'task_name' => 'Task Name',
            'title_library' => 'Title Library',
            'task_status' => 'Task Status',
            'content_prompt' => 'Content Prompt',
            'ai_model' => 'AI Model',
            'model_selection_mode' => 'Model Selection Mode',
            'knowledge_base' => 'Knowledge Base',
            'author' => 'Author',
            'image_library' => 'Image Library',
            'image_count' => 'Image Count',
            'need_review' => 'Require manual review before publishing',
            'publish_interval' => 'Publish Interval (minutes)',
            'auto_keywords' => 'Generate keywords automatically',
            'auto_description' => 'Generate description automatically',
            'category_mode' => 'Category Mode',
            'fixed_category' => 'Fixed Category',
            'article_limit' => 'Total Article Limit',
            'draft_limit' => 'Draft Pool Limit',
            'loop_mode' => 'Loop Generation',
        ],
        'placeholder' => [
            'task_name' => 'Example: Tech news auto-generation task',
        ],
        'option' => [
            'select_title_library' => 'Select a title library',
            'library_count' => ':name (:count titles)',
            'status_active' => 'Active',
            'status_paused' => 'Paused',
            'select_prompt' => 'Select a content prompt',
            'select_ai_model' => 'Select an AI model',
            'ai_model_priority' => ':name (priority :priority)',
            'model_selection_fixed' => 'Fixed Model',
            'model_selection_smart_failover' => 'Smart Model Failover',
            'no_knowledge_base' => 'Do not use a knowledge base',
            'random_author' => 'Pick randomly from the author library',
            'no_images' => 'Do not use images',
            'image_library_count' => ':name (:count images)',
            'no_image_count' => 'No images',
            'image_count' => ':count image(s)',
            'category_smart' => 'Smart Mode',
            'category_fixed' => 'Fixed Category Mode',
            'category_random' => 'Random Category Mode',
            'select_category' => 'Select a category',
            'categories_load_failed' => 'Failed to load categories',
        ],
        'help' => [
            'knowledge_base' => 'When selected, the system retrieves the most relevant snippets for the title/keywords and injects them into the content prompt as <code>{{Knowledge}}</code>.',
            'model_selection_mode' => 'Fixed mode always uses the selected primary model. Smart model failover retries with the next available chat model only after the primary model call fails.',
            'image_count' => 'The system automatically picks images from the library and inserts them under matching H2/H3 headings.',
            'need_review' => 'If enabled, generated articles must pass manual review before auto-publishing.',
            'publish_interval' => 'Enter minutes here. The system publishes one approved draft at this interval.',
            'auto_keywords' => 'Use AI to extract keywords from the article title automatically.',
            'auto_description' => 'Use AI to extract a description from the article content automatically.',
            'category_mode' => 'Choose how categories are assigned to generated articles.',
            'category_smart' => 'AI selects the most suitable category based on the article title and available category names.',
            'category_fixed' => 'All generated articles will be published into the selected fixed category.',
            'category_random' => 'Generated articles will be distributed randomly across available categories.',
            'fixed_category' => 'Choose one category. All generated articles will be published there.',
            'article_limit' => 'Maximum number of articles this task may generate. Generation stops after this limit is reached.',
            'draft_limit' => 'Maximum unpublished drafts kept in the draft pool. Generation pauses when the pool is full and resumes after drafts are published or reviewed.',
            'loop_mode' => 'When enabled, the task repeats titles after the selected title library is exhausted.',
            'no_categories_configured' => 'No categories are available yet. Please create at least one category before creating a task.',
        ],
        'preview' => [
            'categories_title' => 'Available Categories',
            'categories_count' => ':count categories available',
        ],
        'distribution' => [
            'empty' => 'No active distribution channels yet.',
            'create_link' => 'Create a channel first',
            'help' => 'After selecting channels, GEOFlow queues remote sync according to the publish scope. Remote failures do not affect the local article status.',
            'scope_title' => 'Publish Scope',
            'scope_help' => 'Choose whether generated articles publish to GEOFlow, target channels, or both.',
            'scope_local_and_distribution' => 'Publish to GEOFlow and channels',
            'scope_local_and_distribution_desc' => 'Publish the article locally and sync it to selected target channels.',
            'scope_distribution_only' => 'Publish to channels only',
            'scope_distribution_only_desc' => 'Keep a private local management copy; generate public pages only on target channels.',
            'scope_local_only' => 'Publish to GEOFlow only',
            'scope_local_only_desc' => 'Publish locally and do not enqueue remote distribution.',
        ],
        'message' => [
            'created' => 'Task created successfully.',
            'created_active_suffix' => 'The task is active. The scheduler will enqueue it automatically and workers will execute it.',
            'created_paused_suffix' => 'The task was created in a paused state. You can activate it from the task list.',
        ],
        'error' => [
            'name_required' => 'Task name is required',
            'title_library_required' => 'Please select a title library',
            'prompt_required' => 'Please select a content prompt',
            'ai_model_required' => 'Please select an AI model',
            'draft_limit_too_large' => 'The draft pool limit cannot be greater than the total article limit.',
            'model_selection_mode_invalid' => 'Invalid model selection mode',
            'fixed_category_required' => 'A category is required when fixed category mode is enabled',
            'no_categories_configured' => 'Please create at least one category first',
            'title_library_missing' => 'The selected title library does not exist',
            'prompt_missing' => 'The selected content prompt does not exist',
            'ai_model_missing' => 'The selected AI model does not exist or is inactive',
            'create_failed' => 'Failed to create the task',
            'create_exception' => 'Create failed: :message',
        ],
        'confirm' => [
            'create' => 'Create this task now?',
        ],
    ],
    'task_edit' => [
        'page_title' => 'Edit Task',
        'page_heading' => 'Edit Task',
        'section' => [
            'basic_title' => 'Basic Information',
            'ai_title' => 'AI Settings',
            'publish_title' => 'Publishing Settings',
            'author_title' => 'Author Settings',
            'optimize_title' => 'Content Optimization',
            'control_title' => 'Task Control',
        ],
        'field' => [
            'task_name' => 'Task Name',
            'title_library' => 'Title Library',
            'image_library' => 'Image Library',
            'image_count' => 'Image Count',
            'content_prompt' => 'Article Content Prompt',
            'ai_model' => 'AI Model',
            'model_selection_mode' => 'Model Selection Mode',
            'knowledge_base' => 'Knowledge Base',
            'need_review' => 'Require manual review before publishing',
            'publish_interval' => 'Publish Interval (auto-approved only)',
            'author_mode' => 'Author Mode',
            'custom_author' => 'Select Author',
            'auto_keywords' => 'Generate keywords automatically',
            'auto_description' => 'Generate description automatically',
            'article_limit' => 'Total Article Limit',
            'draft_limit' => 'Draft Pool Limit',
            'loop_mode' => 'Loop Generation',
            'task_status' => 'Task Status',
        ],
        'option' => [
            'select_title_library' => 'Select a title library',
            'library_count' => ':name (:count titles)',
            'no_images' => 'Do not use images',
            'image_library_count' => ':name (:count images)',
            'no_image_count' => 'No images',
            'image_count' => ':count image(s)',
            'select_prompt' => 'Select a prompt',
            'select_ai_model' => 'Select an AI model',
            'ai_model_priority' => ':name (priority :priority)',
            'model_selection_fixed' => 'Fixed Model',
            'model_selection_smart_failover' => 'Smart Model Failover',
            'daily_remaining' => 'Remaining today: :count',
            'no_knowledge_base' => 'Do not use a knowledge base',
            'interval_30m' => '30 minutes',
            'interval_1h' => '1 hour',
            'interval_2h' => '2 hours',
            'interval_4h' => '4 hours',
            'interval_8h' => '8 hours',
            'interval_24h' => '24 hours',
            'author_random' => 'Pick randomly from the author library',
            'author_custom' => 'Use a specific author',
            'select_author' => 'Select an author',
            'status_active' => 'Active',
            'status_paused' => 'Paused',
        ],
        'help' => [
            'knowledge_base' => 'When selected, the system retrieves the most relevant snippets for the title/keywords and injects them into <code>{{Knowledge}}</code> and related conditional blocks.',
            'model_selection_mode' => 'Fixed mode only uses the current primary model. Smart model failover switches to the next available chat model by priority after the primary call fails.',
        ],
        'sidebar' => [
            'stats_title' => 'Task Statistics',
            'total_articles' => 'Total Articles',
            'published_articles' => 'Published',
            'draft_articles' => 'Drafts',
            'pending_review' => 'Pending Review',
            'loop_count' => 'Loop Count',
            'quick_actions_title' => 'Quick Actions',
            'info_title' => 'Task Information',
            'last_updated' => 'Last Updated',
            'current_status' => 'Current Status',
        ],
        'button' => [
            'save_changes' => 'Save Changes',
            'manage_articles' => 'Manage Articles',
            'test_execute' => 'Test Run',
        ],
        'status' => [
            'completed' => 'Completed',
        ],
        'message' => [
            'update_success' => 'Task updated successfully',
        ],
        'error' => [
            'invalid_chat_model' => 'Please select a valid chat model',
            'invalid_model_selection_mode' => 'Invalid model selection mode',
            'update_failed' => 'Failed to update the task',
            'update_exception' => 'Update failed: :message',
        ],
    ],
    'article_create' => [
        'page_title' => 'Create Article',
        'page_heading' => 'Create Article',
        'page_subtitle' => 'Create a new article manually. This page follows the unified review and publish state rules.',
        'section' => [
            'basic_title' => 'Basic Information',
            'content_title' => 'Article Content',
            'seo_title' => 'SEO Settings',
            'publish_title' => 'Publish Settings',
            'recommendation_title' => 'Homepage Promotion',
            'category_author_title' => 'Category and Author',
            'markdown_help_title' => 'Markdown Help',
        ],
        'field' => [
            'title' => 'Article Title',
            'excerpt' => 'Excerpt',
            'keywords' => 'Keywords',
            'meta_description' => 'Meta Description',
            'publish_status' => 'Publish Status',
            'review_status' => 'Review Status',
            'is_hot' => 'Hot Article',
            'is_featured' => 'Featured Article',
            'category' => 'Category',
            'author' => 'Author',
        ],
        'placeholder' => [
            'title' => 'Enter the article title',
            'excerpt' => 'Optional. It will be generated automatically if left blank',
            'content' => 'Enter the article content...',
            'keywords' => 'Separate multiple keywords with commas',
            'meta_description' => 'Page description shown in search results',
        ],
        'option' => [
            'select_category' => 'Select a category',
            'select_author' => 'Select an author',
        ],
        'help' => [
            'markdown_supported' => 'Markdown supported',
            'review_status' => 'Pending or rejected states fall back to draft automatically. Publish status also keeps review state and publish time consistent.',
            'recommendation' => 'Only published articles are shown on the frontend. Featured articles are limited to the latest 5; multiple hot articles rotate in the homepage hot area.',
            'is_hot' => 'Show this article in the homepage hot carousel and hot sidebar list.',
            'is_featured' => 'Show this article in the homepage featured list. If more than 5 are selected, the latest 5 are shown.',
        ],
        'button' => [
            'show_preview' => 'Show Preview',
            'hide_preview' => 'Hide Preview',
        ],
        'error' => [
            'title_required' => 'Article title is required',
            'content_required' => 'Article content is required',
            'category_required' => 'Please select a category',
            'author_required' => 'Please select an author',
            'create_failed' => 'Failed to create the article',
            'create_exception' => 'Create failed: :message',
        ],
    ],
    'article_edit' => [
        'page_title' => 'Edit Article',
        'page_heading' => 'Edit Article',
        'section' => [
            'basic_title' => 'Basic Information',
            'content_title' => 'Article Content',
            'seo_title' => 'SEO Settings',
            'publish_title' => 'Publish Settings',
            'recommendation_title' => 'Homepage Promotion',
            'category_author_title' => 'Category and Author',
            'info_title' => 'Article Information',
        ],
        'field' => [
            'title' => 'Article Title',
            'excerpt' => 'Excerpt',
            'keywords' => 'Keywords',
            'meta_description' => 'Meta Description',
            'publish_status' => 'Publish Status',
            'review_status' => 'Review Status',
            'is_hot' => 'Hot Article',
            'is_featured' => 'Featured Article',
            'category' => 'Category',
            'author' => 'Author',
        ],
        'placeholder' => [
            'keywords' => 'Separate multiple keywords with commas',
        ],
        'option' => [
            'select_category' => 'Select a category',
            'select_author' => 'Select an author',
        ],
        'help' => [
            'markdown_supported' => 'Markdown supported',
            'review_status' => 'Saving automatically reconciles publish status, review result, and publish time to avoid conflicting states.',
            'recommendation' => 'Only published articles are shown on the frontend. Featured articles are limited to the latest 5; multiple hot articles rotate in the homepage hot area.',
            'is_hot' => 'Show this article in the homepage hot carousel and hot sidebar list.',
            'is_featured' => 'Show this article in the homepage featured list. If more than 5 are selected, the latest 5 are shown.',
        ],
        'info' => [
            'article_id' => 'Article ID',
            'slug' => 'URL Slug',
            'source_task' => 'Source Task',
            'manual_source' => 'Created manually',
            'published_at' => 'Published At',
        ],
        'button' => [
            'show_preview' => 'Show Preview',
            'hide_preview' => 'Hide Preview',
            'save_changes' => 'Save Changes',
            'view_article' => 'View Article',
        ],
        'message' => [
            'update_success' => 'Article updated successfully',
        ],
        'error' => [
            'title_required' => 'Article title is required',
            'content_required' => 'Article content is required',
            'category_required' => 'Please select a category',
            'author_required' => 'Please select an author',
            'update_failed' => 'Failed to update the article',
            'update_exception' => 'Update failed: :message',
        ],
    ],
    'task_execute' => [
        'page_title' => 'Task Execution Test',
        'page_heading' => 'Task Execution Test',
        'button' => [
            'back_to_tasks' => 'Back to Task List',
            'execute' => 'Run Task',
        ],
        'section' => [
            'task_info' => 'Task Information',
            'execution_control' => 'Execution Control',
            'execution_log' => 'Execution Log',
            'recent_runs' => 'Recent Runs',
            'recent_runs_desc' => 'This section shows the latest queue runs for the task, with failure details expanded inline.',
            'stats' => 'Statistics',
            'recent_articles' => 'Recent Articles',
        ],
        'label' => [
            'last_failed_at' => 'Last failed at :time',
            'task_name' => 'Task Name',
            'status' => 'Status',
            'title_library' => 'Title Library',
            'ai_model' => 'AI Model',
            'publish_interval' => 'Publish Interval',
            'article_limit' => 'Total Article Limit',
            'draft_limit' => 'Draft Pool Limit',
            'created_articles' => 'Created Articles',
            'published_articles' => 'Published Articles',
            'generated_title' => 'Generated Title',
        ],
        'help' => [
            'execute_once' => 'Trigger a one-time execution test for this task.',
            'shared_engine' => 'Execution requests are pushed to the task queue and processed asynchronously by the worker.',
            'queue_mode' => 'If the task is already pending or running, the system will not create a duplicate job.',
        ],
        'confirm' => [
            'execute' => 'Run this task now?',
        ],
        'stats' => [
            'total_articles' => 'Total Articles',
            'published' => 'Published',
            'pending_review' => 'Pending Review',
        ],
        'empty' => [
            'no_runs' => 'No execution records yet',
            'no_articles' => 'No articles yet',
        ],
        'run' => [
            'cancelled' => 'Cancelled',
            'run_id' => 'Run #:id',
            'job_id' => 'Job #:id',
            'started_at' => 'Started: :time',
            'finished_at' => 'Finished: :time',
            'duration_seconds' => 'Duration: :seconds s',
            'article_id' => 'Article ID: #:id',
            'attempts' => 'Attempts: :current / :max',
        ],
        'value' => [
            'seconds' => ':count s',
            'articles' => ':count article(s)',
        ],
        'log' => [
            'starting' => 'Starting task execution...',
            'queueing' => 'Queueing the task execution request...',
            'queued' => 'Task queued successfully, job #:job_id',
            'success' => 'Task executed successfully: :result',
            'failed' => 'Task execution failed: :message',
            'queue_failed' => 'Failed to queue the task: :message',
            'exception' => 'Execution exception: :message',
        ],
        'message' => [
            'success' => 'Task executed successfully',
            'queued' => 'Task queued successfully, job #:job_id',
        ],
        'error' => [
            'invalid_task_id' => 'Invalid task ID',
            'task_not_found' => 'Task not found',
            'failed' => 'Task execution failed: :message',
            'queue_failed' => 'Failed to queue the task: :message',
            'exception' => 'Execution exception: :message',
        ],
        'failure' => [
            'no_error' => 'No error information',
            'empty_content_label' => 'Empty content blocked',
            'empty_content_detail' => 'The model returned an empty body. The system marked the run as failed and did not create an article.',
            'too_short_label' => 'Content too short',
            'too_short_detail' => 'The generated content did not meet the minimum body length, so it was not stored.',
            'no_titles_label' => 'Title library exhausted',
            'no_titles_detail' => 'No available titles remain in the current title library. Add more titles before retrying.',
            'task_paused_label' => 'Task paused',
            'task_paused_detail' => 'This is a manual cancellation record, not a generation failure.',
            'default_label' => 'Execution failed',
        ],
    ],
    'article_view' => [
        'page_title' => 'View Article',
        'page_heading' => 'View Article',
        'section' => [
            'content' => 'Article Content',
            'images' => 'Article Images',
            'info' => 'Article Information',
            'status' => 'Status Management',
            'seo' => 'SEO Information',
            'quick_actions' => 'Quick Actions',
        ],
        'field' => [
            'original_keyword' => 'Original Keyword',
        ],
        'help' => [
            'status_sync' => 'When publish status or review result changes, the system synchronizes publish time automatically and avoids conflicting workflow states.',
        ],
        'button' => [
            'frontend_preview' => 'Frontend Preview',
            'edit_article' => 'Edit Article',
            'view_frontend' => 'View Frontend',
            'delete_article' => 'Delete Article',
        ],
        'confirm' => [
            'delete' => 'Delete this article?',
        ],
        'message' => [
            'status_updated' => 'Publish status updated. Review state and publish time were synchronized.',
            'review_updated' => 'Review result updated',
            'review_published_suffix' => '; the article is now published',
            'review_draft_suffix' => '; the article was moved back to draft',
        ],
        'error' => [
            'status_update_failed' => 'Failed to update publish status',
            'review_update_failed' => 'Failed to update review result',
        ],
    ],
    'api_tokens' => [
        'page_title' => 'API Token Management',
        'page_heading' => 'API Token Management',
        'page_subtitle' => 'Generate machine credentials for the CLI and future skills.',
        'notice' => [
            'one_time_visible' => 'This new token is shown only once',
        ],
        'section' => [
            'create' => 'Create Token',
            'list' => 'Existing Tokens',
        ],
        'field' => [
            'name' => 'Name *',
            'expires_at' => 'Expiration Time',
        ],
        'placeholder' => [
            'name' => 'Example: Local CLI Token',
        ],
        'help' => [
            'expires_at' => 'Blank defaults to 30 days; choose a later time only when needed.',
        ],
        'column' => [
            'name' => 'Name',
            'created_by' => 'Created By',
            'last_used' => 'Last Used',
            'expires_at' => 'Expires At',
            'status' => 'Status',
        ],
        'value' => [
            'system' => 'System',
            'never_used' => 'Never used',
            'no_expiry' => 'No expiry',
        ],
        'button' => [
            'create' => 'Create Token',
            'revoke' => 'Revoke',
            'copy' => 'Copy',
        ],
        'confirm' => [
            'revoke' => 'Revoke this token?',
        ],
        'empty' => [
            'no_tokens' => 'No tokens yet',
        ],
        'status' => [
            'revoked' => 'Revoked',
        ],
        'message' => [
            'created' => 'Token created successfully. Copy it now and store it securely.',
            'revoked' => 'Token revoked',
        ],
        'error' => [
            'operation_failed' => 'Operation failed: :message',
        ],
    ],
    'system_diagnostics' => [
        'page_title' => 'System Diagnostics',
        'page_heading' => 'System Diagnostics',
        'page_subtitle' => 'Inspect system status and potential issues.',
        'button' => [
            'recover_stale' => 'Recover Stale Jobs',
        ],
        'confirm' => [
            'recover_stale' => 'Recover stale queue jobs now?',
        ],
        'message' => [
            'cleaned' => 'Recovered :count stale queue job(s)',
        ],
        'section' => [
            'php_processes' => 'PHP Processes',
            'port_8080' => 'Port 8080 Usage',
            'worker_status' => 'Worker Status',
            'task_status' => 'Task Status',
        ],
        'column' => [
            'current_job' => 'Current Job',
            'last_heartbeat' => 'Last Heartbeat',
            'name' => 'Name',
            'batch_status' => 'Batch Status',
        ],
        'empty' => [
            'no_php_processes' => 'No PHP processes found',
            'port_8080_free' => 'Port 8080 is not occupied. The server may not be running.',
            'no_worker_heartbeats' => 'No active worker heartbeats found',
        ],
        'value' => [
            'idle' => 'Idle',
        ],
        'badge' => [
            'server_process' => 'Server Process',
            'queue_worker' => 'Queue Worker',
        ],
    ],
    'locale' => [
        'zh-CN' => 'Simplified Chinese',
        'en' => 'English',
        'ja' => 'Japanese',
        'es' => 'Spanish',
        'ru' => 'Russian',
    ],
    'url_import' => [
        'page_title' => 'URL Smart Import',
        'page_heading' => 'URL Smart Import',
        'page_subtitle' => 'Enter a web page URL to extract the main content and generate knowledge, keyword, and title assets automatically.',
        'button' => [
            'back_to_materials' => 'Back to Materials',
            'view_history' => 'View Import History',
            'view_prd' => 'View PRD',
            'start' => 'Start Parsing',
            'save_draft' => 'Save Draft',
            'commit' => 'Commit to Libraries',
            'refresh_result' => 'Refresh to View Result',
        ],
        'ai_required' => [
            'title' => 'URL Smart Import requires an available AI model first',
            'desc' => 'The system calls the default backend chat model to identify the core business, clean the knowledge base, extract atomic facts, produce GEO keywords, and generate title suggestions from the page JSON. Configure the API URL and key before starting an import job.',
            'button' => 'Configure AI Model',
        ],
        'section' => [
            'new_job' => 'Create Import Job',
            'new_job_desc' => 'This stage provides a single-page ingestion skeleton. Full extraction, AI cleaning, preview confirmation, and one-click import will be added next.',
            'source' => '1. Source',
            'strategy' => '2. Strategy',
            'targets' => '3. Target Libraries',
            'outputs' => '4. Output',
            'capacity' => 'Current Library Capacity',
            'scope' => 'Current Scope',
            'recommendation' => 'Recommended Usage',
            'progress' => 'Parsing Progress',
            'stage_status' => 'Stage Status',
            'logs' => 'Processing Logs',
            'result_preview' => 'Result Preview',
            'result_preview_desc' => 'Review the quality first, then decide whether to commit it into the libraries.',
            'workflow' => 'Processing Workflow',
            'workflow_desc' => 'Track every step from URL normalization and page fetch to material preview.',
            'logs_desc' => 'Live logs for fetching, extraction, analysis, and import actions.',
            'next_flow' => 'Next Step',
            'processing_hint' => 'Current step: :current; next: :next. The log panel streams each step in sync, and you can refresh to view the preview after completion.',
        ],
        'field' => [
            'url' => 'Target URL',
            'project_name' => 'Project / Theme',
            'source_label' => 'Source Label',
            'content_language' => 'Content Language',
            'author' => 'Related Author',
            'notes' => 'Notes',
            'target_knowledge_base' => 'Target Knowledge Base',
            'target_keyword_library' => 'Target Keyword Library',
            'target_title_library' => 'Target Title Library',
        ],
        'placeholder' => [
            'project_name' => 'Example: Kids Coding Research',
            'source_label' => 'Example: Industry Report / Competitor Page / Media Coverage',
            'notes' => 'Record the objective, page value, and intended downstream use',
        ],
        'option' => [
            'auto_detect' => 'Auto Detect',
            'not_specified' => 'Not specified',
            'create_or_later' => 'Create new or decide later',
        ],
        'help' => [
            'url' => 'Start with an article detail page, report page, or landing page with clear main content. Avoid homepages first.',
            'url_optional_scheme' => 'You can enter a domain or path directly. The system will add https:// automatically. Only public http/https pages are supported.',
        ],
        'strategy' => [
            'ai_clean' => 'AI Cleaning',
            'ai_clean_desc' => 'Remove ads, navigation, and template noise while keeping the main knowledge content.',
            'semantic' => 'Semantic Analysis',
            'semantic_desc' => 'Extract topic entities, keywords, query intents, and title directions.',
            'allow_duplicate' => 'Allow Duplicate Imports',
            'allow_duplicate_desc' => 'By default the system checks duplicates using URL, title, and content hash.',
        ],
        'output' => [
            'knowledge' => 'Generate Knowledge Base',
            'keywords' => 'Generate Keyword Library',
            'titles' => 'Generate Title Library',
        ],
        'stats' => [
            'knowledge_bases' => 'Knowledge Bases',
            'keyword_libraries' => 'Keyword Libraries',
            'title_libraries' => 'Title Libraries',
        ],
        'value' => [
            'count_units' => ':count',
        ],
        'scope' => [
            'single_page' => 'This phase supports only high-quality single-page ingestion, not full-site crawling.',
            'preview_first' => 'Results enter preview first, and administrators confirm the final import.',
            'security' => 'Future iterations will add URL validation, duplicate detection, and SSRF protection.',
        ],
        'recommendation' => [
            'copy' => 'Prefer well-structured article pages, report pages, or topic pages. Avoid homepages and noisy aggregate feeds.',
        ],
        'progress' => [
            'waiting' => 'Waiting for the job to start',
            'in_progress' => 'In Progress',
            'done' => 'Done',
            'waiting_short' => 'Waiting',
            'processing' => 'Processing',
            'completed' => 'Completed',
            'result_ready' => 'Processing is complete. Refresh the page to view the parsing preview.',
        ],
        'stream' => [
            'current' => 'Processing: :current',
            'next' => 'Processing: :current; next: :next',
            'completed' => 'Completed: :current',
            'failed' => 'Failed. Check the processing logs.',
        ],
        'preview' => [
            'source' => 'Source',
            'summary' => 'Summary',
            'knowledge' => 'Knowledge Preview',
            'keywords' => 'Keywords',
            'titles' => 'Suggested Titles',
            'raw_json' => 'Page JSON',
            'ai_powered' => 'AI parsing: :model',
            'local_fallback' => 'Local rule parsing',
            'empty_summary' => 'No summary yet',
            'empty_knowledge' => 'No knowledge preview yet',
        ],
        'workflow' => [
            'queued' => 'Create import job',
            'fetch' => 'Fetch target page',
            'page_json' => 'Generate page JSON',
            'knowledge' => 'AI-clean knowledge base',
            'keywords' => 'Extract core business terms',
            'titles' => 'Generate title library',
            'preview' => 'Generate preview',
            'imported' => 'Confirm import',
        ],
        'workflow_desc' => [
            'queued' => 'Save the URL, import options, and creator information.',
            'fetch' => 'Normalize the URL, request the page, and record the response status.',
            'page_json' => 'Persist the page title, description, and body text as structured JSON first.',
            'knowledge' => 'Clean the page JSON and generate structured knowledge-base Markdown.',
            'keywords' => 'Extract 10 core business terms from the knowledge base while avoiding brand-only terms and long sentences.',
            'titles' => 'Generate 50 title suggestions around core terms and GEO scenarios.',
            'preview' => 'Review the parsing result before writing anything into the libraries.',
            'imported' => 'Write assets into the knowledge, keyword, and title libraries.',
        ],
        'log' => [
            'fetch_start' => 'Fetching: :url',
            'fetch_done' => 'Page fetched. HTML length: :length bytes',
            'page_json_start' => 'Generating page JSON with title, description, and body text',
            'extract_done' => 'Extraction completed. Text: :chars chars',
            'page_json_done' => 'Page JSON generated. Cleanable text: :chars chars',
            'clean_start' => 'Cleaning page JSON and extracting main content plus citable facts',
            'clean_done' => 'Main content cleaned. Kept text: :chars chars',
            'keywords_start' => 'Extracting core business terms from the knowledge base and filtering brand-only terms, long sentences, and generic words',
            'keywords_done' => 'Core business term extraction completed: :count',
            'titles_start' => 'Generating GEO title candidates from the core business terms',
            'titles_done' => 'Title generation completed: :count',
            'knowledge_start' => 'Building knowledge-base Markdown',
            'knowledge_done' => 'Knowledge base completed. Content: :chars chars',
            'analyze_done' => 'Analysis completed. Keywords: :keywords, titles: :titles',
            'ai_analyze_done' => 'AI parsing completed with the default backend model: :model',
            'ai_model_try' => 'Trying AI model: :model',
            'ai_model_attempt' => 'Trying AI model: :model (attempt :current/:max)',
            'ai_model_retry' => 'AI model :model failed on attempt :current/:max. Retrying: :message',
            'ai_model_failed' => 'AI model :model failed: :message',
            'ai_skipped_no_model' => 'No available default chat model is configured. URL Smart Import cannot run.',
            'ai_fallback' => 'AI parsing failed and the job was stopped: :message',
            'preview_start' => 'Generating the preview by combining knowledge, keywords, and titles',
            'preview_ready' => 'Preview generated. Waiting for import confirmation',
            'failed' => 'Job failed: :message',
            'import_done' => 'Imported result into the knowledge, keyword, and title libraries',
        ],
        'label' => [
            'current_step' => 'Current step: :step',
        ],
        'commit' => [
            'imported_at_prefix' => 'Imported at: ',
            'success' => 'Import completed successfully',
        ],
        'error' => [
            'url_required' => 'Please enter a URL to import',
            'invalid_url' => 'Invalid URL. Please enter a publicly accessible http/https page',
            'private_url' => 'Local, intranet, or private addresses cannot be imported',
            'fetch_failed' => 'Page fetch failed. HTTP status: :status',
            'empty_page' => 'The page body is empty and cannot be converted into materials',
            'ai_model_required' => 'URL Smart Import requires an available chat model with an API URL and API key first',
            'ai_url_missing' => 'The default AI model API URL is empty',
            'ai_key_missing' => 'The default AI model API key is empty',
            'ai_empty_content' => 'AI parsing returned empty content',
            'ai_invalid_json' => 'AI parsing did not return valid JSON. Response excerpt: :preview',
            'ai_knowledge_missing' => 'AI did not return importable knowledge-base content',
            'ai_keywords_missing' => 'AI did not return valid core business keywords',
            'ai_titles_missing' => 'AI did not return valid GEO title suggestions',
            'ai_parse_failed' => 'AI semantic parsing failed: :message',
            'ai_all_models_failed' => 'All available AI models failed. Details: :messages',
            'ai_config_help' => 'Check the model API Base URL, model ID, API key, account quota, and model permissions. After fixing them, return to import history and rerun the failed job.',
            'ai_config_button' => 'Configure AI API',
            'fetch_status_failed' => 'Failed to fetch job status',
            'job_failed' => 'The import job failed',
            'start_failed' => 'Failed to start the import job',
            'run_failed' => 'Failed to start the import job. Please refresh the page and try again',
            'csrf_missing' => 'The page security token is missing. Please refresh the page and try again',
            'commit_before_parse' => 'Finish at least one parsing run before committing the result',
            'commit_failed' => 'Import failed',
        ],
    ],
    'url_import_history' => [
        'page_title' => 'URL Import History',
        'page_heading' => 'URL Import History',
        'page_subtitle' => 'Review URL ingestion jobs, processing stages, and recent logs.',
        'button' => [
            'new_job' => 'New Import Job',
        ],
        'section' => [
            'filters' => 'Filters',
            'records' => 'Import Records',
        ],
        'stats' => [
            'total' => 'Total Jobs',
            'completed' => 'Completed',
            'running' => 'Running',
            'failed' => 'Failed',
        ],
        'filter' => [
            'all_statuses' => 'All Statuses',
        ],
        'placeholder' => [
            'search' => 'Search by URL, domain, or page title',
        ],
        'status' => [
            'queued' => 'Queued',
            'running' => 'Running',
            'completed' => 'Completed',
            'failed' => 'Failed',
        ],
        'import' => [
            'imported' => 'Imported',
            'summary' => 'Knowledge :knowledge_base / Keywords :keywords / Titles :titles',
            'not_imported' => 'Not Imported',
            'not_imported_summary' => 'Preview completed only. Nothing has been written into the libraries yet.',
        ],
        'empty' => [
            'no_records' => 'No import records yet',
        ],
        'value' => [
            'unknown_source' => 'Unknown source',
        ],
        'label' => [
            'current_step' => 'Current step: :step',
            'progress' => 'Progress: :percent%',
            'created_at' => 'Created: :time',
            'finished_at' => 'Finished: :time',
            'import_status' => 'Import status: :summary',
            'latest_log' => 'Latest log: :message',
            'error' => 'Error: :message',
        ],
    ],
    'title_ai_generate' => [
        'page_title' => 'AI Title Generation',
        'page_heading' => 'AI Title Generation',
        'page_subtitle' => 'Generate titles for “:name”',
        'section' => [
            'config' => 'AI Generation Settings',
            'config_desc' => 'Configure the parameters for AI-generated titles.',
            'progress' => 'Generation Progress',
            'progress_desc' => 'AI is generating titles in the background. You can close this page.',
            'instructions' => 'Instructions',
        ],
        'field' => [
            'keyword_library' => 'Keyword Library *',
            'ai_model' => 'AI Model *',
            'count' => 'Title Count',
            'style' => 'Title Style',
            'custom_prompt' => 'Custom Prompt',
        ],
        'option' => [
            'select_keyword_library' => 'Select a keyword library',
            'select_ai_model' => 'Select an AI model',
            'keyword_count_suffix' => 'keywords',
        ],
        'help' => [
            'keyword_library' => 'Choose the keyword library used to generate titles.',
            'ai_model' => 'Choose the AI model used for title generation.',
            'count' => 'Number of titles to generate in one run (1-50).',
            'style' => 'Choose the style applied to generated titles.',
            'custom_prompt' => 'Optional: add extra constraints for generation.',
        ],
        'placeholder' => [
            'custom_prompt' => 'Add extra requirements, such as a title length limit, required terms, or a target industry...',
        ],
        'style' => [
            'professional' => 'Professional',
            'attractive' => 'Attention-Grabbing',
            'seo' => 'SEO Optimized',
            'creative' => 'Creative',
            'question' => 'Question',
        ],
        'button' => [
            'async' => 'Generate Asynchronously',
            'sync' => 'Generate Synchronously',
            'refresh_status' => 'Refresh Status',
        ],
        'progress' => [
            'label' => 'Progress',
            'generated' => 'Generated',
            'total' => 'Target',
            'elapsed' => 'Elapsed',
            'preparing' => 'Preparing...',
            'sync_loading' => 'Generating titles, please wait...',
            'sync_notice' => 'The system is calling the AI service. This may take 1-2 minutes.',
            'starting' => 'Starting...',
        ],
        'instructions' => [
            'keyword_library' => 'Select a keyword library: AI generates relevant titles from the keywords in the library.',
            'ai_model' => 'Select an AI model: different models produce different quality and styles.',
            'count' => 'Set the generation count: 10-20 titles per run is recommended.',
            'style' => 'Select a title style that matches the content type.',
            'custom_prompt' => 'Use a custom prompt to add special requirements and improve the output.',
            'saved_titles' => 'Generated titles are marked as AI-generated and linked to a random keyword automatically.',
        ],
        'message' => [
            'completed' => 'AI generation completed. Saved :count titles successfully',
            'duplicates' => ', skipped :count duplicate titles',
        ],
        'error' => [
            'keyword_library_required' => 'Please select a keyword library',
            'ai_model_required' => 'Please select an AI model',
            'invalid_count' => 'Title count must be between 1 and 50',
            'keyword_library_missing' => 'Keyword library does not exist',
            'no_keywords' => 'The selected keyword library has no keywords',
            'ai_model_missing' => 'AI model does not exist',
            'network' => 'Network connection error: :message',
            'api_http' => 'AI service call failed, HTTP status: :code:detail',
            'empty_result' => 'The AI returned no titles',
            'save_failed' => 'Failed to save titles: :message',
            'start_failed_prefix' => 'Failed to start: ',
            'start_network' => 'Failed to start: network error',
        ],
    ],
];
