확장이 훅으로 등록한 카탈로그에서 고른 값은 그 확장이 사라져도 저장값으로 남는다. 그 상태에서 값만 보고 판정하면 이미 제공 불가한 항목이 사용자 화면에 그대로 노출된다. 예외도 경고도 로그도 남지 않아 관리자 화면과 나란히 보지 않으면 드러나지 않는다. - 결제수단에 지정한 PG, 현금영수증 발급사, 검색엔진 드라이버 세 축에 같은 판정을 적용. 공개 응답에서는 제거하고 관리자 응답에는 표시를 남긴다 — 운영자가 고쳐야 할 대상이라 감추면 복구 경로가 사라진다. 서버 검증도 같은 판정을 공유해 화면 우회 제출을 막는다. - 설정 단건 저장이 벌크 저장과 다른 경로를 타던 문제를 코어·이커머스·게시판에서 정리. 저장은 성공하고 파생 값만 갱신되지 않아 어느 화면에서 저장했느냐로 결과가 갈렸다. - 단건 저장의 값 형태 계약 신설. 빈 값으로 되돌릴 수 있게 하고, 타입은 defaults.json 의 기본값을 SSoT 로 삼는다. 해석 불가한 입력은 조용히 캐스팅하지 않고 거절한다. - 드라이버 셀렉트를 서버 카탈로그에 바인딩하고, 저장값이 카탈로그에 없으면 그 값을 드러내는 안내를 8곳 전수에 붙인다. 종전에는 빈 칸으로만 보여 무엇이 저장됐는지 알 수 없었다. 시나리오 매니페스트 8종을 면제 없이 신설했다. `audit:allow` 는 cross product 와 effects 검사를 함께 끄므로, 면제가 걸린 매니페스트에 선언을 추가하면 검증이 회복되지 않는다. 그 아래에서 대응 테스트가 없는 effect 이름 2건이 살아남아 있었고, 함께 정리했다.
203 lines
11 KiB
PHP
203 lines
11 KiB
PHP
<?php
|
|
|
|
return [
|
|
// Settings related messages
|
|
'fetch_success' => 'Settings retrieved successfully.',
|
|
'fetch_failed' => 'Failed to retrieve settings.',
|
|
'save_success' => 'Settings saved successfully.',
|
|
'save_failed' => 'Failed to save settings.',
|
|
'update_success' => 'Settings updated successfully.',
|
|
'update_failed' => 'Failed to update settings.',
|
|
'delete_success' => 'Settings deleted successfully.',
|
|
'delete_failed' => 'Failed to delete settings.',
|
|
'save_error' => 'An error occurred while saving settings.',
|
|
'update_error' => 'An error occurred while updating settings.',
|
|
'cache_clear_success' => 'Cache cleared successfully.',
|
|
'cache_clear_failed' => 'Failed to clear cache.',
|
|
'cache_clear_error' => 'An error occurred while clearing cache.',
|
|
'optimize_success' => 'System optimized successfully.',
|
|
'optimize_failed' => 'Failed to optimize system.',
|
|
'optimize_error' => 'An error occurred while optimizing system.',
|
|
'backup_success' => 'Database backup started successfully.',
|
|
'backup_failed' => 'Failed to start database backup.',
|
|
'backup_error' => 'An error occurred while backing up database.',
|
|
'backup_path_required' => 'Please enter a backup path.',
|
|
'restore_success' => 'Settings restored successfully.',
|
|
'restore_failed' => 'Failed to restore settings.',
|
|
'restore_error' => 'An error occurred while restoring settings.',
|
|
'save_individual_failed' => 'Settings save failed: :error',
|
|
|
|
// App key related messages
|
|
'invalid_password' => 'Password does not match.',
|
|
'password_required' => 'Please enter your password.',
|
|
'app_key_regenerated' => 'Application key has been successfully regenerated.',
|
|
'app_key_regenerate_failed' => 'Failed to regenerate application key.',
|
|
'app_key_regenerate_warning' => 'Regenerating the key will invalidate all sessions. Do you want to continue?',
|
|
|
|
// System info related
|
|
'seconds' => 's',
|
|
|
|
// Driver labels (resolved per active language pack by DriverRegistryService)
|
|
'drivers' => [
|
|
'storage' => [
|
|
'local' => 'Local',
|
|
's3' => 'Amazon S3',
|
|
],
|
|
'public_asset' => [
|
|
'none' => 'Disabled (streaming)',
|
|
'public' => 'Public disk',
|
|
'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)',
|
|
],
|
|
'search' => [
|
|
'mysql-fulltext' => 'MySQL Full-Text',
|
|
],
|
|
],
|
|
|
|
// Driver connection test messages
|
|
'driver_test_success' => 'All driver connection tests passed.',
|
|
'driver_test_partial' => 'Some driver connection tests failed.',
|
|
'driver_test_error' => 'An error occurred while testing driver connections.',
|
|
'unknown_driver' => 'Unknown driver.',
|
|
|
|
// S3 test messages
|
|
's3_test_success' => 'Successfully connected to S3 bucket.',
|
|
's3_test_failed' => 'Failed to connect to S3 bucket.',
|
|
's3_missing_config' => 'S3 configuration is missing. (bucket, region, access key, secret key)',
|
|
's3_sdk_missing' => 'AWS SDK is not installed.',
|
|
's3_adapter_missing' => 'S3 storage adapter (league/flysystem-aws-s3-v3) is not installed.',
|
|
's3_bucket_not_found' => 'S3 bucket not found.',
|
|
's3_access_denied' => 'Access to S3 bucket was denied.',
|
|
's3_invalid_credentials' => 'S3 credentials are invalid.',
|
|
|
|
// Redis test messages
|
|
'redis_test_success' => 'Successfully connected to Redis server.',
|
|
'redis_test_failed' => 'Failed to connect to Redis server.',
|
|
'redis_extension_missing' => 'Redis PHP extension is not installed.',
|
|
'redis_connection_failed' => 'Could not connect to Redis server.',
|
|
'redis_auth_failed' => 'Redis authentication failed.',
|
|
'redis_ping_failed' => 'No response from Redis PING.',
|
|
|
|
// Memcached test messages
|
|
'memcached_test_success' => 'Successfully connected to Memcached server.',
|
|
'memcached_test_failed' => 'Failed to connect to Memcached server.',
|
|
'memcached_extension_missing' => 'Memcached PHP extension is not installed.',
|
|
'memcached_connection_failed' => 'Could not connect to Memcached server.',
|
|
|
|
// Websocket test messages
|
|
'websocket_test_success' => 'Successfully connected to Websocket server.',
|
|
'websocket_test_failed' => 'Failed to connect to Websocket server.',
|
|
'websocket_server_test_failed' => 'Failed to connect to the Websocket server-side (backend broadcast) endpoint. The client endpoint is reachable.',
|
|
'driver_unusable_s3_adapter' => 'S3 storage adapter (league/flysystem-aws-s3-v3) is not installed.',
|
|
'driver_unusable_redis_client' => 'Neither the phpredis extension nor the predis library is available.',
|
|
'driver_unusable_memcached_extension' => 'The memcached PHP extension is not installed.',
|
|
'websocket_invalid_host' => 'The Websocket host setting is invalid. Enter the address only — credentials (@) and protocols other than http/https are not allowed.',
|
|
'websocket_connection_refused' => 'Could not connect to Websocket server. Please check if the server is running.',
|
|
|
|
// Test mail related messages
|
|
'invalid_email' => 'Invalid email address.',
|
|
'test_mail_subject' => ':app_name Test Mail',
|
|
'test_mail_body' => 'This is a test email from Gnuboard7. If you received this email, your mail settings are configured correctly.',
|
|
'test_mail_sent' => 'Test email sent successfully.',
|
|
'test_mail_failed' => 'Failed to send test email.',
|
|
'test_mail_error' => 'An error occurred while sending the test email.',
|
|
|
|
// Core update related messages
|
|
'core_update' => [
|
|
'check_success' => 'Update check completed.',
|
|
'check_failed' => 'Update check failed.',
|
|
'update_available' => 'A new update is available.',
|
|
'no_update' => 'You are on the latest version.',
|
|
'maintenance_mode_active' => 'System is under maintenance. Please try again later.',
|
|
'invalid_github_url' => 'Invalid GitHub repository URL.',
|
|
'download_failed' => 'Failed to download version :version.',
|
|
'zip_extract_failed' => 'Failed to extract ZIP file.',
|
|
'invalid_package' => 'Downloaded package is invalid.',
|
|
'invalid_package_not_g7' => 'The specified directory is not a Gnuboard7 project. config/app.php file with version setting is required.',
|
|
'composer_failed' => 'composer install failed.',
|
|
'pending_path_create_failed' => 'Failed to create pending directory (:path): :error',
|
|
'pending_path_not_writable' => 'Pending directory (:path) is not writable.',
|
|
'downloading' => 'Downloading update...',
|
|
'extracting' => 'Extracting...',
|
|
'validating' => 'Validating package...',
|
|
'running_composer' => 'Running composer install...',
|
|
'step_check' => 'Checking for updates...',
|
|
'step_validate_pending' => 'Validating environment...',
|
|
'step_maintenance' => 'Enabling maintenance mode...',
|
|
'step_download' => 'Downloading...',
|
|
'step_backup' => 'Creating backup...',
|
|
'step_apply' => 'Applying files...',
|
|
'step_composer' => 'Running composer install...',
|
|
'step_migration' => 'Running migrations...',
|
|
'step_upgrade' => 'Running upgrade steps...',
|
|
'step_composer_prod' => 'Running composer install in production directory...',
|
|
'step_cleanup' => 'Cleaning up...',
|
|
|
|
// File apply mode summary (Step 7)
|
|
'apply_mode_incremental' => 'File apply: only files actually changed by the core were applied (:added new, :changed changed). All other files were left untouched as-is.',
|
|
'apply_mode_incremental_prune_hint' => 'To also remove files deleted in the new version, re-run with the `--prune` option or use `php artisan hotfix:rollback-stale-files --prune`.',
|
|
'apply_mode_prune' => 'File apply: full overwrite plus cleanup of removed files was performed (--prune).',
|
|
'apply_mode_fallback' => 'File apply: no backup available, so incremental apply was skipped and a full overwrite was performed. To preserve custom files, keep the backup enabled on future updates.',
|
|
|
|
// GitHub API error messages
|
|
'github_url_not_configured' => 'GitHub repository URL is not configured.',
|
|
'github_api_failed' => 'Unable to connect to GitHub API.',
|
|
'github_token_required' => 'This is a private repository. Please configure a GitHub access token.',
|
|
'github_token_invalid' => 'GitHub access token is invalid or has insufficient permissions. (HTTP :status — :message)',
|
|
'github_repo_not_found' => 'GitHub repository not found. (HTTP :status — :message)',
|
|
'github_repo_not_found_no_token' => 'GitHub repository not found. If the repository is private, please configure an access token. (HTTP :status — :message)',
|
|
'github_api_error' => 'GitHub API error occurred. (HTTP :status — :message)',
|
|
'no_releases_found' => 'No releases found in the GitHub repository. (HTTP :status — :message)',
|
|
|
|
// Log messages
|
|
'log_api_call_failed' => 'Core update: GitHub API call failed',
|
|
'log_auth_failed' => 'Core update: GitHub authentication failed',
|
|
'log_not_found' => 'Core update: GitHub repository/release not found',
|
|
'log_unexpected_status' => 'Core update: Unexpected HTTP status code',
|
|
'log_version_check_error' => 'Core update: Error checking latest version',
|
|
|
|
'unknown_error' => 'An unknown error occurred.',
|
|
|
|
// System requirements
|
|
'system_requirements_failed' => 'System requirements are not met:',
|
|
'no_extract_method_available' => 'No archive extraction method available. Requires one of: PHP zip extension (ZipArchive) or unzip command (Linux). You can also use the --source option for manual update.',
|
|
'manual_update_guide' => 'Manual update: Download the release ZIP from GitHub, extract it, then run: php artisan core:update --source=/path/to/extracted',
|
|
|
|
// Extraction fallback chain
|
|
'archive_url_not_found' => ':type archive URL not found. Trying next method.',
|
|
'extracting_with' => 'Extracting with :method...',
|
|
'extract_empty' => 'Extracted directory is empty.',
|
|
'extract_fallback' => ':method failed: :error — Trying next method.',
|
|
'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',
|
|
],
|
|
];
|