v7.0.0-beta.4 release

This commit is contained in:
HeuJung
2026-05-11 11:29:41 +09:00
parent 05db17887d
commit 1db039ff34
1545 changed files with 136783 additions and 11634 deletions
+6 -37
View File
@@ -32,6 +32,10 @@ return [
'delete' => 'Deleted',
'login' => 'Login',
'logout' => 'Logout',
'login_failed' => 'Login failed',
'account_locked' => 'Account locked',
'request' => 'Request',
'expired' => 'Expired',
'export' => 'Export',
'import' => 'Import',
'index' => 'List Viewed',
@@ -45,18 +49,11 @@ return [
'run' => 'Executed',
'duplicate' => 'Duplicated',
'upload' => 'Uploaded',
'reorder' => 'Reordered',
'toggle_status' => 'Status Toggled',
'toggle_active' => 'Active Status Changed',
'bulk_update' => 'Bulk Updated',
'bulk_delete' => 'Bulk Deleted',
'bulk_status' => 'Bulk Status Changed',
'bulk_update_status' => 'Bulk Status Changed',
'cancel' => 'Cancelled',
'partial_cancel' => 'Partially Cancelled',
'refund' => 'Refunded',
'restore' => 'Restored',
'blind' => 'Blinded',
'publish' => 'Published',
'register' => 'Registered',
'reset_password' => 'Password Reset',
@@ -65,13 +62,8 @@ return [
'check' => 'Checked',
'sync_permissions' => 'Permissions Synchronized',
'sync_roles' => 'Roles Synchronized',
'copy' => 'Copied',
'reply' => 'Replied',
'toggle' => 'Toggled',
'download' => 'Downloaded',
'earn' => 'Earned',
'use' => 'Used',
// Additional actions
'withdraw' => 'Withdrawn',
'update_order' => 'Order Changed',
@@ -81,31 +73,6 @@ return [
'reset' => 'Reset',
// Ecommerce/Board common
'bulk_price_update' => 'Bulk Price Updated',
'bulk_stock_update' => 'Bulk Stock Updated',
'stock_sync' => 'Stock Synchronized',
'bulk_status_update' => 'Bulk Status Updated',
'bulk_shipping_update' => 'Bulk Shipping Updated',
'update_shipping_address' => 'Shipping Address Updated',
'send_email' => 'Email Sent',
'payment_complete' => 'Payment Completed',
'payment_failed' => 'Payment Failed',
'status_change' => 'Status Changed',
'bulk_status_change' => 'Bulk Status Changed',
'confirm' => 'Confirmed',
'set_default' => 'Set as Default',
'bulk_toggle_active' => 'Bulk Active Status Changed',
'bulk_create' => 'Bulk Created',
'add' => 'Added',
'update_quantity' => 'Quantity Updated',
'change_option' => 'Option Changed',
'delete_all' => 'All Deleted',
'add_to_menu' => 'Added to Menu',
'bulk_apply' => 'Bulk Applied',
'update_status' => 'Status Updated',
'restore_content' => 'Content Restored',
'blind_content' => 'Content Blinded',
'delete_content' => 'Content Deleted',
],
// Description templates (used as description_key)
@@ -173,6 +140,8 @@ return [
'auth_forgot_password' => 'Password reset requested',
'auth_reset_password' => 'Password reset',
'auth_record_consents' => 'Consent recorded',
'auth_login_failed' => 'Login failed (:email)',
'auth_account_locked' => 'Account locked (:attempts attempts, :minutes min lockout)',
// Schedule management
'schedule_index' => 'Schedule list viewed',
+2
View File
@@ -31,6 +31,8 @@ return [
'account_inactive' => 'Your account is inactive. Please contact the administrator.',
'account_blocked' => 'Your account has been blocked. Please contact the administrator.',
'account_withdrawn' => 'This account has been withdrawn.',
'account_pending_verification' => 'Identity verification is not complete. Please complete the email verification.',
'account_locked' => 'Too many failed login attempts. Your account is locked for :minutes minute(s).',
// Password reset
'reset_token_invalid' => 'Invalid password reset token.',
+1
View File
@@ -19,6 +19,7 @@ return [
'system' => 'System',
'yes' => 'Yes',
'no' => 'No',
'unknown' => 'Unknown',
// Common error messages
'errors' => [
-8
View File
@@ -30,12 +30,4 @@ return [
'activities' => [
'user_registered' => ':name has registered.',
],
// System alerts
'alerts' => [
'system_update_available' => 'System Update Available',
'system_update_message' => 'A new version of Gnuboard7 is available. Please check for updates.',
'disk_space_low' => 'Disk Space Low',
'disk_space_message' => 'Disk usage has exceeded 90%. Please clean up unnecessary files.',
],
];
+3
View File
@@ -40,6 +40,8 @@ return [
'restore_failed' => 'Failed to restore settings.',
'category_not_found' => 'Settings category not found: :category',
'save_failed' => 'Failed to save settings: :category',
'json_parse_failed' => 'Failed to parse JSON file: :path (:error)',
'add_category_module_only' => 'addCategory is only available for modules.',
],
// Core update related exceptions
@@ -71,5 +73,6 @@ return [
'composer_json_not_found' => 'composer.json not found: :path',
'no_composer_lock' => 'composer.lock is required. Run composer install first: :path',
'vendor_dir_not_found' => 'vendor/ directory does not exist. Run composer install first: :path',
'composer_binary_not_found' => 'Composer binary not found. Set the COMPOSER_BINARY environment variable or add composer to your PATH.',
],
];
+32
View File
@@ -15,6 +15,11 @@ return [
'zip_invalid_manifest' => 'Manifest :file inside ZIP is not valid JSON.',
'zip_identifier_mismatch' => 'ZIP manifest identifier does not match target extension. (expected: :expected, actual: :actual)',
'zip_missing_version' => 'Manifest :file inside ZIP has no version field.',
'not_found' => 'Extension (:identifier) not found.',
'cascade_dependency_failed' => 'Failed to install cascade dependency :type (:identifier): :message',
'invalid_type' => 'Invalid extension type.',
'not_auto_deactivated' => 'This extension was not automatically deactivated due to core version incompatibility.',
'hidden_extension' => 'Hidden (internal-only) extensions are not exposed to user actions.',
],
'warnings' => [
@@ -24,6 +29,33 @@ return [
'alerts' => [
'incompatible_deactivated' => ':type ":name" auto-deactivated',
'incompatible_message' => 'Required: :required, Installed: :installed',
'recovered_title' => ':type ":name" is compatible again',
'recovered_body' => 'Now compatible after core upgrade (previously required: :previously_required). You can re-activate.',
'recovered_success' => 'Extension has been re-activated.',
'dismissed' => 'Alert dismissed.',
'auto_deactivated_listed' => 'Auto-deactivated extensions listed.',
'recover_action' => 'Re-activate',
'dismiss_action' => 'Dismiss alert',
],
'badges' => [
'incompatible' => 'Core upgrade required',
'incompatible_tooltip' => 'Requires core :required or higher (current: :installed)',
'incompatible_sr' => ':name requires core :required or higher but :installed is installed; update is not allowed.',
],
'banner' => [
'title' => 'Some extensions were auto-deactivated due to core compatibility',
'item_required' => 'Required: :required',
'guide_link' => 'Core upgrade guide',
'dismiss' => 'Dismiss',
],
'update_modal' => [
'compat_warning_title' => 'Core version compatibility warning',
'compat_warning_message' => 'This :type requires core :required or higher. (current: :installed)',
'compat_guide_link' => 'View core upgrade guide',
'force_label' => 'Override warning and force update (not recommended)',
],
'commands' => [
+114
View File
@@ -0,0 +1,114 @@
<?php
return [
'providers' => [
'mail' => [
'label' => 'Email',
'settings' => [
'code_length' => 'Verification code length',
'code_length_help' => 'Number of digits in the verification code (default 6, min 4, max 10).',
'from_address' => 'From address',
'from_address_help' => 'Leave blank to use the system default sender.',
],
],
],
'errors' => [
'verification_required' => 'Identity verification is required.',
'challenge_not_found' => 'Invalid verification request.',
'wrong_provider' => 'This verification request must be handled by a different provider.',
'invalid_state' => 'This verification request has already been processed.',
'expired' => 'The verification has expired. Please try again.',
'max_attempts' => 'Too many attempts. Please request a new code.',
'invalid_code' => 'The verification code is incorrect.',
'invalid_verification_token' => 'Invalid verification token.',
'missing_target' => 'A verification target (email or phone) is required.',
'target_mismatch' => 'The verified target does not match the requested one.',
'purpose_not_supported' => 'The selected provider does not support this purpose.',
'provider_unavailable' => 'Identity verification provider is not available.',
'generic' => 'Identity verification failed.',
'missing_scope_or_target' => 'Both scope and target are required to resolve a policy.',
'admin_policy_has_no_default' => 'Admin-created policies do not have a declared default.',
'reset_field_failed' => 'Failed to reset the field to its declared default. Check if the field is valid.',
],
'messages' => [
'challenge_requested' => 'A verification code has been sent.',
'challenge_verified' => 'Identity verification completed.',
'challenge_cancelled' => 'Verification request has been cancelled.',
],
'logs' => [
'activity' => [
'requested' => 'Identity verification code sent to :email.',
'verified' => 'Identity verification completed.',
'failed' => 'Identity verification failed.',
'expired' => 'Identity verification expired.',
'cancelled' => 'Identity verification cancelled.',
],
],
'purposes' => [
'signup' => [
'label' => 'Signup Verification',
'description' => 'Verify ownership of email/phone for new sign-ups.',
],
'password_reset' => [
'label' => 'Password Reset',
'description' => 'Verify identity before resetting a forgotten password.',
],
'self_update' => [
'label' => 'Self Update',
'description' => 'Verify identity when a logged-in user changes their own contact info.',
],
'sensitive_action' => [
'label' => 'Sensitive Action',
'description' => 'Re-verify before sensitive actions such as account deletion or admin operations.',
],
],
'channels' => [
'email' => 'Email',
],
'origin_types' => [
'route' => 'Route',
'hook' => 'Hook',
'policy' => 'Policy',
'middleware' => 'Middleware',
'api' => 'Direct API call',
'custom' => 'Custom',
'system' => 'System',
],
'policy' => [
'scope' => [
'route' => 'Route',
'hook' => 'Hook',
'custom' => 'Custom',
],
'fail_mode' => [
'block' => 'Block (HTTP 428)',
'log_only' => 'Log only',
],
'applies_to' => [
'self' => 'Self',
'admin' => 'Admin',
'both' => 'Both',
],
'source_type' => [
'core' => 'Core',
'module' => 'Module',
'plugin' => 'Plugin',
'admin' => 'Admin',
],
],
'message' => [
'scope_type' => [
'provider_default' => 'Provider default',
'purpose' => 'Per purpose',
'policy' => 'Per policy',
],
],
];
+30
View File
@@ -0,0 +1,30 @@
<?php
return [
// Definition CRUD
'definition_list_success' => 'IDV message definitions loaded successfully.',
'definition_list_failed' => 'Failed to load IDV message definitions.',
'definition_show_success' => 'IDV message definition retrieved successfully.',
'definition_show_failed' => 'Failed to retrieve IDV message definition.',
'definition_created' => 'IDV message definition created successfully.',
'definition_create_failed' => 'Failed to create IDV message definition.',
'definition_updated' => 'IDV message definition updated successfully.',
'definition_update_failed' => 'Failed to update IDV message definition.',
'definition_toggled' => 'IDV message definition active state toggled.',
'definition_toggle_failed' => 'Failed to toggle IDV message definition active state.',
'definition_reset' => 'IDV message definition restored to default.',
'definition_reset_failed' => 'Failed to restore IDV message definition default.',
'definition_deleted' => 'IDV message definition deleted successfully.',
'definition_delete_failed' => 'Failed to delete IDV message definition.',
'definition_delete_forbidden' => 'Seeded default message definitions cannot be deleted.',
// Template CRUD
'template_updated' => 'IDV message template updated successfully.',
'template_update_failed' => 'Failed to update IDV message template.',
'template_toggled' => 'IDV message template active state toggled.',
'template_toggle_failed' => 'Failed to toggle IDV message template active state.',
'template_reset' => 'IDV message template restored to default.',
'template_reset_failed' => 'Failed to restore IDV message template default.',
'template_preview_success' => 'IDV message template preview generated.',
'template_preview_failed' => 'Failed to generate IDV message template preview.',
];
+63
View File
@@ -0,0 +1,63 @@
<?php
return [
'fetch_success' => 'Language pack list retrieved.',
'fetch_failed' => 'Failed to load language pack list: :error',
'not_found' => 'Language pack not found.',
'install_success' => 'Language pack installed.',
'install_failed' => 'Failed to install language pack: :error',
'activate_success' => 'Language pack activated.',
'activate_failed' => 'Failed to activate language pack: :error',
'deactivate_success' => 'Language pack deactivated.',
'deactivate_failed' => 'Failed to deactivate language pack: :error',
'uninstall_success' => 'Language pack removed.',
'uninstall_failed' => 'Failed to remove language pack: :error',
'manifest_invalid' => 'language-pack.json validation failed.',
'check_updates_success' => 'Update check completed.',
'check_updates_failed' => 'Failed to check updates: :error',
'update_success' => 'Language pack updated.',
'update_failed' => 'Failed to update language pack: :error',
'refresh_cache_success' => 'Language pack cache refreshed.',
'refresh_cache_failed' => 'Failed to refresh language pack cache: :error',
'preview_success' => 'Manifest preview completed.',
'preview_failed' => 'Failed to preview manifest: :error',
'errors' => [
'manifest_not_found' => 'language-pack.json file not found in archive.',
'manifest_invalid_json' => 'language-pack.json contains invalid JSON.',
'php_outside_backend' => 'PHP file detected outside the backend/ directory (:file).',
'unsafe_php_pattern' => 'Disallowed code pattern detected in PHP file (:file).',
'core_locale_missing' => 'A core language pack for ":locale" must be active first.',
'target_not_installed' => 'Target :scope (":target") is not installed.',
'target_inactive' => 'Target :scope (":target") is inactive. Activate it first.',
'target_version_too_old' => 'Target :scope (":target") version does not satisfy the required constraint (:constraint).',
'downgrade_blocked' => 'Downgrade blocked (:from → :to).',
'protected_pack' => 'Protected language packs cannot be deactivated or removed.',
'download_failed' => 'Failed to download from URL: :url',
'checksum_mismatch' => 'Checksum mismatch.',
'update_no_source' => 'No update source available (only GitHub-sourced packs can be updated).',
'update_already_latest' => 'Already on the latest version.',
'preview_invalid_manifest' => 'Manifest preview failed: invalid manifest file.',
'operation_in_progress' => 'Another operation is in progress for language pack (:identifier). Please try again after it completes.',
'bundled_not_found' => 'Bundled directory (lang-packs/_bundled/:identifier) does not exist.',
'slot_conflict' => 'Slot already has an active language pack (:current). Confirm replacement with :target.',
'directory_not_writable' => 'The language pack install directory (:path) is not writable. Grant write permission to the web server user (e.g. www-data). Example: sudo chgrp www-data :path && sudo chmod g+w :path',
'identifier_not_found' => 'Language pack not found (:identifier).',
'unsupported_source' => 'Unsupported source (:source) — use one of bundled, github, url.',
],
'validation' => [
'file_required' => 'Upload a language pack ZIP file.',
'file_invalid' => 'Uploaded file is not valid.',
'file_too_large' => 'File size must not exceed 10 MB.',
'file_not_zip' => 'Only ZIP archives are accepted.',
'github_url_required' => 'Enter a GitHub URL.',
'github_url_invalid' => 'Enter a valid URL.',
'github_url_format' => 'Must be a GitHub repository URL (e.g. https://github.com/owner/repo).',
'url_required' => 'Enter a download URL.',
'url_invalid' => 'Enter a valid URL.',
'checksum_invalid' => 'SHA-256 checksum must be 64 hex characters.',
'identifier_required' => 'Enter the language pack identifier.',
'identifier_invalid' => 'Identifier may contain letters, numbers, dots, underscores and hyphens only.',
],
];
+14 -10
View File
@@ -7,21 +7,25 @@ return [
// Module operation messages
'fetch_success' => 'Module retrieved successfully.',
'fetch_failed' => 'Failed to retrieve module.',
'fetch_failed' => 'Failed to retrieve module: :error',
'install_success' => 'Module installed successfully.',
'install_failed' => 'Failed to install module.',
'install_failed' => 'Failed to install module: :error',
'preview_success' => 'Manifest preview completed.',
'preview_failed' => 'Failed to preview manifest: :error',
'uninstall_success' => 'Module uninstalled successfully.',
'uninstall_failed' => 'Failed to uninstall module.',
'uninstall_failed' => 'Failed to uninstall module: :error',
'activate_success' => 'Module activated successfully.',
'activate_failed' => 'Failed to activate module.',
'activate_failed' => 'Failed to activate module: :error',
'deactivate_success' => 'Module deactivated successfully.',
'deactivate_failed' => 'Failed to deactivate module.',
'deactivate_failed' => 'Failed to deactivate module: :error',
'update_success' => 'Module updated successfully.',
'update_failed' => 'Failed to update module.',
'update_failed' => 'Failed to update module: :error',
'refresh_layouts_success' => 'Module layouts refreshed successfully.',
'refresh_layouts_failed' => 'Failed to refresh module layouts.',
'refresh_layouts_failed' => 'Failed to refresh module layouts: :error',
'uninstall_info_success' => 'Module uninstall information retrieved successfully.',
'uninstall_info_failed' => 'Failed to retrieve module uninstall information.',
'uninstall_info_failed' => 'Failed to retrieve module uninstall information: :error',
'dependent_templates_success' => 'Dependent templates retrieved successfully.',
'dependent_templates_failed' => 'Failed to retrieve dependent templates: :error',
'license_not_found' => 'Module license file not found.',
// Status
@@ -35,8 +39,8 @@ return [
// Error messages
'errors' => [
'module_class_not_found' => 'Module class not found.',
'migration_failed' => 'Failed to run migrations.',
'dependency_check_failed' => 'Dependency check failed.',
'migration_failed' => 'Failed to run migrations: :error',
'dependency_check_failed' => 'Dependency check failed: :error',
'database_error' => 'Database error occurred.',
'module_not_found' => 'Module :name not found.',
'module_not_active' => 'Module :name is not active.',
+13 -12
View File
@@ -119,10 +119,10 @@ return [
// Update related messages
'update_success' => 'Module ":module" has been updated to version :version.',
'update_failed' => 'Module update failed: :error',
'update_hook_failed' => 'Module update hook execution failed.',
'update_hook_failed' => 'Module update hook execution failed: :error',
'no_update_available' => 'No update available.',
'check_updates_success' => 'Update check completed.',
'check_updates_failed' => 'Update check failed.',
'check_updates_failed' => 'Update check failed: :error',
'check_modified_layouts_success' => 'Modified layouts check completed.',
'check_modified_layouts_failed' => 'Modified layouts check failed: :error',
'not_installed' => 'Module ":module" is not installed.',
@@ -130,7 +130,7 @@ return [
// _pending related messages
'pending_not_found' => 'Module ":module" not found in pending list.',
'already_exists' => 'Module ":module" already exists.',
'move_failed' => 'Failed to move module ":module".',
'move_failed' => 'Failed to move module ":module": :error',
// Module service error messages
'deactivate_warning' => 'There are active templates that depend on this module.',
@@ -158,14 +158,15 @@ return [
// Error messages
'errors' => [
'force_update_no_source' => 'Cannot force update :module. Neither bundle nor GitHub URL is available.',
'zip_open_failed' => 'Failed to open ZIP file.',
'downgrade_blocked' => 'Downgrade blocked (:from → :to). Use --force to allow intentional downgrades.',
'zip_open_failed' => 'Failed to open ZIP file: :error',
'module_json_not_found' => 'module.json file not found.',
'module_json_invalid' => 'Invalid module.json file format.',
'identifier_missing' => 'Module identifier is missing.',
'already_installed' => 'Module is already installed.',
'install_failed' => 'Failed to install module.',
'install_failed' => 'Failed to install module: :error',
'github_url_invalid' => 'Invalid GitHub URL format.',
'github_download_failed' => 'Failed to download from GitHub.',
'github_download_failed' => 'Failed to download from GitHub: :error',
'github_repo_not_found' => 'GitHub repository not found.',
'module_not_found' => 'Module :name not found.',
'module_not_active' => 'Module :name is not active.',
@@ -180,16 +181,16 @@ return [
'layout_validation_json_error' => 'Failed to parse JSON in layout file :file: :error',
'layout_validation_missing_name' => 'Layout file :file is missing layout_name.',
'layout_validation_partial_error' => 'Failed to process partial in layout file :file: :error (partial: :partial)',
'layout_validation_validation_failed' => 'Layout validation failed for module :identifier. :count errors found.',
'layout_validation_validation_failed' => 'Layout validation failed for module :identifier. :count errors found: :error',
'operation_in_progress' => 'Module ":name" is currently :status. Please wait until the operation is complete.',
'github_api_failed' => 'GitHub API call failed.',
'github_api_failed' => 'GitHub API call failed: :error',
'invalid_github_url' => 'Invalid GitHub URL.',
'zip_url_not_found' => 'ZIP download URL not found.',
'download_failed' => 'Failed to download module ":module" version :version.',
'zip_extract_failed' => 'ZIP extraction failed.',
'download_failed' => 'Failed to download module ":module" version :version: :error',
'zip_extract_failed' => 'ZIP extraction failed: :error',
'extracted_dir_not_found' => 'Extracted directory not found.',
'reload_failed' => 'Failed to reload module.',
'delete_directory_failed' => 'Failed to delete module directory.',
'reload_failed' => 'Failed to reload module: :error',
'delete_directory_failed' => 'Failed to delete module directory: :error',
'update_failed' => 'Failed to update module ":module": :error',
'invalid_layout_strategy' => 'Invalid layout strategy. (only overwrite or keep allowed)',
'invalid_vendor_mode' => 'Invalid vendor installation mode. (only auto, composer, bundled allowed)',
+13
View File
@@ -71,4 +71,17 @@ return [
'delete_all_failed' => 'Failed to delete all notifications.',
'not_found' => 'Notification not found.',
],
// Notification channel metadata (referenced by config/notification.php default_channels)
'channels' => [
'core_default' => 'Core default channel',
'mail' => [
'name' => 'Email',
'description' => 'Send notification via email',
],
'database' => [
'name' => 'Site Notification',
'description' => 'Show in site notification center',
],
],
];
+30 -25
View File
@@ -3,32 +3,36 @@
return [
// Plugin related messages
'list_success' => 'Plugin list retrieved successfully.',
'list_failed' => 'Failed to retrieve plugin list.',
'list_failed' => 'Failed to retrieve plugin list: :error',
'fetch_success' => 'Plugin information retrieved successfully.',
'fetch_failed' => 'Failed to retrieve plugin information.',
'fetch_failed' => 'Failed to retrieve plugin information: :error',
'not_found' => 'Plugin :plugin not found.',
'install_success' => 'Plugin installed successfully.',
'install_failed' => 'Failed to install plugin.',
'install_validation_failed' => 'Plugin installation validation failed.',
'install_failed' => 'Failed to install plugin: :error',
'preview_success' => 'Manifest preview completed.',
'preview_failed' => 'Failed to preview manifest: :error',
'install_validation_failed' => 'Plugin installation validation failed: :error',
'install_error' => 'An error occurred while installing plugin.',
'uninstall_success' => 'Plugin uninstalled successfully.',
'uninstall_failed' => 'Failed to uninstall plugin.',
'uninstall_validation_failed' => 'Plugin uninstallation validation failed.',
'uninstall_failed' => 'Failed to uninstall plugin: :error',
'uninstall_validation_failed' => 'Plugin uninstallation validation failed: :error',
'uninstall_error' => 'An error occurred while uninstalling plugin.',
'activate_success' => 'Plugin activated successfully.',
'activate_failed' => 'Failed to activate plugin.',
'activate_validation_failed' => 'Plugin activation validation failed.',
'activate_failed' => 'Failed to activate plugin: :error',
'activate_validation_failed' => 'Plugin activation validation failed: :error',
'activate_error' => 'An error occurred while activating plugin.',
'deactivate_success' => 'Plugin deactivated successfully.',
'deactivate_failed' => 'Failed to deactivate plugin.',
'deactivate_validation_failed' => 'Plugin deactivation validation failed.',
'deactivate_failed' => 'Failed to deactivate plugin: :error',
'deactivate_validation_failed' => 'Plugin deactivation validation failed: :error',
'deactivate_error' => 'An error occurred while deactivating plugin.',
'refresh_layouts_success' => 'Plugin layouts refreshed successfully.',
'refresh_layouts_failed' => 'Failed to refresh plugin layouts: :error',
'uninstall_info_success' => 'Plugin uninstall information retrieved successfully.',
'uninstall_info_failed' => 'Failed to retrieve plugin uninstall information.',
'uninstall_info_failed' => 'Failed to retrieve plugin uninstall information: :error',
'dependent_templates_success' => 'Dependent templates retrieved successfully.',
'dependent_templates_failed' => 'Failed to retrieve dependent templates: :error',
'license_not_found' => 'Plugin license file not found.',
'refresh_layouts_validation_failed' => 'Plugin layouts refresh validation failed.',
'refresh_layouts_validation_failed' => 'Plugin layouts refresh validation failed: :error',
'refresh_layouts_error' => 'An error occurred while refreshing plugin layouts.',
// Status
@@ -41,10 +45,10 @@ return [
// Update related messages
'update_success' => 'Plugin ":plugin" has been updated to version :version.',
'update_failed' => 'Plugin update failed: :error',
'update_hook_failed' => 'Plugin update hook execution failed.',
'update_hook_failed' => 'Plugin update hook execution failed: :error',
'no_update_available' => 'No update available.',
'check_updates_success' => 'Update check completed.',
'check_updates_failed' => 'Update check failed.',
'check_updates_failed' => 'Update check failed: :error',
'check_modified_layouts_success' => 'Modified layouts check completed.',
'check_modified_layouts_failed' => 'Modified layouts check failed: :error',
'not_installed' => 'Plugin ":plugin" is not installed.',
@@ -52,7 +56,7 @@ return [
// _pending related messages
'pending_not_found' => 'Plugin ":plugin" not found in pending list.',
'already_exists' => 'Plugin ":plugin" already exists.',
'move_failed' => 'Failed to move plugin ":plugin".',
'move_failed' => 'Failed to move plugin ":plugin": :error',
// Dependency messages
'dependency_not_active' => 'Dependency ":dependency" is not installed or inactive.',
@@ -84,6 +88,7 @@ return [
// Error messages
'errors' => [
'force_update_no_source' => 'Cannot force update :plugin. Neither bundle nor GitHub URL is available.',
'downgrade_blocked' => 'Downgrade blocked (:from → :to). Use --force to allow intentional downgrades.',
'invalid_permission_structure' => 'Invalid permission structure for plugin ":identifier": :reason',
'invalid_translation_path' => 'Invalid translation path for plugin ":identifier". Use ":correct_path" instead of ":wrong_path".',
'seo_variable_conflict' => 'SEO variable name conflict in plugin ":identifier": :reason',
@@ -97,28 +102,28 @@ return [
'layout_validation_json_error' => 'Failed to parse JSON in layout file :file: :error',
'layout_validation_missing_name' => 'layout_name is missing in layout file :file.',
'layout_validation_partial_error' => 'Failed to process partial in layout file :file: :error (partial: :partial)',
'layout_validation_validation_failed' => 'Layout validation failed for plugin :identifier. :count error(s) found.',
'layout_validation_validation_failed' => 'Layout validation failed for plugin :identifier. :count error(s) found: :error',
'operation_in_progress' => 'Plugin ":name" is currently :status. Please wait until the operation is complete.',
'github_api_failed' => 'GitHub API call failed.',
'github_api_failed' => 'GitHub API call failed: :error',
'invalid_github_url' => 'Invalid GitHub URL.',
'zip_url_not_found' => 'ZIP download URL not found.',
'download_failed' => 'Failed to download plugin ":plugin" version :version.',
'zip_extract_failed' => 'ZIP extraction failed.',
'download_failed' => 'Failed to download plugin ":plugin" version :version: :error',
'zip_extract_failed' => 'ZIP extraction failed: :error',
'extracted_dir_not_found' => 'Extracted directory not found.',
'reload_failed' => 'Failed to reload plugin.',
'delete_directory_failed' => 'Failed to delete plugin directory.',
'reload_failed' => 'Failed to reload plugin: :error',
'delete_directory_failed' => 'Failed to delete plugin directory: :error',
'update_failed' => 'Failed to update plugin ":plugin": :error',
'invalid_layout_strategy' => 'Invalid layout strategy. (only overwrite or keep allowed)',
'invalid_vendor_mode' => 'Invalid vendor installation mode. (only auto, composer, bundled allowed)',
'github_url_invalid' => 'Invalid GitHub URL format.',
'github_download_failed' => 'Failed to download from GitHub.',
'github_download_failed' => 'Failed to download from GitHub: :error',
'github_repo_not_found' => 'GitHub repository not found.',
'zip_open_failed' => 'Unable to open ZIP file.',
'zip_open_failed' => 'Unable to open ZIP file: :error',
'plugin_json_not_found' => 'plugin.json file not found.',
'plugin_json_invalid' => 'Invalid plugin.json file format.',
'identifier_missing' => 'Plugin identifier is missing.',
'already_installed' => 'Plugin ":plugin" is already installed.',
'install_failed' => 'Plugin installation failed.',
'install_failed' => 'Plugin installation failed: :error',
],
// Validation messages (FormRequest)
@@ -237,7 +242,7 @@ return [
// Plugin settings related messages
'settings' => [
'update_failed' => 'Failed to update plugin settings.',
'update_failed' => 'Failed to update plugin settings: :error',
'updated' => 'Plugin settings updated successfully.',
],
+5
View File
@@ -10,6 +10,11 @@ return [
'warmup_started_layout' => 'SEO cache warmup started for layout :layout.',
'warmup_dispatched' => 'SEO cache warmup has been dispatched.',
// Sitemap manual regeneration
'sitemap_regenerated' => 'Sitemap regeneration completed.',
'sitemap_regenerate_failed' => 'Sitemap regeneration failed.',
'sitemap_disabled' => 'Sitemap generation is disabled.',
// Cache stats
'stats_period' => 'SEO cache statistics for the last :days days',
'stats_overall' => 'Overall Statistics',
+36
View File
@@ -33,6 +33,40 @@ return [
// System info related
'seconds' => 's',
// Driver labels (resolved per active language pack by DriverRegistryService)
'drivers' => [
'storage' => [
'local' => 'Local',
's3' => 'Amazon S3',
],
'cache' => [
'file' => 'File',
'redis' => 'Redis',
],
'session' => [
'file' => 'File',
'database' => 'Database',
'redis' => 'Redis',
],
'queue' => [
'sync' => 'Sync',
'database' => 'Database',
'redis' => 'Redis',
],
'log' => [
'single' => 'Single File',
'daily' => 'Daily File',
],
'websocket' => [
'reverb' => 'Laravel Reverb',
],
'mail' => [
'smtp' => 'SMTP',
'mailgun' => 'Mailgun',
'ses' => 'SES (Amazon)',
],
],
// Driver connection test messages
'driver_test_success' => 'All driver connection tests passed.',
'driver_test_partial' => 'Some driver connection tests failed.',
@@ -138,5 +172,7 @@ return [
'all_extract_methods_failed' => 'All archive extraction methods failed. Try manual update with --source option.',
'unzip_command_failed' => 'unzip command failed (exit code: :code). :output',
'zip_file_not_found' => 'Specified ZIP file not found: :path',
'source_vendor_missing' => 'No vendor directory in source. composer install may not have been executed.',
'composer_failed_with_output' => 'composer install failed.:output',
],
];
+29 -26
View File
@@ -5,32 +5,33 @@ return [
'errors' => [
'force_update_no_source' => 'Cannot force update :template. Neither bundle nor GitHub URL is available.',
'downgrade_blocked' => 'Downgrade blocked (:from → :to). Use --force to allow intentional downgrades.',
'not_found' => 'Template not found. (:template)',
'not_installed' => 'Template is not installed. (:template)',
'already_active' => 'Template is already active.',
'invalid_format' => 'Invalid template format.',
'activation_failed' => 'Failed to activate template.',
'file_copy_failed' => 'Failed to copy files.',
'activation_failed' => 'Failed to activate template: :error',
'file_copy_failed' => 'Failed to copy files: :error',
'dist_directory_not_found' => 'Template build output (dist) not found.',
'invalid_directory_name' => 'Invalid directory name. Use vendor-name format.',
'dependency_not_met' => 'Required dependency :dependency (:type) not met.',
'version_mismatch' => ':dependency version mismatch. (Required: :required, Installed: :installed)',
'deactivation_failed' => 'Failed to deactivate template.',
'installation_failed' => 'Failed to install template.',
'uninstallation_failed' => 'Failed to uninstall template.',
'deactivation_failed' => 'Failed to deactivate template: :error',
'installation_failed' => 'Failed to install template: :error',
'uninstallation_failed' => 'Failed to uninstall template: :error',
'template_json_not_found' => 'template.json file not found.',
'template_json_invalid' => 'template.json file is invalid.',
'missing_required_fields' => 'Required fields are missing.',
'invalid_type' => 'Invalid template type. (Only admin or user allowed)',
'copy_rollback_failed' => 'Failed to rollback file copy.',
'copy_rollback_failed' => 'Failed to rollback file copy: :error',
'invalid_layout_json' => 'Invalid layout JSON file.',
'missing_layout_name' => 'Missing layout_name field in layout JSON.',
'layout_registration_failed' => 'Failed to register layout.',
'layout_registration_failed' => 'Failed to register layout: :error',
'layout_validation_failed' => 'Layout validation failed for :template template. (:count errors)',
'layout_validation_json_error' => ':file - JSON parsing error: :error',
'layout_validation_missing_name' => ':file - Missing layout_name field.',
'layout_validation_partial_error' => ':file - Partial processing error (:partial): :error',
'override_layout_registration_failed' => 'Failed to register override layout.',
'override_layout_registration_failed' => 'Failed to register override layout: :error',
'file_not_found' => 'File not found.',
'file_type_not_allowed' => 'File type not allowed.',
'components_not_found' => 'Components definition file not found.',
@@ -39,14 +40,14 @@ return [
'invalid_json' => 'Invalid JSON format.',
'invalid_cache_data' => 'Cache data is corrupted. Please try again.',
'unknown_error' => 'An unknown error occurred.',
'zip_open_failed' => 'Failed to open ZIP file.',
'zip_open_failed' => 'Failed to open ZIP file: :error',
'identifier_missing' => 'Template identifier is missing.',
'already_installed' => 'Template is already installed.',
'install_failed' => 'Failed to install template.',
'install_failed' => 'Failed to install template: :error',
'github_url_invalid' => 'Invalid GitHub URL format.',
'github_download_failed' => 'Failed to download from GitHub.',
'github_download_failed' => 'Failed to download from GitHub: :error',
'github_repo_not_found' => 'GitHub repository not found.',
'refresh_layouts_failed' => 'Failed to refresh layouts.',
'refresh_layouts_failed' => 'Failed to refresh layouts: :error',
'routes_not_found' => 'Routes file not found.',
// Template engine error messages
@@ -73,14 +74,14 @@ return [
// Update related errors
'operation_in_progress' => 'Template ":name" is currently :status. Please wait until the operation is complete.',
'github_api_failed' => 'GitHub API call failed.',
'github_api_failed' => 'GitHub API call failed: :error',
'invalid_github_url' => 'Invalid GitHub URL.',
'zip_url_not_found' => 'ZIP download URL not found.',
'download_failed' => 'Failed to download template ":template" version :version.',
'zip_extract_failed' => 'ZIP extraction failed.',
'download_failed' => 'Failed to download template ":template" version :version: :error',
'zip_extract_failed' => 'ZIP extraction failed: :error',
'extracted_dir_not_found' => 'Extracted directory not found.',
'reload_failed' => 'Failed to reload template.',
'delete_directory_failed' => 'Failed to delete template directory.',
'reload_failed' => 'Failed to reload template: :error',
'delete_directory_failed' => 'Failed to delete template directory: :error',
'update_failed' => 'Failed to update template ":template": :error',
'invalid_layout_strategy' => 'Invalid layout strategy. (Only overwrite or keep allowed)',
],
@@ -183,11 +184,13 @@ return [
],
'install_success' => 'Template has been successfully installed.',
'install_failed' => 'Template installation failed.',
'install_failed' => 'Template installation failed: :error',
'preview_success' => 'Manifest preview completed.',
'preview_failed' => 'Failed to preview manifest: :error',
'uninstall_success' => 'Template has been successfully uninstalled.',
'uninstall_failed' => 'Template uninstallation failed.',
'uninstall_failed' => 'Template uninstallation failed: :error',
'activate_success' => 'Template has been activated.',
'activate_failed' => 'Template activation failed.',
'activate_failed' => 'Template activation failed: :error',
'activate_warning' => 'Required dependencies are not met for template activation.',
// Warning messages
@@ -196,27 +199,27 @@ return [
],
'deactivate_success' => 'Template has been deactivated.',
'deactivate_failed' => 'Template deactivation failed.',
'deactivate_failed' => 'Template deactivation failed: :error',
'fetch_success' => 'Template information retrieved successfully.',
'license_not_found' => 'Template license file not found.',
'refresh_layouts_success' => 'Template layouts have been refreshed successfully.',
'refresh_layouts_failed' => 'Failed to refresh template layouts.',
'refresh_layouts_failed' => 'Failed to refresh template layouts: :error',
// Update related messages
'update_success' => 'Template ":template" has been updated to version :version.',
'update_failed' => 'Template update failed: :error',
'update_hook_failed' => 'Template update hook execution failed.',
'update_hook_failed' => 'Template update hook execution failed: :error',
'no_update_available' => 'No update available.',
'check_updates_success' => 'Update check completed.',
'check_updates_failed' => 'Update check failed.',
'check_updates_failed' => 'Update check failed: :error',
'not_installed' => 'Template ":template" is not installed.',
'check_modified_layouts_success' => 'Modified layouts check completed.',
'check_modified_layouts_failed' => 'Failed to check modified layouts.',
'check_modified_layouts_failed' => 'Failed to check modified layouts: :error',
// _pending related messages
'pending_not_found' => 'Template ":template" not found in pending list.',
'already_exists' => 'Template ":template" already exists.',
'move_failed' => 'Failed to move template ":template".',
'move_failed' => 'Failed to move template ":template": :error',
'commands' => [
'install' => [
-1
View File
@@ -26,7 +26,6 @@ return [
'update_failed' => 'Failed to update user information: :error',
'delete_success' => 'User deleted successfully.',
'delete_failed' => 'Failed to delete user: :error',
'delete_admin_forbidden' => 'Administrator account cannot be deleted.',
'statistics_success' => 'User statistics retrieved successfully.',
'statistics_failed' => 'Failed to retrieve user statistics.',
'search_success' => 'User search completed successfully.',
+80
View File
@@ -748,10 +748,26 @@ return [
'google_analytics_id_max' => 'Google Analytics ID may not be greater than 50 characters.',
'google_site_verification_max' => 'Google site verification code may not be greater than 100 characters.',
'naver_site_verification_max' => 'Naver site verification code may not be greater than 100 characters.',
'generator_enabled_boolean' => 'Generator tag toggle must be true or false.',
'generator_content_string' => 'Generator content must be a string.',
'generator_content_max' => 'Generator content may not be greater than 200 characters.',
'bot_user_agents_array' => 'Bot user agents must be an array.',
'bot_user_agents_item_string' => 'Each bot user agent must be a string.',
'bot_user_agents_item_max' => 'Each bot user agent may not be greater than 100 characters.',
'bot_detection_enabled_boolean' => 'Bot detection setting must be true or false.',
'bot_detection_library_enabled_boolean' => 'Bot detection library setting must be true or false.',
'og_default_site_name_string' => 'OG site name default must be a string.',
'og_default_site_name_max' => 'OG site name default may not exceed 200 characters.',
'og_image_default_width_integer' => 'OG image default width must be an integer.',
'og_image_default_width_min' => 'OG image default width must be 0 or greater.',
'og_image_default_width_max' => 'OG image default width may not exceed 8000.',
'og_image_default_height_integer' => 'OG image default height must be an integer.',
'og_image_default_height_min' => 'OG image default height must be 0 or greater.',
'og_image_default_height_max' => 'OG image default height may not exceed 8000.',
'twitter_default_card_string' => 'Twitter card default must be a string.',
'twitter_default_card_in' => 'Twitter card default must be one of summary, summary_large_image, app, player.',
'twitter_default_site_string' => 'Twitter site handle must be a string.',
'twitter_default_site_max' => 'Twitter site handle may not exceed 50 characters.',
'seo_cache_enabled_boolean' => 'SEO cache setting must be true or false.',
'seo_cache_ttl_integer' => 'SEO cache TTL must be an integer.',
'seo_cache_ttl_min' => 'SEO cache TTL must be at least 60 seconds.',
@@ -835,6 +851,55 @@ return [
'websocket_server_port_max' => 'WebSocket server port may not be greater than 65535.',
'websocket_server_scheme_invalid' => 'Please select a valid WebSocket server scheme.',
'search_engine_driver_invalid' => 'Please select a valid search engine driver.',
// Identity verification (IDV) settings
'identity_default_provider_string' => 'Default provider must be a string.',
'identity_default_provider_max' => 'Default provider identifier may not be longer than 100 characters.',
'identity_purpose_providers_array' => 'Purpose-to-provider mapping must be an array.',
'identity_purpose_provider_string' => 'Purpose provider identifier must be a string.',
'identity_purpose_provider_max' => 'Purpose provider identifier may not be longer than 100 characters.',
'identity_challenge_ttl_required' => 'Please enter the challenge TTL.',
'identity_challenge_ttl_integer' => 'Challenge TTL must be an integer.',
'identity_challenge_ttl_min' => 'Challenge TTL must be at least 1 minute.',
'identity_challenge_ttl_max' => 'Challenge TTL may not be greater than 1440 minutes (24 hours).',
'identity_max_attempts_required' => 'Please enter the maximum number of attempts.',
'identity_max_attempts_integer' => 'Maximum attempts must be an integer.',
'identity_max_attempts_min' => 'Maximum attempts must be at least 1.',
'identity_max_attempts_max' => 'Maximum attempts may not be greater than 20.',
],
// Identity verification policy validation messages
'identity_policy' => [
'key_required' => 'Please enter the policy key.',
'key_max' => 'Policy key may not be longer than 120 characters.',
'key_unique' => 'This policy key is already in use.',
'scope_required' => 'Please select a scope.',
'scope_invalid' => 'Scope must be one of route, hook, custom.',
'target_required' => 'Please enter the target (route or hook name).',
'target_max' => 'Target may not be longer than 255 characters.',
'purpose_required' => 'Please select a purpose.',
'purpose_max' => 'Purpose may not be longer than 64 characters.',
'provider_id_max' => 'Provider identifier may not be longer than 64 characters.',
'grace_minutes_required' => 'Please enter the grace minutes.',
'grace_minutes_integer' => 'Grace minutes must be an integer.',
'grace_minutes_min' => 'Grace minutes must be at least 0.',
'grace_minutes_max' => 'Grace minutes may not be greater than 43200 (30 days).',
'enabled_boolean' => 'Enabled must be true or false.',
'priority_integer' => 'Priority must be an integer.',
'priority_min' => 'Priority must be at least 0.',
'priority_max' => 'Priority may not be greater than 65535.',
'conditions_array' => 'Conditions must be an array.',
'applies_to_required' => 'Please select applies-to.',
'applies_to_invalid' => 'Applies-to must be one of self, admin, both.',
'fail_mode_required' => 'Please select a fail mode.',
'fail_mode_invalid' => 'Fail mode must be block or log_only.',
],
// Identity message definition validation
'identity_message' => [
'provider_not_registered' => 'The IDV provider is not registered.',
'scope_value_not_admin_policy' => 'The scope value must match the key of an admin-created policy (source_type=admin).',
'definition_already_exists' => 'A definition with the same (provider, scope_type, scope_value) already exists.',
],
// Validation attribute names (validation.attributes)
@@ -849,6 +914,21 @@ return [
'admin_email' => 'admin email',
'timezone' => 'timezone',
'language' => 'default language',
// Identity verification (IDV) fields
'identity_default_provider' => 'default provider',
'identity_purpose_providers' => 'purpose-to-provider mapping',
'identity_challenge_ttl_minutes' => 'challenge TTL',
'identity_max_attempts' => 'maximum attempts',
// Identity verification policy fields
'identity_policy_key' => 'policy key',
'identity_policy_scope' => 'scope',
'identity_policy_target' => 'target',
'identity_policy_purpose' => 'purpose',
'identity_policy_provider_id' => 'provider',
'identity_policy_grace_minutes' => 'grace minutes',
'identity_policy_enabled' => 'enabled',
'identity_policy_applies_to' => 'applies to',
'identity_policy_fail_mode' => 'fail mode',
// Mail settings
'mailer' => 'mailer',
'host' => 'SMTP host',
+6 -37
View File
@@ -32,6 +32,10 @@ return [
'delete' => '삭제',
'login' => '로그인',
'logout' => '로그아웃',
'login_failed' => '로그인 실패',
'account_locked' => '계정 잠금',
'request' => '요청',
'expired' => '만료',
'export' => '내보내기',
'import' => '가져오기',
'index' => '목록 조회',
@@ -45,18 +49,11 @@ return [
'run' => '실행',
'duplicate' => '복제',
'upload' => '업로드',
'reorder' => '순서 변경',
'toggle_status' => '상태 전환',
'toggle_active' => '활성 상태 변경',
'bulk_update' => '일괄 수정',
'bulk_delete' => '일괄 삭제',
'bulk_status' => '일괄 상태 변경',
'bulk_update_status' => '일괄 상태 변경',
'cancel' => '취소',
'partial_cancel' => '부분 취소',
'refund' => '환불',
'restore' => '복원',
'blind' => '블라인드',
'publish' => '발행',
'register' => '회원가입',
'reset_password' => '비밀번호 재설정',
@@ -65,13 +62,8 @@ return [
'check' => '확인',
'sync_permissions' => '권한 동기화',
'sync_roles' => '역할 동기화',
'copy' => '복사',
'reply' => '답변',
'toggle' => '토글',
'download' => '다운로드',
'earn' => '적립',
'use' => '사용',
// 추가 액션
'withdraw' => '탈퇴',
'update_order' => '순서 변경',
@@ -81,31 +73,6 @@ return [
'reset' => '초기화',
// 이커머스/게시판 공용
'bulk_price_update' => '일괄 가격 수정',
'bulk_stock_update' => '일괄 재고 수정',
'stock_sync' => '재고 동기화',
'bulk_status_update' => '일괄 상태 변경',
'bulk_shipping_update' => '운송장 일괄 입력',
'update_shipping_address' => '배송지 변경',
'send_email' => '이메일 발송',
'payment_complete' => '결제 완료',
'payment_failed' => '결제 실패',
'status_change' => '상태 변경',
'bulk_status_change' => '일괄 상태 변경',
'confirm' => '구매 확정',
'set_default' => '기본값 설정',
'bulk_toggle_active' => '일괄 활성 상태 변경',
'bulk_create' => '일괄 생성',
'add' => '추가',
'update_quantity' => '수량 변경',
'change_option' => '옵션 변경',
'delete_all' => '전체 삭제',
'add_to_menu' => '메뉴 추가',
'bulk_apply' => '일괄 적용',
'update_status' => '상태 변경',
'restore_content' => '콘텐츠 복원',
'blind_content' => '콘텐츠 블라인드',
'delete_content' => '콘텐츠 삭제',
],
// 설명 템플릿 (description_key로 사용)
@@ -173,6 +140,8 @@ return [
'auth_forgot_password' => '비밀번호 찾기 요청',
'auth_reset_password' => '비밀번호 재설정',
'auth_record_consents' => '이용약관 동의 기록',
'auth_login_failed' => '로그인 실패 (:email)',
'auth_account_locked' => '계정 잠금 (:attempts회 실패, :minutes분 차단)',
// 스케줄 관리
'schedule_index' => '스케줄 목록 조회',
+2
View File
@@ -31,6 +31,8 @@ return [
'account_inactive' => '비활성화된 계정입니다. 관리자에게 문의해주세요.',
'account_blocked' => '차단된 계정입니다. 관리자에게 문의해주세요.',
'account_withdrawn' => '탈퇴한 계정입니다.',
'account_pending_verification' => '본인인증이 완료되지 않은 계정입니다. 이메일 인증을 완료해주세요.',
'account_locked' => '로그인 시도 횟수 초과로 계정이 잠겼습니다. :minutes분 후 다시 시도해주세요.',
// 비밀번호 재설정
'reset_token_invalid' => '유효하지 않은 비밀번호 재설정 토큰입니다.',
+1
View File
@@ -19,6 +19,7 @@ return [
'system' => '시스템',
'yes' => '예',
'no' => '아니오',
'unknown' => '알 수 없음',
// 공통 에러 메시지
'errors' => [
-8
View File
@@ -30,12 +30,4 @@ return [
'activities' => [
'user_registered' => ':name 님이 가입했습니다.',
],
// 시스템 알림
'alerts' => [
'system_update_available' => '시스템 업데이트 가능',
'system_update_message' => '새로운 버전의 그누보드7이 출시되었습니다. 업데이트를 확인해 주세요.',
'disk_space_low' => '디스크 공간 부족',
'disk_space_message' => '디스크 사용량이 90%를 초과했습니다. 불필요한 파일을 정리해 주세요.',
],
];
+3
View File
@@ -40,6 +40,8 @@ return [
'restore_failed' => '설정 복원에 실패했습니다.',
'category_not_found' => '설정 카테고리를 찾을 수 없습니다: :category',
'save_failed' => '설정 저장에 실패했습니다: :category',
'json_parse_failed' => 'JSON 파일 파싱에 실패했습니다: :path (:error)',
'add_category_module_only' => 'addCategory는 모듈에서만 사용할 수 있습니다.',
],
// 코어 업데이트 관련 예외
@@ -71,5 +73,6 @@ return [
'composer_json_not_found' => 'composer.json 파일을 찾을 수 없습니다: :path',
'no_composer_lock' => 'composer.lock 파일이 필요합니다. 먼저 composer install을 실행하세요: :path',
'vendor_dir_not_found' => 'vendor/ 디렉토리가 존재하지 않습니다. 먼저 composer install을 실행하세요: :path',
'composer_binary_not_found' => 'Composer 바이너리를 찾을 수 없습니다. COMPOSER_BINARY 환경변수를 설정하거나 composer를 PATH에 추가하세요.',
],
];
+32
View File
@@ -15,6 +15,11 @@ return [
'zip_invalid_manifest' => 'ZIP 내부의 :file 매니페스트를 JSON 으로 해석할 수 없습니다.',
'zip_identifier_mismatch' => 'ZIP 매니페스트의 식별자가 대상 확장과 일치하지 않습니다. (기대: :expected, 실제: :actual)',
'zip_missing_version' => 'ZIP 내부의 :file 매니페스트에 version 필드가 없습니다.',
'not_found' => '확장(:identifier) 을 찾을 수 없습니다.',
'cascade_dependency_failed' => '동반 설치할 :type (:identifier) 의 설치에 실패했습니다: :message',
'invalid_type' => '유효하지 않은 확장 타입입니다.',
'not_auto_deactivated' => '이 확장은 코어 버전 호환성 문제로 자동 비활성화된 상태가 아닙니다.',
'hidden_extension' => '내부용(hidden) 확장은 사용자 노출 대상이 아닙니다.',
],
'warnings' => [
@@ -24,6 +29,33 @@ return [
'alerts' => [
'incompatible_deactivated' => ':type ":name" 자동 비활성화됨',
'incompatible_message' => '필요 버전: :required, 현재 설치됨: :installed',
'recovered_title' => ':type ":name" 다시 호환 가능',
'recovered_body' => '코어 업그레이드 후 호환됩니다 (이전 요구: :previously_required). 다시 활성화할 수 있습니다.',
'recovered_success' => '확장이 다시 활성화되었습니다.',
'dismissed' => '알림을 닫았습니다.',
'auto_deactivated_listed' => '자동 비활성화된 확장 목록입니다.',
'recover_action' => '다시 활성화',
'dismiss_action' => '알림 닫기',
],
'badges' => [
'incompatible' => '코어 업그레이드 필요',
'incompatible_tooltip' => '코어 :required 이상 필요 (현재: :installed)',
'incompatible_sr' => ':name 은(는) 코어 :required 이상이 필요하지만 현재 :installed 가 설치되어 있어 업데이트할 수 없습니다.',
],
'banner' => [
'title' => '코어 호환성 문제로 자동 비활성화된 확장이 있습니다',
'item_required' => '필요 버전: :required',
'guide_link' => '코어 업그레이드 가이드',
'dismiss' => '닫기',
],
'update_modal' => [
'compat_warning_title' => '코어 버전 호환성 경고',
'compat_warning_message' => '이 :type 은(는) 코어 :required 이상이 필요합니다. (현재: :installed)',
'compat_guide_link' => '코어 업그레이드 가이드 보기',
'force_label' => '경고를 무시하고 강제 업데이트 (권장하지 않음)',
],
'commands' => [
+114
View File
@@ -0,0 +1,114 @@
<?php
return [
'providers' => [
'mail' => [
'label' => '이메일',
'settings' => [
'code_length' => '인증 코드 길이',
'code_length_help' => '발송되는 숫자 코드의 자릿수 (기본 6, 최소 4, 최대 10).',
'from_address' => '발신자 주소',
'from_address_help' => '비어 있으면 시스템 기본 발신자를 사용합니다.',
],
],
],
'errors' => [
'verification_required' => '본인 확인이 필요합니다.',
'challenge_not_found' => '유효하지 않은 인증 요청입니다.',
'wrong_provider' => '이 인증 요청은 다른 프로바이더에서 처리해야 합니다.',
'invalid_state' => '이미 처리된 인증 요청입니다.',
'expired' => '인증 시간이 만료되었습니다. 다시 시도해주세요.',
'max_attempts' => '시도 횟수를 초과했습니다. 다시 요청해주세요.',
'invalid_code' => '인증 코드가 올바르지 않습니다.',
'invalid_verification_token' => '유효하지 않은 본인인증 토큰입니다.',
'missing_target' => '인증 대상(이메일·전화번호)이 필요합니다.',
'target_mismatch' => '인증한 대상과 요청한 대상이 일치하지 않습니다.',
'purpose_not_supported' => '선택된 프로바이더는 이 목적을 지원하지 않습니다.',
'provider_unavailable' => '본인인증 프로바이더를 사용할 수 없습니다.',
'generic' => '본인인증에 실패했습니다.',
'missing_scope_or_target' => '정책 조회를 위해 scope 와 target 이 모두 필요합니다.',
'admin_policy_has_no_default' => '관리자가 직접 생성한 정책에는 선언 기본값이 없습니다.',
'reset_field_failed' => '선언 기본값 복원에 실패했습니다. 필드가 유효한지 확인하세요.',
],
'messages' => [
'challenge_requested' => '본인인증 코드를 발송했습니다.',
'challenge_verified' => '본인 확인이 완료되었습니다.',
'challenge_cancelled' => '본인인증 요청이 취소되었습니다.',
],
'logs' => [
'activity' => [
'requested' => ':email 로 본인인증 코드를 발송했습니다.',
'verified' => '본인 확인이 완료되었습니다.',
'failed' => '본인인증에 실패했습니다.',
'expired' => '본인인증 시간이 만료되었습니다.',
'cancelled' => '본인인증 요청을 취소했습니다.',
],
],
'purposes' => [
'signup' => [
'label' => '회원가입 인증',
'description' => '신규 가입자의 이메일/전화번호 소유 확인.',
],
'password_reset' => [
'label' => '비밀번호 재설정',
'description' => '비밀번호를 잊은 사용자가 본인 확인 후 재설정.',
],
'self_update' => [
'label' => '자기 정보 변경',
'description' => '로그인 사용자가 이메일/전화 등 본인 정보를 변경할 때.',
],
'sensitive_action' => [
'label' => '민감 작업',
'description' => '계정 탈퇴·관리자 작업 등 재인증이 필요한 시점.',
],
],
'channels' => [
'email' => '이메일',
],
'origin_types' => [
'route' => '라우트',
'hook' => '훅',
'policy' => '정책',
'middleware' => '미들웨어',
'api' => 'API 직접 호출',
'custom' => '커스텀',
'system' => '시스템',
],
'policy' => [
'scope' => [
'route' => '라우트',
'hook' => '훅',
'custom' => '커스텀',
],
'fail_mode' => [
'block' => '차단(HTTP 428)',
'log_only' => '로그만 기록',
],
'applies_to' => [
'self' => '본인',
'admin' => '관리자',
'both' => '모두',
],
'source_type' => [
'core' => '코어',
'module' => '모듈',
'plugin' => '플러그인',
'admin' => '관리자',
],
],
'message' => [
'scope_type' => [
'provider_default' => 'Provider 기본',
'purpose' => 'Purpose 별',
'policy' => 'Policy 별',
],
],
];
+30
View File
@@ -0,0 +1,30 @@
<?php
return [
// Definition CRUD
'definition_list_success' => 'IDV 메시지 정의 목록을 조회했습니다.',
'definition_list_failed' => 'IDV 메시지 정의 목록 조회에 실패했습니다.',
'definition_show_success' => 'IDV 메시지 정의 상세를 조회했습니다.',
'definition_show_failed' => 'IDV 메시지 정의 상세 조회에 실패했습니다.',
'definition_created' => 'IDV 메시지 정의가 생성되었습니다.',
'definition_create_failed' => 'IDV 메시지 정의 생성에 실패했습니다.',
'definition_updated' => 'IDV 메시지 정의가 수정되었습니다.',
'definition_update_failed' => 'IDV 메시지 정의 수정에 실패했습니다.',
'definition_toggled' => 'IDV 메시지 정의 활성 상태가 변경되었습니다.',
'definition_toggle_failed' => 'IDV 메시지 정의 활성 상태 변경에 실패했습니다.',
'definition_reset' => 'IDV 메시지 정의가 기본값으로 복원되었습니다.',
'definition_reset_failed' => 'IDV 메시지 정의 기본값 복원에 실패했습니다.',
'definition_deleted' => 'IDV 메시지 정의가 삭제되었습니다.',
'definition_delete_failed' => 'IDV 메시지 정의 삭제에 실패했습니다.',
'definition_delete_forbidden' => '시드된 기본 메시지 정의는 삭제할 수 없습니다.',
// Template CRUD
'template_updated' => 'IDV 메시지 템플릿이 수정되었습니다.',
'template_update_failed' => 'IDV 메시지 템플릿 수정에 실패했습니다.',
'template_toggled' => 'IDV 메시지 템플릿 활성 상태가 변경되었습니다.',
'template_toggle_failed' => 'IDV 메시지 템플릿 활성 상태 변경에 실패했습니다.',
'template_reset' => 'IDV 메시지 템플릿이 기본값으로 복원되었습니다.',
'template_reset_failed' => 'IDV 메시지 템플릿 기본값 복원에 실패했습니다.',
'template_preview_success' => 'IDV 메시지 템플릿 미리보기를 생성했습니다.',
'template_preview_failed' => 'IDV 메시지 템플릿 미리보기 생성에 실패했습니다.',
];
+63
View File
@@ -0,0 +1,63 @@
<?php
return [
'fetch_success' => '언어팩 목록을 조회했습니다.',
'fetch_failed' => '언어팩 목록을 불러오지 못했습니다: :error',
'not_found' => '언어팩을 찾을 수 없습니다.',
'install_success' => '언어팩을 설치했습니다.',
'install_failed' => '언어팩 설치에 실패했습니다: :error',
'activate_success' => '언어팩을 활성화했습니다.',
'activate_failed' => '언어팩 활성화에 실패했습니다: :error',
'deactivate_success' => '언어팩을 비활성화했습니다.',
'deactivate_failed' => '언어팩 비활성화에 실패했습니다: :error',
'uninstall_success' => '언어팩을 제거했습니다.',
'uninstall_failed' => '언어팩 제거에 실패했습니다: :error',
'manifest_invalid' => 'language-pack.json 검증에 실패했습니다.',
'check_updates_success' => '업데이트 확인을 완료했습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다: :error',
'update_success' => '언어팩을 업데이트했습니다.',
'update_failed' => '언어팩 업데이트에 실패했습니다: :error',
'refresh_cache_success' => '언어팩 캐시를 갱신했습니다.',
'refresh_cache_failed' => '언어팩 캐시 갱신에 실패했습니다: :error',
'preview_success' => 'manifest 미리보기를 완료했습니다.',
'preview_failed' => 'manifest 미리보기에 실패했습니다: :error',
'errors' => [
'manifest_not_found' => 'ZIP 안에서 language-pack.json 파일을 찾을 수 없습니다.',
'manifest_invalid_json' => 'language-pack.json 의 JSON 형식이 올바르지 않습니다.',
'php_outside_backend' => 'backend/ 디렉토리 외에 PHP 파일이 포함되어 있습니다 (:file).',
'unsafe_php_pattern' => 'PHP 파일에 허용되지 않는 코드 패턴이 포함되어 있습니다 (:file).',
'core_locale_missing' => '코어 언어팩(:locale)이 먼저 활성화되어야 합니다.',
'target_not_installed' => '대상 :scope (:target)이 설치되어 있지 않습니다.',
'target_inactive' => '대상 :scope (:target)이 비활성 상태입니다. 먼저 활성화해야 합니다.',
'target_version_too_old' => '대상 :scope (:target) 버전이 요구 조건(:constraint)을 충족하지 않습니다.',
'downgrade_blocked' => '다운그레이드가 차단되었습니다 (:from → :to).',
'protected_pack' => '보호된 언어팩은 비활성화/제거할 수 없습니다.',
'download_failed' => 'URL(:url) 에서 언어팩을 다운로드하지 못했습니다: :error',
'checksum_mismatch' => '체크섬이 일치하지 않습니다.',
'update_no_source' => '업데이트 소스 정보가 없습니다 (GitHub 소스 언어팩만 업데이트 가능).',
'update_already_latest' => '이미 최신 버전입니다.',
'preview_invalid_manifest' => 'manifest 파일이 유효하지 않아 미리보기에 실패했습니다.',
'operation_in_progress' => '언어팩(:identifier) 에서 다른 작업이 진행 중입니다. 완료 후 다시 시도해주세요.',
'bundled_not_found' => '번들 디렉토리(lang-packs/_bundled/:identifier) 가 존재하지 않습니다.',
'slot_conflict' => '같은 슬롯에 이미 활성 언어팩(:current)이 있습니다. (:target)으로 교체하려면 확인이 필요합니다.',
'directory_not_writable' => '언어팩 설치 디렉토리(:path) 에 쓰기 권한이 없습니다. 웹 서버 사용자(예: www-data) 에게 쓰기 권한을 부여하세요. (예: sudo chgrp www-data :path && sudo chmod g+w :path)',
'identifier_not_found' => '언어팩을 찾을 수 없습니다 (:identifier).',
'unsupported_source' => '지원하지 않는 소스 (:source) — bundled, github, url 중 하나를 사용하세요.',
],
'validation' => [
'file_required' => '언어팩 ZIP 파일을 업로드하세요.',
'file_invalid' => '업로드된 파일이 유효하지 않습니다.',
'file_too_large' => '파일 크기는 10MB 를 초과할 수 없습니다.',
'file_not_zip' => 'ZIP 형식의 파일만 업로드할 수 있습니다.',
'github_url_required' => 'GitHub URL 을 입력하세요.',
'github_url_invalid' => '올바른 URL 을 입력하세요.',
'github_url_format' => 'GitHub 저장소 URL 형식이어야 합니다 (예: https://github.com/owner/repo).',
'url_required' => '다운로드 URL 을 입력하세요.',
'url_invalid' => '올바른 URL 을 입력하세요.',
'checksum_invalid' => 'SHA-256 체크섬은 64자 16진수여야 합니다.',
'identifier_required' => '언어팩 식별자를 입력하세요.',
'identifier_invalid' => '식별자는 영문/숫자/점/언더스코어/하이픈만 허용됩니다.',
],
];
+14 -10
View File
@@ -7,21 +7,25 @@ return [
// 모듈 작업 메시지
'fetch_success' => '모듈을 성공적으로 가져왔습니다.',
'fetch_failed' => '모듈을 가져오는데 실패했습니다.',
'fetch_failed' => '모듈을 가져오는데 실패했습니다: :error',
'install_success' => '모듈이 성공적으로 설치되었습니다.',
'install_failed' => '모듈 설치에 실패했습니다.',
'install_failed' => '모듈 설치에 실패했습니다: :error',
'preview_success' => 'manifest 미리보기를 완료했습니다.',
'preview_failed' => 'manifest 미리보기에 실패했습니다: :error',
'uninstall_success' => '모듈이 성공적으로 제거되었습니다.',
'uninstall_failed' => '모듈 제거에 실패했습니다.',
'uninstall_failed' => '모듈 제거에 실패했습니다: :error',
'activate_success' => '모듈이 성공적으로 활성화되었습니다.',
'activate_failed' => '모듈 활성화에 실패했습니다.',
'activate_failed' => '모듈 활성화에 실패했습니다: :error',
'deactivate_success' => '모듈이 성공적으로 비활성화되었습니다.',
'deactivate_failed' => '모듈 비활성화에 실패했습니다.',
'deactivate_failed' => '모듈 비활성화에 실패했습니다: :error',
'update_success' => '모듈이 성공적으로 업데이트되었습니다.',
'update_failed' => '모듈 업데이트에 실패했습니다.',
'update_failed' => '모듈 업데이트에 실패했습니다: :error',
'refresh_layouts_success' => '모듈 레이아웃이 성공적으로 갱신되었습니다.',
'refresh_layouts_failed' => '모듈 레이아웃 갱신에 실패했습니다.',
'refresh_layouts_failed' => '모듈 레이아웃 갱신에 실패했습니다: :error',
'uninstall_info_success' => '모듈 삭제 정보를 성공적으로 조회했습니다.',
'uninstall_info_failed' => '모듈 삭제 정보 조회에 실패했습니다.',
'uninstall_info_failed' => '모듈 삭제 정보 조회에 실패했습니다: :error',
'dependent_templates_success' => '의존 템플릿 정보를 성공적으로 조회했습니다.',
'dependent_templates_failed' => '의존 템플릿 정보 조회에 실패했습니다: :error',
'license_not_found' => '모듈 라이선스 파일을 찾을 수 없습니다.',
// 상태
@@ -35,8 +39,8 @@ return [
// 오류 메시지
'errors' => [
'module_class_not_found' => '모듈 클래스를 찾을 수 없습니다.',
'migration_failed' => '마이그레이션 실행에 실패했습니다.',
'dependency_check_failed' => '의존성 확인에 실패했습니다.',
'migration_failed' => '마이그레이션 실행에 실패했습니다: :error',
'dependency_check_failed' => '의존성 확인에 실패했습니다: :error',
'database_error' => '데이터베이스 오류가 발생했습니다.',
'module_not_found' => '모듈 :name을(를) 찾을 수 없습니다.',
'module_not_active' => '모듈 :name이(가) 활성화되어 있지 않습니다.',
+13 -12
View File
@@ -119,10 +119,10 @@ return [
// 업데이트 관련 메시지
'update_success' => '모듈 ":module"이(가) :version 버전으로 업데이트되었습니다.',
'update_failed' => '모듈 업데이트에 실패했습니다: :error',
'update_hook_failed' => '모듈 업데이트 훅 실행에 실패했습니다.',
'update_hook_failed' => '모듈 업데이트 훅 실행에 실패했습니다: :error',
'no_update_available' => '업데이트할 내용이 없습니다.',
'check_updates_success' => '업데이트 확인이 완료되었습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다: :error',
'check_modified_layouts_success' => '수정된 레이아웃 확인이 완료되었습니다.',
'check_modified_layouts_failed' => '수정된 레이아웃 확인에 실패했습니다: :error',
'not_installed' => '모듈 ":module"이(가) 설치되지 않았습니다.',
@@ -130,7 +130,7 @@ return [
// _pending 관련 메시지
'pending_not_found' => '설치 대기 목록에서 모듈 ":module"을(를) 찾을 수 없습니다.',
'already_exists' => '모듈 ":module"이(가) 이미 존재합니다.',
'move_failed' => '모듈 ":module" 이동에 실패했습니다.',
'move_failed' => '모듈 ":module" 이동에 실패했습니다: :error',
// 모듈 서비스 오류 메시지
'deactivate_warning' => '이 모듈에 의존하는 활성 템플릿이 있습니다.',
@@ -158,14 +158,15 @@ return [
// 오류 메시지
'errors' => [
'force_update_no_source' => ':module 을(를) 강제 업데이트할 소스를 찾을 수 없습니다. 번들 및 GitHub URL이 모두 없습니다.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다.',
'downgrade_blocked' => '다운그레이드가 차단되었습니다 (:from → :to). 의도적 다운그레이드는 --force 옵션을 사용하세요.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다: :error',
'module_json_not_found' => 'module.json 파일을 찾을 수 없습니다.',
'module_json_invalid' => 'module.json 파일 형식이 올바르지 않습니다.',
'identifier_missing' => '모듈 식별자가 누락되었습니다.',
'already_installed' => '이미 설치된 모듈입니다.',
'install_failed' => '모듈 설치에 실패했습니다.',
'install_failed' => '모듈 설치에 실패했습니다: :error',
'github_url_invalid' => '유효하지 않은 GitHub URL 형식입니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다: :error',
'github_repo_not_found' => 'GitHub 저장소를 찾을 수 없습니다.',
'module_not_found' => '모듈 :name을(를) 찾을 수 없습니다.',
'module_not_active' => '모듈 :name이(가) 활성화되어 있지 않습니다.',
@@ -180,16 +181,16 @@ return [
'layout_validation_json_error' => '레이아웃 파일 :file의 JSON 파싱에 실패했습니다: :error',
'layout_validation_missing_name' => '레이아웃 파일 :file에 layout_name이 누락되었습니다.',
'layout_validation_partial_error' => '레이아웃 파일 :file의 partial 처리에 실패했습니다: :error (partial: :partial)',
'layout_validation_validation_failed' => '모듈 :identifier의 레이아웃 검증에 실패했습니다. :count개의 오류가 발견되었습니다.',
'layout_validation_validation_failed' => '모듈 :identifier의 레이아웃 검증에 실패했습니다. :count개의 오류가 발견되었습니다: :error',
'operation_in_progress' => '모듈 ":name"이(가) 현재 :status 상태입니다. 작업이 완료될 때까지 기다려 주세요.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다: :error',
'invalid_github_url' => '유효하지 않은 GitHub URL입니다.',
'zip_url_not_found' => 'ZIP 다운로드 URL을 찾을 수 없습니다.',
'download_failed' => '모듈 ":module" :version 버전 다운로드에 실패했습니다.',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다.',
'download_failed' => '모듈 ":module" :version 버전 다운로드에 실패했습니다: :error',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다: :error',
'extracted_dir_not_found' => '압축 해제된 디렉토리를 찾을 수 없습니다.',
'reload_failed' => '모듈 다시 로드에 실패했습니다.',
'delete_directory_failed' => '모듈 디렉토리 삭제에 실패했습니다.',
'reload_failed' => '모듈 다시 로드에 실패했습니다: :error',
'delete_directory_failed' => '모듈 디렉토리 삭제에 실패했습니다: :error',
'update_failed' => '모듈 ":module" 업데이트에 실패했습니다: :error',
'invalid_layout_strategy' => '유효하지 않은 레이아웃 전략입니다. (overwrite 또는 keep만 허용)',
'invalid_vendor_mode' => '유효하지 않은 Vendor 설치 모드입니다. (auto, composer, bundled만 허용)',
+13
View File
@@ -71,4 +71,17 @@ return [
'delete_all_failed' => '전체 알림 삭제에 실패했습니다.',
'not_found' => '알림을 찾을 수 없습니다.',
],
// 알림 채널 메타 (config/notification.php default_channels 참조)
'channels' => [
'core_default' => '코어 기본 채널',
'mail' => [
'name' => '메일',
'description' => '이메일로 알림 발송',
],
'database' => [
'name' => '사이트내 알림',
'description' => '사이트내 알림 센터에 표시',
],
],
];
+30 -25
View File
@@ -3,32 +3,36 @@
return [
// 플러그인 관련 메시지
'list_success' => '플러그인 목록을 성공적으로 가져왔습니다.',
'list_failed' => '플러그인 목록을 가져오는데 실패했습니다.',
'list_failed' => '플러그인 목록을 가져오는데 실패했습니다: :error',
'fetch_success' => '플러그인 정보를 성공적으로 가져왔습니다.',
'fetch_failed' => '플러그인 정보를 가져오는데 실패했습니다.',
'fetch_failed' => '플러그인 정보를 가져오는데 실패했습니다: :error',
'not_found' => '플러그인 :plugin을(를) 찾을 수 없습니다.',
'install_success' => '플러그인이 성공적으로 설치되었습니다.',
'install_failed' => '플러그인 설치에 실패했습니다.',
'install_validation_failed' => '플러그인 설치 검증에 실패했습니다.',
'install_failed' => '플러그인 설치에 실패했습니다: :error',
'preview_success' => 'manifest 미리보기를 완료했습니다.',
'preview_failed' => 'manifest 미리보기에 실패했습니다: :error',
'install_validation_failed' => '플러그인 설치 검증에 실패했습니다: :error',
'install_error' => '플러그인 설치 중 오류가 발생했습니다.',
'uninstall_success' => '플러그인이 성공적으로 제거되었습니다.',
'uninstall_failed' => '플러그인 제거에 실패했습니다.',
'uninstall_validation_failed' => '플러그인 제거 검증에 실패했습니다.',
'uninstall_failed' => '플러그인 제거에 실패했습니다: :error',
'uninstall_validation_failed' => '플러그인 제거 검증에 실패했습니다: :error',
'uninstall_error' => '플러그인 제거 중 오류가 발생했습니다.',
'activate_success' => '플러그인이 성공적으로 활성화되었습니다.',
'activate_failed' => '플러그인 활성화에 실패했습니다.',
'activate_validation_failed' => '플러그인 활성화 검증에 실패했습니다.',
'activate_failed' => '플러그인 활성화에 실패했습니다: :error',
'activate_validation_failed' => '플러그인 활성화 검증에 실패했습니다: :error',
'activate_error' => '플러그인 활성화 중 오류가 발생했습니다.',
'deactivate_success' => '플러그인이 성공적으로 비활성화되었습니다.',
'deactivate_failed' => '플러그인 비활성화에 실패했습니다.',
'deactivate_validation_failed' => '플러그인 비활성화 검증에 실패했습니다.',
'deactivate_failed' => '플러그인 비활성화에 실패했습니다: :error',
'deactivate_validation_failed' => '플러그인 비활성화 검증에 실패했습니다: :error',
'deactivate_error' => '플러그인 비활성화 중 오류가 발생했습니다.',
'refresh_layouts_success' => '플러그인 레이아웃이 성공적으로 갱신되었습니다.',
'refresh_layouts_failed' => '플러그인 레이아웃 갱신에 실패했습니다: :error',
'uninstall_info_success' => '플러그인 삭제 정보를 성공적으로 조회했습니다.',
'uninstall_info_failed' => '플러그인 삭제 정보 조회에 실패했습니다.',
'uninstall_info_failed' => '플러그인 삭제 정보 조회에 실패했습니다: :error',
'dependent_templates_success' => '의존 템플릿 정보를 성공적으로 조회했습니다.',
'dependent_templates_failed' => '의존 템플릿 정보 조회에 실패했습니다: :error',
'license_not_found' => '플러그인 라이선스 파일을 찾을 수 없습니다.',
'refresh_layouts_validation_failed' => '플러그인 레이아웃 갱신 검증에 실패했습니다.',
'refresh_layouts_validation_failed' => '플러그인 레이아웃 갱신 검증에 실패했습니다: :error',
'refresh_layouts_error' => '플러그인 레이아웃 갱신 중 오류가 발생했습니다.',
// 상태
@@ -41,10 +45,10 @@ return [
// 업데이트 관련 메시지
'update_success' => '플러그인 ":plugin"이(가) :version 버전으로 업데이트되었습니다.',
'update_failed' => '플러그인 업데이트에 실패했습니다: :error',
'update_hook_failed' => '플러그인 업데이트 훅 실행에 실패했습니다.',
'update_hook_failed' => '플러그인 업데이트 훅 실행에 실패했습니다: :error',
'no_update_available' => '업데이트할 내용이 없습니다.',
'check_updates_success' => '업데이트 확인이 완료되었습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다: :error',
'check_modified_layouts_success' => '수정된 레이아웃 확인이 완료되었습니다.',
'check_modified_layouts_failed' => '수정된 레이아웃 확인에 실패했습니다: :error',
'not_installed' => '플러그인 ":plugin"이(가) 설치되지 않았습니다.',
@@ -52,7 +56,7 @@ return [
// _pending 관련 메시지
'pending_not_found' => '설치 대기 목록에서 플러그인 ":plugin"을(를) 찾을 수 없습니다.',
'already_exists' => '플러그인 ":plugin"이(가) 이미 존재합니다.',
'move_failed' => '플러그인 ":plugin" 이동에 실패했습니다.',
'move_failed' => '플러그인 ":plugin" 이동에 실패했습니다: :error',
// 의존성 관련 메시지
'dependency_not_active' => '의존성 ":dependency"이(가) 설치되지 않았거나 비활성 상태입니다.',
@@ -84,6 +88,7 @@ return [
// 오류 메시지
'errors' => [
'force_update_no_source' => ':plugin 을(를) 강제 업데이트할 소스를 찾을 수 없습니다. 번들 및 GitHub URL이 모두 없습니다.',
'downgrade_blocked' => '다운그레이드가 차단되었습니다 (:from → :to). 의도적 다운그레이드는 --force 옵션을 사용하세요.',
'invalid_permission_structure' => '플러그인 ":identifier"의 권한 구조가 올바르지 않습니다: :reason',
'invalid_translation_path' => '플러그인 ":identifier"의 언어 파일 경로가 올바르지 않습니다. ":wrong_path" 대신 ":correct_path"를 사용해야 합니다.',
'seo_variable_conflict' => '플러그인 ":identifier"의 SEO 변수명이 기존 확장과 충돌합니다: :reason',
@@ -97,28 +102,28 @@ return [
'layout_validation_json_error' => '레이아웃 파일 :file의 JSON 파싱에 실패했습니다: :error',
'layout_validation_missing_name' => '레이아웃 파일 :file에 layout_name이 누락되었습니다.',
'layout_validation_partial_error' => '레이아웃 파일 :file의 partial 처리에 실패했습니다: :error (partial: :partial)',
'layout_validation_validation_failed' => '플러그인 :identifier의 레이아웃 검증에 실패했습니다. :count개의 오류가 발견되었습니다.',
'layout_validation_validation_failed' => '플러그인 :identifier의 레이아웃 검증에 실패했습니다. :count개의 오류가 발견되었습니다: :error',
'operation_in_progress' => '플러그인 ":name"이(가) 현재 :status 상태입니다. 작업이 완료될 때까지 기다려 주세요.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다: :error',
'invalid_github_url' => '유효하지 않은 GitHub URL입니다.',
'zip_url_not_found' => 'ZIP 다운로드 URL을 찾을 수 없습니다.',
'download_failed' => '플러그인 ":plugin" :version 버전 다운로드에 실패했습니다.',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다.',
'download_failed' => '플러그인 ":plugin" :version 버전 다운로드에 실패했습니다: :error',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다: :error',
'extracted_dir_not_found' => '압축 해제된 디렉토리를 찾을 수 없습니다.',
'reload_failed' => '플러그인 다시 로드에 실패했습니다.',
'delete_directory_failed' => '플러그인 디렉토리 삭제에 실패했습니다.',
'reload_failed' => '플러그인 다시 로드에 실패했습니다: :error',
'delete_directory_failed' => '플러그인 디렉토리 삭제에 실패했습니다: :error',
'update_failed' => '플러그인 ":plugin" 업데이트에 실패했습니다: :error',
'invalid_layout_strategy' => '유효하지 않은 레이아웃 전략입니다. (overwrite 또는 keep만 허용)',
'invalid_vendor_mode' => '유효하지 않은 Vendor 설치 모드입니다. (auto, composer, bundled만 허용)',
'github_url_invalid' => '유효하지 않은 GitHub URL 형식입니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다: :error',
'github_repo_not_found' => 'GitHub 저장소를 찾을 수 없습니다.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다: :error',
'plugin_json_not_found' => 'plugin.json 파일을 찾을 수 없습니다.',
'plugin_json_invalid' => 'plugin.json 파일 형식이 올바르지 않습니다.',
'identifier_missing' => '플러그인 식별자가 누락되었습니다.',
'already_installed' => '플러그인 ":plugin"이(가) 이미 설치되어 있습니다.',
'install_failed' => '플러그인 설치에 실패했습니다.',
'install_failed' => '플러그인 설치에 실패했습니다: :error',
],
// validation 메시지 (FormRequest)
@@ -237,7 +242,7 @@ return [
// 플러그인 설정 관련 메시지
'settings' => [
'update_failed' => '플러그인 설정 업데이트에 실패했습니다.',
'update_failed' => '플러그인 설정 업데이트에 실패했습니다: :error',
'updated' => '플러그인 설정이 성공적으로 업데이트되었습니다.',
],
+5
View File
@@ -10,6 +10,11 @@ return [
'warmup_started_layout' => ':layout 레이아웃의 SEO 캐시 워밍업을 시작합니다.',
'warmup_dispatched' => 'SEO 캐시 워밍업이 시작되었습니다.',
// Sitemap 수동 재생성
'sitemap_regenerated' => 'Sitemap 재생성이 완료되었습니다.',
'sitemap_regenerate_failed' => 'Sitemap 재생성에 실패했습니다.',
'sitemap_disabled' => 'Sitemap 생성이 비활성화되어 있습니다.',
// 캐시 통계
'stats_period' => '최근 :days일간 SEO 캐시 통계',
'stats_overall' => '전체 통계',
+36
View File
@@ -33,6 +33,40 @@ return [
// 시스템 정보 관련
'seconds' => '초',
// 드라이버 라벨 (DriverRegistryService 가 활성 언어팩 별로 조회)
'drivers' => [
'storage' => [
'local' => '로컬',
's3' => 'Amazon S3',
],
'cache' => [
'file' => '파일',
'redis' => 'Redis',
],
'session' => [
'file' => '파일',
'database' => '데이터베이스',
'redis' => 'Redis',
],
'queue' => [
'sync' => '동기',
'database' => '데이터베이스',
'redis' => 'Redis',
],
'log' => [
'single' => '단일 파일',
'daily' => '일별 파일',
],
'websocket' => [
'reverb' => 'Laravel Reverb',
],
'mail' => [
'smtp' => 'SMTP',
'mailgun' => 'Mailgun',
'ses' => 'SES (Amazon)',
],
],
// 드라이버 연결 테스트 메시지
'driver_test_success' => '모든 드라이버 연결 테스트가 성공했습니다.',
'driver_test_partial' => '일부 드라이버 연결 테스트가 실패했습니다.',
@@ -138,5 +172,7 @@ return [
'all_extract_methods_failed' => '모든 아카이브 추출 방법이 실패했습니다. --source 옵션으로 수동 업데이트를 시도하세요.',
'unzip_command_failed' => 'unzip 명령어 실행 실패 (종료 코드: :code). :output',
'zip_file_not_found' => '지정된 ZIP 파일을 찾을 수 없습니다: :path',
'source_vendor_missing' => '소스 디렉토리에 vendor가 없습니다. composer install이 실행되지 않았을 수 있습니다.',
'composer_failed_with_output' => 'composer install 실행에 실패했습니다.:output',
],
];
+32 -29
View File
@@ -5,32 +5,33 @@ return [
'errors' => [
'force_update_no_source' => ':template 을(를) 강제 업데이트할 소스를 찾을 수 없습니다. 번들 및 GitHub URL이 모두 없습니다.',
'downgrade_blocked' => '다운그레이드가 차단되었습니다 (:from → :to). 의도적 다운그레이드는 --force 옵션을 사용하세요.',
'not_found' => '템플릿을 찾을 수 없습니다. (:template)',
'not_installed' => '템플릿이 설치되지 않았습니다. (:template)',
'already_active' => '이미 활성화된 템플릿입니다.',
'invalid_format' => '잘못된 템플릿 형식입니다.',
'activation_failed' => '템플릿 활성화에 실패했습니다.',
'file_copy_failed' => '파일 복사에 실패했습니다.',
'activation_failed' => '템플릿 활성화에 실패했습니다: :error',
'file_copy_failed' => '파일 복사에 실패했습니다: :error',
'dist_directory_not_found' => '템플릿 빌드 결과물(dist)을 찾을 수 없습니다.',
'invalid_directory_name' => '잘못된 디렉토리명입니다. vendor-name 형식을 사용하세요.',
'dependency_not_met' => '필수 의존성 :dependency (:type)이 충족되지 않았습니다.',
'version_mismatch' => ':dependency 버전이 맞지 않습니다. (필요: :required, 설치됨: :installed)',
'deactivation_failed' => '템플릿 비활성화에 실패했습니다.',
'installation_failed' => '템플릿 설치에 실패했습니다.',
'uninstallation_failed' => '템플릿 제거에 실패했습니다.',
'deactivation_failed' => '템플릿 비활성화에 실패했습니다: :error',
'installation_failed' => '템플릿 설치에 실패했습니다: :error',
'uninstallation_failed' => '템플릿 제거에 실패했습니다: :error',
'template_json_not_found' => 'template.json 파일을 찾을 수 없습니다.',
'template_json_invalid' => 'template.json 파일이 유효하지 않습니다.',
'missing_required_fields' => '필수 필드가 누락되었습니다.',
'invalid_type' => '잘못된 템플릿 타입입니다. (admin 또는 user만 허용)',
'copy_rollback_failed' => '파일 복사 롤백에 실패했습니다.',
'copy_rollback_failed' => '파일 복사 롤백에 실패했습니다: :error',
'invalid_layout_json' => '레이아웃 JSON 파일이 유효하지 않습니다.',
'missing_layout_name' => '레이아웃 JSON에 layout_name 필드가 누락되었습니다.',
'layout_registration_failed' => '레이아웃 등록에 실패했습니다.',
'layout_registration_failed' => '레이아웃 등록에 실패했습니다: :error',
'layout_validation_failed' => ':template 템플릿의 레이아웃 검증에 실패했습니다. (:count개 오류)',
'layout_validation_json_error' => ':file - JSON 파싱 오류: :error',
'layout_validation_missing_name' => ':file - layout_name 필드가 누락되었습니다.',
'layout_validation_partial_error' => ':file - Partial 처리 오류 (:partial): :error',
'override_layout_registration_failed' => '오버라이드 레이아웃 등록에 실패했습니다.',
'override_layout_registration_failed' => '오버라이드 레이아웃 등록에 실패했습니다: :error',
'file_not_found' => '파일을 찾을 수 없습니다.',
'file_type_not_allowed' => '허용되지 않은 파일 타입입니다.',
'components_not_found' => '컴포넌트 정의 파일을 찾을 수 없습니다.',
@@ -39,21 +40,21 @@ return [
'invalid_json' => '유효하지 않은 JSON 형식입니다.',
'invalid_cache_data' => '캐시 데이터가 손상되었습니다. 다시 시도해주세요.',
'unknown_error' => '알 수 없는 오류가 발생했습니다.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다.',
'zip_open_failed' => 'ZIP 파일을 열 수 없습니다: :error',
'identifier_missing' => '템플릿 식별자가 누락되었습니다.',
'already_installed' => '이미 설치된 템플릿입니다.',
'install_failed' => '템플릿 설치에 실패했습니다.',
'install_failed' => '템플릿 설치에 실패했습니다: :error',
'github_url_invalid' => '유효하지 않은 GitHub URL 형식입니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다.',
'github_download_failed' => 'GitHub에서 다운로드에 실패했습니다: :error',
'github_repo_not_found' => 'GitHub 저장소를 찾을 수 없습니다.',
'refresh_layouts_failed' => '레이아웃 갱신에 실패했습니다.',
'refresh_layouts_failed' => '레이아웃 갱신에 실패했습니다: :error',
'routes_not_found' => '라우트 파일을 찾을 수 없습니다.',
// 템플릿 엔진 에러 메시지
'no_active_template' => '활성화된 템플릿이 없습니다',
'layout_load_failed' => '레이아웃을 불러오는데 실패했습니다',
'component_load_failed' => '컴포넌트를 불러오는데 실패했습니다',
'translation_load_failed' => '다국어 파일을 불러오는데 실패했습니다',
'layout_load_failed' => '레이아웃을 불러오는데 실패했습니다: :error',
'component_load_failed' => '컴포넌트를 불러오는데 실패했습니다: :error',
'translation_load_failed' => '다국어 파일을 불러오는데 실패했습니다: :error',
'template_init_error' => '템플릿 엔진을 초기화하는 중 오류가 발생했습니다',
'contact_admin_for_template' => '시스템 관리자에게 문의하여 템플릿을 활성화해주세요.',
@@ -73,14 +74,14 @@ return [
// 업데이트 관련 에러
'operation_in_progress' => '템플릿 ":name"이(가) 현재 :status 상태입니다. 작업이 완료될 때까지 기다려 주세요.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다.',
'github_api_failed' => 'GitHub API 호출에 실패했습니다: :error',
'invalid_github_url' => '유효하지 않은 GitHub URL입니다.',
'zip_url_not_found' => 'ZIP 다운로드 URL을 찾을 수 없습니다.',
'download_failed' => '템플릿 ":template" :version 버전 다운로드에 실패했습니다.',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다.',
'download_failed' => '템플릿 ":template" :version 버전 다운로드에 실패했습니다: :error',
'zip_extract_failed' => 'ZIP 압축 해제에 실패했습니다: :error',
'extracted_dir_not_found' => '압축 해제된 디렉토리를 찾을 수 없습니다.',
'reload_failed' => '템플릿 다시 로드에 실패했습니다.',
'delete_directory_failed' => '템플릿 디렉토리 삭제에 실패했습니다.',
'reload_failed' => '템플릿 다시 로드에 실패했습니다: :error',
'delete_directory_failed' => '템플릿 디렉토리 삭제에 실패했습니다: :error',
'update_failed' => '템플릿 ":template" 업데이트에 실패했습니다: :error',
'invalid_layout_strategy' => '유효하지 않은 레이아웃 전략입니다. (overwrite 또는 keep만 허용)',
],
@@ -183,11 +184,13 @@ return [
],
'install_success' => '템플릿이 성공적으로 설치되었습니다.',
'install_failed' => '템플릿 설치에 실패했습니다.',
'install_failed' => '템플릿 설치에 실패했습니다: :error',
'preview_success' => 'manifest 미리보기를 완료했습니다.',
'preview_failed' => 'manifest 미리보기에 실패했습니다: :error',
'uninstall_success' => '템플릿이 성공적으로 제거되었습니다.',
'uninstall_failed' => '템플릿 제거에 실패했습니다.',
'uninstall_failed' => '템플릿 제거에 실패했습니다: :error',
'activate_success' => '템플릿이 활성화되었습니다.',
'activate_failed' => '템플릿 활성화에 실패했습니다.',
'activate_failed' => '템플릿 활성화에 실패했습니다: :error',
'activate_warning' => '템플릿 활성화를 위해 필요한 의존성이 충족되지 않았습니다.',
// 경고 메시지
@@ -196,27 +199,27 @@ return [
],
'deactivate_success' => '템플릿이 비활성화되었습니다.',
'deactivate_failed' => '템플릿 비활성화에 실패했습니다.',
'deactivate_failed' => '템플릿 비활성화에 실패했습니다: :error',
'fetch_success' => '템플릿 정보를 성공적으로 가져왔습니다.',
'license_not_found' => '템플릿 라이선스 파일을 찾을 수 없습니다.',
'refresh_layouts_success' => '템플릿 레이아웃이 성공적으로 갱신되었습니다.',
'refresh_layouts_failed' => '템플릿 레이아웃 갱신에 실패했습니다.',
'refresh_layouts_failed' => '템플릿 레이아웃 갱신에 실패했습니다: :error',
// 업데이트 관련 메시지
'update_success' => '템플릿 ":template"이(가) :version 버전으로 업데이트되었습니다.',
'update_failed' => '템플릿 업데이트에 실패했습니다: :error',
'update_hook_failed' => '템플릿 업데이트 훅 실행에 실패했습니다.',
'update_hook_failed' => '템플릿 업데이트 훅 실행에 실패했습니다: :error',
'no_update_available' => '업데이트할 내용이 없습니다.',
'check_updates_success' => '업데이트 확인이 완료되었습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다.',
'check_updates_failed' => '업데이트 확인에 실패했습니다: :error',
'not_installed' => '템플릿 ":template"이(가) 설치되지 않았습니다.',
'check_modified_layouts_success' => '수정된 레이아웃 확인이 완료되었습니다.',
'check_modified_layouts_failed' => '수정된 레이아웃 확인에 실패했습니다.',
'check_modified_layouts_failed' => '수정된 레이아웃 확인에 실패했습니다: :error',
// _pending 관련 메시지
'pending_not_found' => '설치 대기 목록에서 템플릿 ":template"을(를) 찾을 수 없습니다.',
'already_exists' => '템플릿 ":template"이(가) 이미 존재합니다.',
'move_failed' => '템플릿 ":template" 이동에 실패했습니다.',
'move_failed' => '템플릿 ":template" 이동에 실패했습니다: :error',
'commands' => [
'install' => [
-1
View File
@@ -26,7 +26,6 @@ return [
'update_failed' => '사용자 정보 업데이트에 실패했습니다: :error',
'delete_success' => '사용자가 성공적으로 삭제되었습니다.',
'delete_failed' => '사용자 삭제에 실패했습니다: :error',
'delete_admin_forbidden' => '관리자 계정은 삭제할 수 없습니다.',
'statistics_success' => '사용자 통계를 성공적으로 가져왔습니다.',
'statistics_failed' => '사용자 통계를 가져오는데 실패했습니다.',
'search_success' => '사용자 검색을 성공적으로 완료했습니다.',
+80
View File
@@ -701,10 +701,26 @@ return [
'google_analytics_id_max' => 'Google Analytics ID는 50자를 초과할 수 없습니다.',
'google_site_verification_max' => 'Google 사이트 확인 코드는 100자를 초과할 수 없습니다.',
'naver_site_verification_max' => '네이버 사이트 확인 코드는 100자를 초과할 수 없습니다.',
'generator_enabled_boolean' => 'Generator 태그 표시 설정은 true 또는 false 값이어야 합니다.',
'generator_content_string' => 'Generator 내용은 문자열이어야 합니다.',
'generator_content_max' => 'Generator 내용은 200자를 초과할 수 없습니다.',
'bot_user_agents_array' => '봇 User-Agent 목록은 배열이어야 합니다.',
'bot_user_agents_item_string' => '봇 User-Agent 항목은 문자열이어야 합니다.',
'bot_user_agents_item_max' => '봇 User-Agent 항목은 100자를 초과할 수 없습니다.',
'bot_detection_enabled_boolean' => '봇 감지 설정은 true 또는 false 값이어야 합니다.',
'bot_detection_library_enabled_boolean' => '봇 감지 라이브러리 설정은 true 또는 false 값이어야 합니다.',
'og_default_site_name_string' => 'OG 사이트 이름 기본값은 문자열이어야 합니다.',
'og_default_site_name_max' => 'OG 사이트 이름 기본값은 200자를 초과할 수 없습니다.',
'og_image_default_width_integer' => 'OG 이미지 기본 가로 크기는 정수여야 합니다.',
'og_image_default_width_min' => 'OG 이미지 기본 가로 크기는 0 이상이어야 합니다.',
'og_image_default_width_max' => 'OG 이미지 기본 가로 크기는 8000 이하이어야 합니다.',
'og_image_default_height_integer' => 'OG 이미지 기본 세로 크기는 정수여야 합니다.',
'og_image_default_height_min' => 'OG 이미지 기본 세로 크기는 0 이상이어야 합니다.',
'og_image_default_height_max' => 'OG 이미지 기본 세로 크기는 8000 이하이어야 합니다.',
'twitter_default_card_string' => 'Twitter 카드 기본값은 문자열이어야 합니다.',
'twitter_default_card_in' => 'Twitter 카드 기본값은 summary, summary_large_image, app, player 중 하나여야 합니다.',
'twitter_default_site_string' => 'Twitter 사이트 핸들은 문자열이어야 합니다.',
'twitter_default_site_max' => 'Twitter 사이트 핸들은 50자를 초과할 수 없습니다.',
'seo_cache_enabled_boolean' => 'SEO 캐시 설정은 true 또는 false 값이어야 합니다.',
'seo_cache_ttl_integer' => 'SEO 캐시 TTL은 정수여야 합니다.',
'seo_cache_ttl_min' => 'SEO 캐시 TTL은 최소 60초 이상이어야 합니다.',
@@ -814,6 +830,55 @@ return [
'websocket_server_port_max' => '웹소켓 서버 포트는 65535를 초과할 수 없습니다.',
'websocket_server_scheme_invalid' => '올바른 웹소켓 서버 프로토콜을 선택해주세요.',
'search_engine_driver_invalid' => '올바른 검색엔진 드라이버를 선택해주세요.',
// 본인인증(IDV) 설정
'identity_default_provider_string' => '기본 프로바이더는 문자열이어야 합니다.',
'identity_default_provider_max' => '기본 프로바이더 식별자는 100자를 초과할 수 없습니다.',
'identity_purpose_providers_array' => '목적별 프로바이더 매핑은 배열이어야 합니다.',
'identity_purpose_provider_string' => '목적별 프로바이더 식별자는 문자열이어야 합니다.',
'identity_purpose_provider_max' => '목적별 프로바이더 식별자는 100자를 초과할 수 없습니다.',
'identity_challenge_ttl_required' => 'Challenge 만료 시간을 입력해주세요.',
'identity_challenge_ttl_integer' => 'Challenge 만료 시간은 정수여야 합니다.',
'identity_challenge_ttl_min' => 'Challenge 만료 시간은 최소 1분 이상이어야 합니다.',
'identity_challenge_ttl_max' => 'Challenge 만료 시간은 최대 1440분(24시간)을 초과할 수 없습니다.',
'identity_max_attempts_required' => '최대 시도 횟수를 입력해주세요.',
'identity_max_attempts_integer' => '최대 시도 횟수는 정수여야 합니다.',
'identity_max_attempts_min' => '최대 시도 횟수는 최소 1회 이상이어야 합니다.',
'identity_max_attempts_max' => '최대 시도 횟수는 최대 20회를 초과할 수 없습니다.',
],
// 본인인증 정책 검증 메시지
'identity_policy' => [
'key_required' => '정책 키를 입력해주세요.',
'key_max' => '정책 키는 120자를 초과할 수 없습니다.',
'key_unique' => '이미 사용 중인 정책 키입니다.',
'scope_required' => 'Scope를 선택해주세요.',
'scope_invalid' => 'Scope는 route, hook, custom 중 하나여야 합니다.',
'target_required' => 'Target(라우트 또는 훅 이름)을 입력해주세요.',
'target_max' => 'Target은 255자를 초과할 수 없습니다.',
'purpose_required' => '인증 목적(Purpose)을 선택해주세요.',
'purpose_max' => '인증 목적은 64자를 초과할 수 없습니다.',
'provider_id_max' => '프로바이더 식별자는 64자를 초과할 수 없습니다.',
'grace_minutes_required' => 'Grace 시간(분)을 입력해주세요.',
'grace_minutes_integer' => 'Grace 시간은 정수여야 합니다.',
'grace_minutes_min' => 'Grace 시간은 0 이상이어야 합니다.',
'grace_minutes_max' => 'Grace 시간은 43200분(30일)을 초과할 수 없습니다.',
'enabled_boolean' => '활성화 값은 true 또는 false여야 합니다.',
'priority_integer' => '우선순위는 정수여야 합니다.',
'priority_min' => '우선순위는 0 이상이어야 합니다.',
'priority_max' => '우선순위는 65535를 초과할 수 없습니다.',
'conditions_array' => '조건(conditions)은 배열이어야 합니다.',
'applies_to_required' => '적용 대상을 선택해주세요.',
'applies_to_invalid' => '적용 대상은 self, admin, both 중 하나여야 합니다.',
'fail_mode_required' => '실패 모드를 선택해주세요.',
'fail_mode_invalid' => '실패 모드는 block 또는 log_only여야 합니다.',
],
// 본인인증 메시지 정의 검증 메시지
'identity_message' => [
'provider_not_registered' => '등록되지 않은 IDV 프로바이더입니다.',
'scope_value_not_admin_policy' => '운영자가 추가한 정책(source_type=admin)의 키와 일치해야 합니다.',
'definition_already_exists' => '동일 (provider, scope_type, scope_value) 정의가 이미 존재합니다.',
],
// 검증 속성명 (validation.attributes)
@@ -828,6 +893,21 @@ return [
'admin_email' => '관리자 이메일',
'timezone' => '시간대',
'language' => '기본 언어',
// 본인인증(IDV) 필드
'identity_default_provider' => '기본 프로바이더',
'identity_purpose_providers' => '목적별 프로바이더',
'identity_challenge_ttl_minutes' => 'Challenge 만료 시간',
'identity_max_attempts' => '최대 시도 횟수',
// 본인인증 정책 필드
'identity_policy_key' => '정책 키',
'identity_policy_scope' => 'Scope',
'identity_policy_target' => 'Target',
'identity_policy_purpose' => '인증 목적',
'identity_policy_provider_id' => '프로바이더',
'identity_policy_grace_minutes' => 'Grace 시간(분)',
'identity_policy_enabled' => '활성화',
'identity_policy_applies_to' => '적용 대상',
'identity_policy_fail_mode' => '실패 모드',
// 메일 설정 필드
'mailer' => '메일러',
'host' => 'SMTP 호스트',