'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.', ], ];